MyBatis一对多双向关联——MyBatis学习笔记之七
处理has-one关系需要用到association元素,而处理has many关系则需要用到collection元素。例如本例中,假设一 名教师可同时指导多名学生,下面就来介绍如何使用collection元素来实现这种映射,具体的任务是查询出教师及其指导的多个学生的信息(本示例源代 码下载页面:http://down.51cto.com/data/490947)。
一、为Teacher实体增加相关属性
为教师实体增加指导学生集合的属性如下:
private List<Student> supStudents;//指导学生
并为其增加setter和getter方法,这里略过。
二、TeacherMapper接口
为实现教师实体映射,应先创建映射器接口如下:
package com.abc.mapper; import com.abc.domain.Teacher; public interface TeacherMapper {public Teacher getById(int id); }
三、映射文件
为教师实体创建的映射文件如下:
<?xml version="1.0" encoding="utf8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--与以前一样,namespace的值是对应的映射器接口的完整名称--> <mapper namespace="com.abc.mapper.TeacherMapper"> <!--TeacherMapper接口中getById方法对应的SQL语句。 查询教师及其指导的学生的信息。由于教师、学生都有 id、name、gender等属性,因此给教师的字段都起了别名--> <select id="getById" parameterType="int" resultMap="supervisorResultMap"> select t.id t_id, t.name t_name, t.gender t_gender, t.research_area t_research_area, t.title t_title, s.id,s.name, s.gender,s.major,s.grade from teacher t,student s where t.id=#{id} and s.supervisor_id = t.id </select> <!--教师实体映射--> <resultMap id="supervisorResultMap" type="Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> <result property="gender" column="t_gender"/> <result property="researchArea" column="t_research_area"/> <result property="title" column="t_title"/> <!--collection元素映射教师的指导学生集合的属性。resultMap 以命名空间名.resultMap的id的形式,引用studentResultMap。 需要注意的是,上面的select语句中学生的字段名/别名应与 studentResultMap中的column属性一致--> <collection property="supStudents" resultMap="com.abc.mapper.StudentMapper.studentResultMap"/> </resultMap> </mapper>
相应地,学生实体的映射文件如下:
<?xml version="1.0" encoding="utf8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.abc.mapper.StudentMapper"> <resultMap id="studentResultMap" type="Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="gender" column="gender"/> <result property="major" column="major"/> <result property="grade" column="grade"/> <!--相应地,在此引用supervisorResultMap,亦采用 命名空间名.resultMap的id的形式。--> <association property="supervisor" resultMap="com.abc.mapper.TeacherMapper.supervisorResultMap"/> </resultMap> </mapper>
在工程的src\resources目录下新建子目录mappers,用来统一存放映射文件。为了能让MyBatis找到这些映射文件,修改其核心配置文件configuration.xml中的mappers元素如下:
<!--在classpath中以相对路径的形式引用映射文件--> <mappers> <mapper resource="resources/mappers/StudentMapper.xml"/> <mapper resource="resources/mappers/TeacherMapper.xml"/> </mappers>
注意:resources目录在工程编译前会被复制到classes目录下(详见工程生成文件build.xml中的copy-resources和compile这两个target),而classes目录会被ant添加到classpath中。
四、执行类
执行类为CollectionDemo,其内容如下:
package com.demo;
import org.springframework.context.ApplicationContext;
import com.abc.mapper.StudentMapper;
import com.abc.mapper.TeacherMapper;
import com.abc.domain.Teacher;
import com.abc.domain.Student;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class CollectionDemo
{
private static ApplicationContext ctx;
static
{
//在类路径下寻找resources/beans.xml文件
ctx = new ClassPathXmlApplicationContext("resources/beans.xml");
}
public static void main(String[] args)
{
//从Spring容器中请求映射器
TeacherMapper mapper =
(TeacherMapper)ctx.getBean("teacherMapper");
//查询id为1的教师
Teacher teacher = mapper.getById(1);
if(teacher == null)
{
System.out.println("未找到相关教师信息。");
}
else
{
//教师信息
System.out.println("**********************************************");
System.out.println("教师姓名:" + " " + teacher.getName());
System.out.println("教师职称:" + " " + teacher.getTitle());
System.out.println("**********************************************");
System.out.println("指导学生信息:");
//遍历指导的学生
for(Student s : teacher.getSupStudents())
{
System.out.println("**********************************************");
System.out.println( s.getName() + " " + s.getGender() + " " + s.getGrade()
+ " " + s.getMajor());
//从学生端访问教师
System.out.println("指导教师研究方向:" + s.getSupervisor().getResearchArea());
}
System.out.println("**********************************************");
}
}
}
从中可看出,可以从任意一端访问另一端的对象。
五、修改build.xml
为了能用ant运行此程序,需修改build.xml中的run target,指定类CollectionDemo为执行类。如下:
<target name="run" depends="compile"> <!--指定CollectionDemo为要运行的类--> <java fork="true" classname="com.demo.CollectionDemo" classpathref="library"> <!--把classes目录添加到工程的classpath中。 ${targetdir}是指引用上面定义的property元素targetdir--> <classpath path="${targetdir}"/> </java> </target>
运行结果如下:
MyBatis一对多双向关联——MyBatis学习笔记之七相关推荐
- jpa级联添加_JPA中的一对多双向关联与级联操作
学习Spring有两周时间了 , 个人觉得服务端主要实现的是数据关系的维护和数据结构的制定 , 以及由业务需求产生的CRUD , 只要保证对前端提供的接口稳定高效响应 , 具体的前端实现完全不关心. ...
- Hibernate(九)一对多双向关联映射
上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...
- Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射
在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...
- hibernate的一对多双向关联映射----客户和订单关系
客户和订单关系:客户是一的一方,订单是多的一方. customer表: CREATE TABLE `customer` ( `ID` int(4) NOT NULL AUTO_INCREMENT , ...
- hibernate的映射之二(一对多双向关联)
hibernate的一对多双关联 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 hihernate一对多关联映射(双向Dept<----->Emp) 一对多双 ...
- 黑马程序员视频教程学习mybatis框架常用注释SQL语句学习笔记?
mybatis学习笔记 常用注释增删改查SQL语句 常用注释拓展SQL语句 解决实体类属性和数据库表中的属性名称不相同的问题: mybatis注解之一对一查询: mybatis注解之一对多查询: my ...
- activiti7关联mysql_学习笔记:一个MySQL实例有多个Activiti数据库问题
学习笔记:一个MySQL实例有多个Activiti数据库问题 使用SpringBoot + activiti6 搭建审批流项目,数据库使用的是MySQL.且我的数据库下存在多个activiti相关的数 ...
- Unity3D学习笔记之七创建自己的游戏场景
到现在为止我们已经拥有了比较完备的Prefab,已经可以创建宏大的游戏场景,并以第一人称视角在场景中漫游了.这里给大家做个小的示范,建一个小场景大家在创建场景的时候需要自由发挥,做个尽量大的场景出来. ...
- 《Spring+Spring MVC+MyBatis从零开始学》傻瓜式学习笔记
前言:买这本书主要是为了学MyBatis.所以着重记一下第六章以及后面的. 目的:学习大量开发知识,早日跳槽去更好的单位.[2019年09月02日] 错误更改:第六章 6.2.3 第73页 示例6-4 ...
最新文章
- [CF816B] Karen and Coffee(前缀和,思维)
- 龙将加速浏览器_《看门狗:军团》即将开启预载,迅游加速器支持下载和联机加速 18183手机游戏网...
- language dropdown list - filter logic
- 腾讯人均月薪8万!第一季度财报发布:微信月活数恐怖,游戏平均日赚4亿
- Python 字符串(一)
- 可解释性系列论文:Mathematics of Deep Learning
- Oracle学习之DATAGUARD(八) Switchover与failover
- 做了一个阿里云MQTT单片机编程小工具
- osu计算机科学硕士,OSU的CSE「俄亥俄州立大学计算机科学与工程系」
- mysql - rank函数的使用
- 使用软碟通做启动盘给电脑装系统时如何分区
- ios直播开发基础,推流协议及流程
- 3dvary灯光材质为什么不亮_3dmax灯光教程灯光打出来太假?不真实?杂点?曝光?原因都在这儿呢...
- Python小姿势 - Python爬虫:如何使用Python实现网页爬虫
- Matrixdb添加mirror
- android launcher 4x5应用排列,修改华为刷机包桌面应用图标布局排序的方法
- PCLVisualizer
- MonoRail学习笔记十五:文件上传
- html5显示状态灯,如何使用css3+html5来制作文字霓虹灯效果
- 基于arduino的ESP32 学习笔记(六)LVGL文件系统移植,中文字库和图片显示