MyBatis学习(二)之双向一对多关联映射查询
2017-06-19 19:19
471 查看
关于MyBatis中的一对多关联映射也是比较重要、常用的映射关系,在关联方式上跟一对一的方式也是类似的,嵌套resultMap和嵌套select,我在《MyBatis之一对一关联映射》一文中已经详细介绍了,本篇将以嵌套resultMap的方式进行展示双向一对多关联映射查询的用法
1.环境准备:
还是使用上文中的Classes类,另创建Student类{id,name},一个班级Classes中包含多个学生Student
[java]
view plain
copy
public class Student {
private int id;
private String name;
//...省略get、set方法
}
创建IClasses接口,定义方法:
[java]
view plain
copy
public interface IClassesDao {
//根据Id查询班级
Classes selectClassesById(@Param("id")int id);
}
2.为Student类添加Classes属性:
[java]
view plain
copy
private Classes classes;//省略get、set
为Classes类添加Set<Student>属性(或者List<Student>)
[java]
view plain
copy
private Set<Student> students;//省略get、set
3.创建ClassMapper.xml文件,作以下配置:
[html]
view plain
copy
<mapper namespace="com.wzj.dao.IClassesDao">
<resultMap type="com.wzj.entity.Classes" id="classesMap">
<id property="id" column="c_id" />
<result property="name" column="c_name" />
<!--
映射Student集合,使用collection元素
property:集合的字段名称
javaType:集合的类型
ofType:用来表示集合中的对象的类型的完整名称或者别名
resultMap:指向Student映射文件中的Student映射
-->
<collection property="students" javaType="java.util.Set"
ofType="com.wzj.entity.Student" resultMap="com.wzj.dao.IStudentDao.studentMap" />
</resultMap>
<select id="selectClassesById" resultMap="classesMap">
select * from classes
c,student s where c.c_id=s.classes_id and c.c_id=#{id}
</select>
</mapper>
sql语句将两张表关联的数据全部查询出来,然后在映射结果中使用collection元素把Student对象的映射指向到com.wzj.dao.IStudentDao中的映射
4.创建StudentMappper.xml文件,作以下配置:
[html]
view plain
copy
<mapper namespace="com.wzj.dao.IStudentDao">
<resultMap type="com.wzj.entity.Student" id="studentMap">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
<association property="classes" column="classes_id" resultMap="com.wzj.dao.IClassesDao.classesMap"/>
</resultMap>
</mapper>
在“N”的一方表示关联对象时,仍然是使用association元素,column的值是Student表中的外键列名,resultMap将Classes的映射再次指向了com.wzj.dao.IClassesDao中的映射。
5.创建测试类,运行:
[java]
view plain
copy
public static void main(String[] args) {
SqlSession session=MybatisUtil.currentSqlSession();
IClassesDao dao=session.getMapper(IClassesDao.class);
Classes c=dao.selectClassesById(1);
Set<Student> list=c.getStudents();
System.out.println("班级:"+c.getName());
for (Student student : list) {
System.out.println(student.getName()+"\t"+(student.getClasses()==c));
}
session.commit();
MybatisUtil.closeSqlSession();
}
输出结果:
班级:class-1
王五 true
张三 true
由此可以看出,Classes中的每个Student对象所引用的Classes对象依然指向了查询到的对象c,说明两者是同一个对象。
双向一对多的映射方式就介绍到这里,里面的东西还是蛮绕的,不是很好理解,而且里面的东西也很灵活,还是要多练。
1.环境准备:
还是使用上文中的Classes类,另创建Student类{id,name},一个班级Classes中包含多个学生Student
[java]
view plain
copy
public class Student {
private int id;
private String name;
//...省略get、set方法
}
创建IClasses接口,定义方法:
[java]
view plain
copy
public interface IClassesDao {
//根据Id查询班级
Classes selectClassesById(@Param("id")int id);
}
2.为Student类添加Classes属性:
[java]
view plain
copy
private Classes classes;//省略get、set
为Classes类添加Set<Student>属性(或者List<Student>)
[java]
view plain
copy
private Set<Student> students;//省略get、set
3.创建ClassMapper.xml文件,作以下配置:
[html]
view plain
copy
<mapper namespace="com.wzj.dao.IClassesDao">
<resultMap type="com.wzj.entity.Classes" id="classesMap">
<id property="id" column="c_id" />
<result property="name" column="c_name" />
<!--
映射Student集合,使用collection元素
property:集合的字段名称
javaType:集合的类型
ofType:用来表示集合中的对象的类型的完整名称或者别名
resultMap:指向Student映射文件中的Student映射
-->
<collection property="students" javaType="java.util.Set"
ofType="com.wzj.entity.Student" resultMap="com.wzj.dao.IStudentDao.studentMap" />
</resultMap>
<select id="selectClassesById" resultMap="classesMap">
select * from classes
c,student s where c.c_id=s.classes_id and c.c_id=#{id}
</select>
</mapper>
sql语句将两张表关联的数据全部查询出来,然后在映射结果中使用collection元素把Student对象的映射指向到com.wzj.dao.IStudentDao中的映射
4.创建StudentMappper.xml文件,作以下配置:
[html]
view plain
copy
<mapper namespace="com.wzj.dao.IStudentDao">
<resultMap type="com.wzj.entity.Student" id="studentMap">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
<association property="classes" column="classes_id" resultMap="com.wzj.dao.IClassesDao.classesMap"/>
</resultMap>
</mapper>
在“N”的一方表示关联对象时,仍然是使用association元素,column的值是Student表中的外键列名,resultMap将Classes的映射再次指向了com.wzj.dao.IClassesDao中的映射。
5.创建测试类,运行:
[java]
view plain
copy
public static void main(String[] args) {
SqlSession session=MybatisUtil.currentSqlSession();
IClassesDao dao=session.getMapper(IClassesDao.class);
Classes c=dao.selectClassesById(1);
Set<Student> list=c.getStudents();
System.out.println("班级:"+c.getName());
for (Student student : list) {
System.out.println(student.getName()+"\t"+(student.getClasses()==c));
}
session.commit();
MybatisUtil.closeSqlSession();
}
输出结果:
班级:class-1
王五 true
张三 true
由此可以看出,Classes中的每个Student对象所引用的Classes对象依然指向了查询到的对象c,说明两者是同一个对象。
双向一对多的映射方式就介绍到这里,里面的东西还是蛮绕的,不是很好理解,而且里面的东西也很灵活,还是要多练。
相关文章推荐
- MyBatis学习(二)之双向一对多关联映射查询
- MyBatis学习(一)之一对一关联映射查询
- MyBatis的学习总结三——输入映射和输出映射以及多表关联查询
- MyBatis学习总结(五)——实现关联表查询
- mybatis学习之多表关联查询和resultmap的常用标签和属性 和分页查询
- MyBatis学习总结(五)——实现关联表查询
- Mybatis学习总结之一对一关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis学习总结(五)——实现关联表查询
- MyBatis 学习总结(五)—— 一对一关联表查询
- MyBatis学习总结——实现关联表查询(转)
- 关联查询---Mybatis学习笔记(九)
- Mybatis学习(07)-高级映射之一对一查询
- Mybatis学习(09)-高级映射之多对多查询
- MyBatis学习_2_关联映射_一对一
- MyBatis的学习总结四:实现关联表查询【参考】
- mybatis学习笔记三(实现关联数据的查询)
- 【HIbernate框架学习】:Hibernate对象关系映射之双向一对多关联映射
- MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
- 【MyBatis学习笔记】系列之一:MyBatis多对多双向关联