mybatis的resultMap

多对一

使用 resultMap 属性,在查询语句返回时使用 resultMap 属性

<!--

       resultMap :自定义映射,主要处理复杂的表关系
           - type : 处理的类型,
           - id : 唯一标识
   -->
   <resultMap id="empMap" type="lyy.bean.Emp">
       <!--
           解决多表查询的问题,只需要 id 和 result 标签
               - id : 设置主键的映射关系
                   - column : 数据库的字段名
                   - property : 实体类的属性名
               - result : 设置其他的映射关系
                   - column : 数据库的字段名
                   - property : 实体类的属性名
       -->
       <id column="eid" property="eid"></id>
       <result column="ename" property="ename"/>
       <result column="age" property="age"/>
       <result column="sex" property="sex"/>
       <result column="did" property="dept.did"/>
       <result column="dname" property="dept.dname"/>
   </resultMap>

   <!--
       使用 association 完成多对一
    -->
   <resultMap id="empMapByAss" type="lyy.bean.Emp">
       <id column="eid" property="eid"></id>
       <result column="ename" property="ename"/>
       <result column="age" property="age"/>
       <result column="sex" property="sex"/>
       <!--
           association : 主要处理一对一和多对一,
               会根据查询出来的 did 和 dname 创建出 javaType 类型的对象,然后在赋值给 association property 的属性
                   - property : 对应的的实体类中的字段
                   - javaType : 设置其类型(创建的对象类型)
       -->
       <association property="dept" javaType="lyy.bean.Dept">
           <id column="did" property="did"/>
           <result column="dname" property="dname"/>
       </association>
   </resultMap>

   <!--
       多对一,分步查询,使用 association 的 select 属性
           property : 处理的哪一个语句
           select : 选择需要执行的 sql 语句,需要使用(namespace + id)
           column : 需要执行条件的参数值,这个歌参数必须是从数据库查询出来的
   -->
   <resultMap id="empMapStep" type="lyy.bean.Emp">
       <id column="eid" property="eid"></id>
       <result column="ename" property="ename"/>
       <result column="age" property="age"/>
       <result column="sex" property="sex"/>
       <association property="dept" select="lyy.mapper.DeptMapper.getDeptByBid" column="did"/>
   </resultMap>



   <!--List<Emp> getAllEmp();-->
   <select id="getAllEmp" resultMap="empMapByAss">
      SELECT
          `eid`,
          `ename`,
          `age`,
          `sex`,
          dept.dname,
          emp.did
      FROM
          `emp`
      LEFT JOIN dept ON emp.did = dept.did
   </select>

   <!--
       查询员工的所有信息,分步查询
       Emp getEmpStep(String eid);
   -->
   <select id="getEmpStep" resultMap="empMapStep">
      SELECT * FROM `emp` WHERE `eid` = #{eid}
   </select>

一对多

 <!--
       一对多的分步查询
       需要使用 collection 的 select 属性
       column : 的多个参数 {did=did,key=value}
       执行的 sql 语句的 #{key} 的 key 必须和 column 中的 key 值相同
       fetchType : 指定是否是延迟加载
           - lazy : 延迟加载
           - eager : 不延迟加载
   -->
   <resultMap id="deptMapStep" type="lyy.bean.Dept">
       <id column="did" property="did"/>
       <id column="dname" property="dname"/>
       <collection property="empList"
                   select="lyy.mapper.EmpDeptMapper.getEmpListByBid"
                   column="{did=did}"
                   fetchType="eager">
       </collection>
   </resultMap>

   <!-- Dept getDeptEmpsByDid(String did); -->
   <select id="getDeptEmpsByDid" resultMap="deptMap">
      SELECT
          dept.`did`,
          dept.`dname`,
          emp.eid,
          emp.ename,
          emp.age,
          emp.sex
      FROM
          `dept`
      LEFT JOIN emp ON emp.did = dept.did
      WHERE
          dept.did = #{did}
   </select>

   <!-- Dept getOnlyDeptByBid(String did); -->
   <select id="getOnlyDeptByBid" resultMap="deptMapStep">
      SELECT `did`, `dname` FROM `dept` WHERE did = #{did}
   </select>

   <!-- List<Emp> getEmpListByBid(String bid); -->
   <select id="getEmpListByBid" resultType="lyy.bean.Emp">
      SELECT `eid`, `ename`, `age`, `sex`, `did` FROM `emp` WHERE `did` = #{did}
   </select>

分步查询开启

需要在 mybatis 的配置文件中加入 lazyLoadingEnabled 属性

注:lazyLoadingEnabled 和 aggressiveLazyLoading 必须相反设置

<settings>
       <!--
           延迟加载:只对分步查询有效果
           需要设置
               lazyLoadingEnabled(是否开启懒加载) = true , 只有使用到时才会执行分步查询中的另一个查询
               
               aggressiveLazyLoading(是否查询所有数据) = false
           lazyLoadingEnabled 和 aggressiveLazyLoading 的属性是相反的
       -->
       <setting name="lazyLoadingEnabled" value="true"/>
       <setting name="aggressiveLazyLoading" value="false"/>
   </settings>



posted @ 2020-08-19 15:23  lyy2018  阅读(189)  评论(0)    收藏  举报