MyBatis学习(二)之双向一对多关联映射查询

关于MyBatis中的一对多关联映射也是比较重要、常用的映射关系,在关联方式上跟一对一的方式也是类似的,嵌套resultMap和嵌套select,我在《 MyBatis之一对一关联映射》一文中已经详细介绍了,本篇将以嵌套resultMap的方式进行展示双向一对多关联映射查询的用法

        1.环境准备

还是使用上文中的Classes类,另创建Student类{id,name},一个班级Classes中包含多个学生Student

  1. public class Student {  
  2.     private int id;  
  3.     private String name;  
  4.     //...省略get、set方法  
  5. }  
                    创建IClasses接口,定义方法:
  1. public interface IClassesDao {  
  2.     //根据Id查询班级  
  3.     Classes selectClassesById(@Param("id")int id);  
  4. }  
          2.为Student类添加Classes属性:
  1. private Classes classes;//省略get、set  
            为Classes类添加Set<Student>属性(或者List<Student>)
  1. private Set<Student> students;//省略get、set  
          3.创建ClassMapper.xml文件,作以下配置:
  1. <mapper namespace="com.wzj.dao.IClassesDao">  
  2.     <resultMap type="com.wzj.entity.Classes" id="classesMap">  
  3.         <id property="id" column="c_id" />  
  4.         <result property="name" column="c_name" />  
  5.         <!--   
  6.             映射Student集合,使用collection元素   
  7.             property:集合的字段名称   
  8.             javaType:集合的类型   
  9.             ofType:用来表示集合中的对象的类型的完整名称或者别名  
  10.             resultMap:指向Student映射文件中的Student映射  
  11.              -->  
  12.         <collection property="students" javaType="java.util.Set"  
  13.             ofType="com.wzj.entity.Student" resultMap="com.wzj.dao.IStudentDao.studentMap" />  
  14.     </resultMap>  
  15.       
  16.     <select id="selectClassesById" resultMap="classesMap">  
  17.         select * from classes  
  18.         c,student s where c.c_id=s.classes_id and c.c_id=#{id}  
  19.     </select>  
  20. </mapper>  

        sql语句将两张表关联的数据全部查询出来,然后在映射结果中使用collection元素把Student对象的映射指向到com.wzj.dao.IStudentDao中的映射

        4.创建StudentMappper.xml文件,作以下配置:

  1. <mapper namespace="com.wzj.dao.IStudentDao">  
  2.     <resultMap type="com.wzj.entity.Student" id="studentMap">  
  3.         <id property="id" column="s_id"/>  
  4.         <result property="name" column="s_name"/>  
  5.         <association property="classes" column="classes_id" resultMap="com.wzj.dao.IClassesDao.classesMap"/>  
  6.     </resultMap>  
  7. </mapper>  
在“N”的一方表示关联对象时,仍然是使用 association元素,column的值是Student表中的 外键列名,resultMap将Classes的映射再次指向了 com.wzj.dao.IClassesDao中的映射。

          5.创建测试类,运行:

  1. public static void main(String[] args) {  
  2.         SqlSession session=MybatisUtil.currentSqlSession();  
  3.   
  4.         IClassesDao dao=session.getMapper(IClassesDao.class);  
  5.         Classes c=dao.selectClassesById(1);  
  6.         Set<Student> list=c.getStudents();  
  7.         System.out.println("班级:"+c.getName());  
  8.         for (Student student : list) {  
  9.             System.out.println(student.getName()+"\t"+(student.getClasses()==c));  
  10.         }  
  11.           
  12.         session.commit();  
  13.         MybatisUtil.closeSqlSession();  
  14.     }  
输出结果:

班级:class-1
王五 true
张三 true

由此可以看出,Classes中的每个Student对象所引用的Classes对象依然指向了查询到的对象c,说明两者是同一个对象。          

双向一对多的映射方式就介绍到这里,里面的东西还是蛮绕的,不是很好理解,而且里面的东西也很灵活,还是要多练。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值