关于MyBatis中的一对多关联映射也是比较重要、常用的映射关系,在关联方式上跟一对一的方式也是类似的,嵌套resultMap和嵌套select,我在《
MyBatis之一对一关联映射》一文中已经详细介绍了,本篇将以嵌套resultMap的方式进行展示双向一对多关联映射查询的用法
创建IClasses接口,定义方法:
2.为Student类添加Classes属性:
为Classes类添加Set<Student>属性(或者List<Student>)
3.创建ClassMapper.xml文件,作以下配置:
在“N”的一方表示关联对象时,仍然是使用
association元素,column的值是Student表中的
外键列名,resultMap将Classes的映射再次指向了
com.wzj.dao.IClassesDao中的映射。
输出结果:
1.环境准备:
还是使用上文中的Classes类,另创建Student类{id,name},一个班级Classes中包含多个学生Student
- public class Student {
- private int id;
- private String name;
- //...省略get、set方法
- }
- public interface IClassesDao {
- //根据Id查询班级
- Classes selectClassesById(@Param("id")int id);
- }
- private Classes classes;//省略get、set
- private Set<Student> students;//省略get、set
- <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文件,作以下配置:
- <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>
5.创建测试类,运行:
- 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,说明两者是同一个对象。
双向一对多的映射方式就介绍到这里,里面的东西还是蛮绕的,不是很好理解,而且里面的东西也很灵活,还是要多练。