自定義對映resultMap

2022-10-02 12:00:21

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>