自定義映射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>