zoukankan      html  css  js  c++  java
  • MyBatis(四)映射文件 之 一对多映射查询

    一、一对多映射关系

      POJO 中的属性可能会是一个对象的集合,当我们查询一方的信息时,还想要知道多方的信息,就需要用到一对多查询。(如:查询部门信息,同时查询部门中的员工信息)
      使用 collection 标签来定义对象的封装规则。
      两个 JavaBean 类:
      Employee 类
    public class Employee {
        private Integer id;
        private String lastName;
        private String gender;
        private String email;
        private Department department;
        //省略了 get/set 方法和构造器
    }
      Department 类
    public class Department {
        private Integer id;
        private String deptName;
        private List<Employee> emps;
        //省略了 get/set 方法和构造器
    }
      当我们想要获取部门信息同时还要获取其部门下的员工信息,这是一个一对多的关系,我们就可以使用下面的几种方式来实现。
     

    二、使用 Collection 标签查询

      在 Department 接口中声明方法:

    //根据id查询部门及其员工信息
    public Department getDeptByIdPlus(Integer id);

      在对应的 mapper.xml 中配置:

        <!--
            collection 嵌套结果集的方法,定义关联的集合类型元素的封装规则
    
            嵌套结果集的方式,使用 collection 标签定义关联的集合类型的属性封装规则
        -->
        <resultMap id="MyDept" type="com.njf.mybatis.bean.Department">
            <id column="did" property="id" />
            <result column="dept_name" property="deptName"/>
            <!--
                collection 定义关联集合类型的属性的封装规则
                ofType:指定集合里面元素的类型
            -->
            <collection property="emps" ofType="com.njf.mybatis.bean.Employee">
                <id column="eid" property="id"/>
                <result column="last_name" property="lastName" />
                <result column="email" property="email" />
                <result column="gender" property="gender" />
            </collection>
        </resultMap>
    <!-- public Department getDeptByIdPlus(Integer id); --> <select id="getDeptByIdPlus" resultMap="MyDept"> SELECT d.id did,d.`dept_name` dept_name, e.id eid, e.`last_name` last_name, e.`email` email, e.`gender` gender FROM tbl_department d LEFT JOIN tbl_employee e ON d.`id` = e.`dept_id` WHERE d.`id` = #{id}; </select>

      说明:

    collection 嵌套结果集的方法,定义关联的集合类型元素的封装规则
    property 对应的属性值
    ofType:指定集合里面元素的类型
    

      

    三、使用 Collection 实现分步查询

      实际的开发中,对于每个实体类都应该有具体的增删改查方法,也就是DAO层, 因此
      对于查询部门信息并且将对应的所有的员工信息也查询出来的需求,就可以通过分步的方式完成查询。
        ① 先通过部门的 id 查询部门信息
        ② 再通过部门的 id 作为员工的 外键查询对应的部门信息
      在 EmployeeMapper 接口中声明方法:
    //根据部门id查询员工
    public List<Employee> getEmpsByDeptId(Integer deptId);
      在对应的 mapper.xml中进行配置:
        <!--
            public List<Employee> getEmpsByDeptId(Integer id);
         -->
        <select id="getEmpsByDeptId" resultType="Employee">
            select * from tbl_employee where dept_id=#{deptId}
        </select>
     
      在 DepartmentMapper 接口中声明方法:
    public Department getDeptByIdStep(Integer id);
      在对应的mapper.xml 中进行配置:
     
        <!--
            collection 嵌套结果集的方法,定义关联的集合类型元素的封装规则
            collection 分段查询
            延迟加载
        -->
        <resultMap id="MyDeptStep" type="com.njf.mybatis.bean.Department">
            <id column="id" property="id" />
            <result column="dept_name" property="deptName"/>
            <!--
                collection 定义关联集合类型的属性的封装规则
                ofType:指定集合里面元素的类型
            -->
            <collection property="emps"
                        select="com.njf.mybatis.dao.EmployeeMapperPlus.getEmpsByDeptId"
                        column="id">
    
            </collection>
        </resultMap>
        <!--
            public Department getDeptByIdStep(Integer id);
         -->
        <select id="getDeptByIdStep" resultMap="MyDeptStep">
            select id, dept_name deptName from tbl_department where id = #{id}
        </select>

    四、使用 Collection 延迟加载

      设置同 association 的延迟加载

  • 相关阅读:
    LibreOJ 6282 数列分块入门 6(在线插入在线查询)
    LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)
    LibreOJ 6280 数列分块入门 4(分块区间加区间求和)
    LibreOJ 6279 数列分块入门 3(分块+排序)
    LibreOJ 6278 数列分块入门 2(分块)
    LibreOJ 6277 数列分块入门 1(分块)
    BZOJ 2301 Problem b(莫比乌斯反演+分块优化)
    MD5Untils加密工具类
    20160418javaweb之 Filter过滤器
    20160417javaweb之servlet监听器
  • 原文地址:https://www.cnblogs.com/niujifei/p/15238896.html
Copyright © 2011-2022 走看看