自定義映射resultMap

  • 2022 年 10 月 2 日
  • 筆記

resultMap處理字段和屬性的映射關係

如果字段名與實體類中的屬性名不一致,該如何處理映射關係?

  • 第一種方法:為查詢的字段設置別名,和屬性名保持一致

    下面是實體類中的屬性名:

      private Integer empId;
      private String empName;
      private Integer age;
      private String gender;
    

    這是建表時設置的字段名:

    emp_id    emp_name    age    gender
    

    我們只需要在Mapper.xml中在寫sql語句時,對字段名進行設置別名,使得與屬性名一致:

     select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId}
    
  • 第二種方法:當字段符合Mysql要求使用下劃線,而屬性名符合Java要求使用駝峰,此時可以在Mybatis的核心配置文件中設置一個全局配置信息mapUnderscoreToCamelCase,就可以在查詢表中數據時,自動將下劃線類型的字段名轉換為駝峰。

     <settings>
            <!--將下劃線映射為駝峰-->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
     </settings>
    
  • 第三種方法:使用resultMap處理

        <!--
            resultMap:設置自定義的映射關係
            id:唯一標識
            type:處理映射關係的實體類的類型
            常用標籤:
            id:處理主鍵和實體類中屬性的映射關係
            result:處理普通字段和實體類中屬性的映射關係
            column:設置映射關係中的字段名,必須是sql查詢出的某個字段
            property:設置映射關係中的屬性的屬性名,必須是處理實體類型類型中的屬性名
         -->
    
        <resultMap id="empResultMap" type="Emp">
            <id column="emp_id" property="empId"></id>
            <result column="emp_name" property="empName"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
        </resultMap>
    
    
        <!-- Emp getEmpByEmpId(@Param("empId") Integer emId);-->
    
        <select id="getEmpByEmpId" resultMap="empResultMap">
            select * from t_emp where emp_id = #{empId}
        </select>
    

多對一的映射關係

1.級聯方式處理映射關係

當Emp實體類中具有Dept對象,但是字段中不存在這個屬性,我們需要將Dept對象中的屬性與查詢的字段名建立映射關係。

    <resultMap id="empAndDeptResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <result column="dept_id" property="dept.deptId"></result>
        <result column="dept_name" property="dept.deptName"></result>
    </resultMap>
    <select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
        select t_emp.*,t_dept.*
        from t_emp left join t_dept on t_emp.dept_id = t_dept.dept_id
        where t_emp.emp_id = #{empId}
    </select>

2.使用association處理映射關係

  • association:處理多對一的映射關係(處理實體類類型的屬性)
  • property:設置需要處理映射關係的屬性的屬性名
  • javaType:設置要處理的屬性的類型
    <resultMap id="empAndDeptResultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <association property="dept" javaType="Dept">
            <id column="dept_id" property="deptId"></id>
            <result column="dept_name" property="deptName"></result>
        </association>
    </resultMap>

3.分步查詢

  • 首先查詢員工的信息

        /**
         * 通過分步查詢員工的信息
         * @param empId
         * @return
         */
        Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
    
    
    
        <resultMap id="empAndDeptByStepResultMap" type="Emp">
            <id column="emp_id" property="empId"></id>
            <result column="emp_name" property="empName"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
            <!--
    			select:設置分步查詢,查詢某個屬性的值的sql標識(namespace.sqlId)
    			column:將sql以及查詢結果中的某個字段設置為分步查詢的條件
    		-->
            <association property="dept"
                         select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                         column="dept_id"></association>
        </resultMap>
        <!--   Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);-->
        <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
            select * from t_emp where emp_id = #{empId}
        </select>
    
  • 根據員工所對應的部門id查詢部門信息

        /**
         * 分步查詢第二步:根據員工所對應的id查詢部門信息
         * @param deptId
         * @return
         */
        Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);
        
    
       <!-- Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);-->
        <select id="getEmpAndDeptByStepTwo" resultType="Dept">
            select * from t_dept where depy_id = #{deptId}
        </select>
    
  • 分步查詢的優點:可以實現延遲加載,但是必須在核心配置文件中設置全局配置信息:

    lazyLoadingEnabled:延遲加載的全局開關,當開啟時,所有關聯對象都會延遲加載。

    aggressiveLazyLoading:當開啟時,任何方法的調用都會加載該對象的所有屬性。否則,每個屬性會按需加載

    此時就可以實現按需加載,獲取的數據是什麼,就會執行相應的sql。此時可通過association和collection中的fetchType屬性設置當前的分步查詢是否使用延遲加載。


一對多的映射關係

1.collection

    /**
     * 根據部門id查部門中員工的信息
     * @param deptId
     * @return
     */
    Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);

   <resultMap id="deptAndEmpResultMap" type="Dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
        <!--
            ofType:設置collection標籤所處理的集合屬性中存儲數據的類型
        -->
        <collection property="emps" ofType="Emp">
            <id column="emp_id" property="empId"></id>
            <result column="emp_name" property="empName"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
        </collection>
    </resultMap>

 <!--Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);-->
    <select id="getDeptAndEmpByDeptId" resultMap="deptAndEmpResultMap">
        select *
        from t_dept
        LEFT JOIN t_emp
        ON t_dept.dept_id = t_emp.dept_id
        WHERE t_dept.dept_id = #{deptId};
    </select>

2.分步查詢

  • 查詢部門信息

        /**
         * 分步查詢部門以及部門中的員工信息第一步
         * @param id
         * @return
         */
        Dept getDeptAndEmpByStepOne(@Param("id") Integer id);
        
    
      <resultMap id="deptAnEmpResultMapByStep" type="Dept">
            <id column="dept_id" property="depyId"></id>
            <result column="dept_name" property="deptName"></result>
            <collection property="emps"
                        select="com.atguigu.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
                        column="dept_id"></collection>
        </resultMap>
    
        <!--    Dept getDeptAndEmpByStepOne(@Param("id") Integer id);-->
        <select id="getDeptAndEmpByStepOne" resultMap="">
            select * from t_dept where dept_id = #{deptId}
        </select>
    
  • 根據部門id查詢部門中的員工信息

        /**
         * 分步查詢部門以及部門中的員工信息第二步
         * @param dept_id
         * @return
         */
        List<Emp> getDeptAndEmpByStepTwo(@Param("dept_id") Integer dept_id);
        
    
        <resultMap id="empAndDeptByStepResultMap" type="Emp">
            <id column="emp_id" property="empId"></id>
            <result column="emp_name" property="empName"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
            <association property="dept"
                         select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                         column="dept_id"></association>
        </resultMap>
    
        <!--List<Emp> getDeptAndEmpByStepTwo(@Param("dept_id") Integer dept_id);-->
        <select id="getDeptAndEmpByStepTwo" resultType="Emp">
            select * from t_emp where dept_id = #{deptId}
        </select>