您的位置:首页 > 其它

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,说明两者是同一个对象。          

双向一对多的映射方式就介绍到这里,里面的东西还是蛮绕的,不是很好理解,而且里面的东西也很灵活,还是要多练。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: