• 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=虚竹]]]
  • 相关阅读:
    日期和时间模块
    批处理bat文件dos命令实现文件的解压缩
    批处理bat文件dos命令复制文件
    dos命令临时和永久设置环境变量方法
    [转]NHibernate之旅(13):初探立即加载机制
    [转]NHibernate之旅(12):初探延迟加载机制
    [转]NHibernate之旅(11):探索多对多关系及其关联查询
    [转]NHibernate之旅(10):探索父子(一对多)关联查询
    [转]NHibernate之旅(9):探索父子关系(一对多关系)
    [转]NHibernate之旅(8):巧用组件之依赖对象
  • 原文地址:https://www.cnblogs.com/abcdjava/p/11192492.html
Copyright © 2020-2023  润新知