如果欄位名與實體類中的屬性名不一致,該如何處理對映關係?
第一種方法:為查詢的欄位設定別名,和屬性名保持一致
下面是實體類中的屬性名:
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>
當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>
<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>
首先查詢員工的資訊
/**
* 通過分步查詢員工的資訊
* @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屬性設定當前的分步查詢是否使用延遲載入。
/**
* 根據部門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>
查詢部門資訊
/**
* 分步查詢部門以及部門中的員工資訊第一步
* @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>