MyBatis的对象关系映射---一对多等值连接策略★★★★★

在实际开发中,一个业务可能涉及到多个数据表的查询,那么多表查询就涉及连接查询(等值连接), 等值连接 表与表之间有一个外键关键,但是程序中最终获取的表封装的对象, 对象与对象之间是没有外键关系的,对象和对象之间只有依赖关系;

 对象之间关系主要是四种:

一对一 关系
一个人对应身份证id,一个QQ号对应一个QQ空间

一对多 关系

一个部门对应多个员工

多对一 关系

多个员工对应一个部门

多对多 关系

多个学生对应多个老师,多个学生对应多个课程

什么关系应该从哪个对象作为中心点来看

一对多, 以one方作为中心点

MyBatis框架支持多表查询封装对象之间关系

 

和上一篇  一对多N+1策略对比,  一对多-等值连接策略   可能从性能上稍微比   N+1策略对比   稍好一点  

One2ManyMapper.xml表:有变化

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--  映射标签,内部就编写具体的映射sql语句
    namespace :命名空间,值 必须是 对应接口的全限定名 = 包名 +简单类名
        top.abcdit.mybatis.mapper.One2ManyMapper
 -->

<mapper namespace="top.abcdit.mybatis.mapper.One2ManyMapper">
    
    <select id="selectByPrimaryKey" parameterType="int" resultMap="dept_map">
        
        select e.id e_id ,e.name e_name,d.id d_id,d.name d_name
        from employee e,department d where e.dept_id = d.id and d.id = #{id}
                
    </select>
    
    <resultMap type="top.abcdit.mybatis.pojo.Department" id="dept_map">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        
        <!-- 
              问题: private List<Employee> employees; 员工集合如何映射?
              解决方案:使用 <collection>集合标签,在内部映射多方(员工)的信息
              <collection property="" column="" select=""/>    
              property :需要映射的属性 此时就是 employees
              ofType:需要映射集合employees 的泛型
           -->
        
        <collection property="employees" ofType="top.abcdit.mybatis.pojo.Employee">
            <!-- 员工对象的主键列映射 -->
            <id property="id" column="e_id"/>
            <!-- 员工对象非主键列映射 -->
            <result property="name" column="e_name"/>
                    
        </collection>
        
    </resultMap>
    
</mapper>

 

输出结果一样:

DEBUG [main] - ==>  Preparing: select e.id e_id ,e.name e_name,d.id d_id,d.name d_name from employee e,department d where e.dept_id = d.id and d.id = ? 
DEBUG [main] - ==> Parameters: 2(Integer)
TRACE [main] - <==    Columns: e_id, e_name, d_id, d_name
TRACE [main] - <==        Row: 2, 虚竹, 2, 研发部
DEBUG [main] - <==      Total: 1
Department [id=null, name=null, employees=[Employee [id=2, name=虚竹]]]

 

posted @ 2019-07-16 00:29  abcdjava  阅读(179)  评论(0编辑  收藏  举报