MyBatis
7.自定义映射resultMap
Emp类:
Dept类:
1)使用全局配置处理字段名和属性名不一致的情况
1.为查询的字段设置别名,和属性名一致
2.当字段名名符合MySql的要求使用_,而属性名符合java的要求使用驼峰
此时可以在MyBatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰
如:emp_id---->empId,emp_name----->empName
<settings>
<!-- 将下划线映射为驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
2)resultMap处理字段属性的映射关系
resultMap:设置自定义的映射关系
id:唯一标识
type:处理映射关系的实体类的类型
常用标签属性:
id:处理主键和实体类中的属性的映射关系
result:处理普通字段和实体类中属性的映射关系
colum:设置映射关系的字段名,必须是sql查询出的某个的字段
property:设置映射关系中的属性的属性名,必须是处理实体类类型中的属性名
<!-- resultMap:设置自定义的映射关系
id:唯一标识
type:处理映射关系的实体类的类型
常用标签:
id:处理主键和实体类中的属性的映射关系
result:处理普通字段和实体类中属性的映射关系
colum:设置映射关系的字段名,必须是sql查询出的某个的字段
property:设置映射关系中的属性的属性名,必须是处理实体类类型中的属性名
-->
<resultMap id="empResultMap" type="Emp">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
</resultMap>
<!--Emp getEmpByEmpId(@Param("empId") int empId)-->
<select id="getEmpByEmpId" resultMap="empResultMap">
select * from t_emp where emp_id = #{empId}
</select>
3)处理多对一的映射关系
1>级联方式:
<resultMap id="empAndDeptResultMap" type="Emp">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
<result column="dept_id" property="dept.deptId"/>
<result column="dept_name" property="dept.deptName"/>
</resultMap>
<!-- Emp getEmpAndDeptByEmpId(@Param("empId") int empId)-->
<!-- sql表的外连接-->
<select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
select t_emp.*,t_dept.*
from t_emp
left join t_dept
on t_emp.id = t_dept.id
where t_emp.id = #{empId}
</select>
2>使用assiociation标签处理多对以映射关系
association:处理多对一的映射关系(处理实体类类型的属性)
property:设置需要处理映射关系的属性属性名
javaType:设置要处理的属性的类型
<resultMap id="empAndDeptResultMapOne" type="Emp">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
<!-- association:处理多对一的映射关系(处理实体类类型的属性)
property:设置需要处理映射关系的属性属性名
javaType:设置要处理的属性的类型
-->
<association property="dept" javaType="Dept">
<id column="dept_id" property="deptId"/>
<result column="dept_name" property="deptName"/>
</association>
</resultMap>
<select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMapOne">
select t_emp.*,t_dept.*
from t_emp
left join t_dept
on t_emp.id = t_dept.id
where t_emp.id = #{empId}
</select>
3>使用分步查询处理多对一映射关系
分步查询的优点:可以实现延迟加载
但是必须在核心配置文件中设置全局配置信息:
lazyLoadingEnabled:延迟加载的全局开关,当开启时,所有关联对象都会延迟加载
aggressiveLazyLoading:当开启时,任何方法的调用都会加载对该对象的所有属性,否则,每个属性都按需加载
此时就可以实现按需加载,获取的数据是什么,就会执行相应的sql。此时可通过asscoiation和collection中的fetchType属性设置当前分步查询是否使用延迟加载,fetchType=“lazy(延迟加载)|eager(立即加载)”
<!-- fetchType:在开启了延迟加载的环境中,通过该属性设置当前的分步查询是否使用延迟加载
fetchType="eager(立即加载)|lazy(延迟加载)"
-->
<association property="dept" fetchType="eager"
select="org.example.mapper.DeptMapper.getEmpAndDeptByStepTwo"
column="dept_id">
</association>
EmpMapper接口类:
// 通过分步查询查询员工以及所对应的部门信息的第一步
Emp getEmpAndDeptByStepOne(@Param("empId") int empId);
DeptMapper接口类;
// 通过分步查询查询员工以及所对应的部门信息的第二步
Dept getEmpAndDeptByStepTwo(@Param("deptTd") int deptId)
EmpMapper.xml:
<resultMap id="empAndDeptResultMapTwo" type="Emp">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
<!-- property:设置需要处理的映射关系的属性的属性名
select:设置分步查询的sql的唯一标识
colum:将查询出的某个字段作为分步查询的sql的条件
-->
<association property="dept"
select="org.example.mapper.DeptMapper.getEmpAndDeptByStepTwo"
column="dept_id">
</association>
</resultMap>
<!-- Emp getEmpAndDeptByStepOne(@Param("empId") int empId)-->
<select id="getEmpAndDeptByStepOne" resultMap="empAndDeptResultMapTwo">
select * from t_emp where emp_id = #{empId}
</select>
DeptMapper.xml:
<!-- 通过分步查询查询员工以及所对应的部门信息的第二步
Dept getEmpAndDeptByStepTwo(@Param("deptTd") int deptId);
-->
<select id="getEmpAndDeptByStepTwo" resultType="Dept">
select * from t_dept where dept_id = #{deptId}
</select>
4)处理一对多的映射关系
1>使用collection处理一对多的映射关系
用法与association相似
<!-- Dept getDeptAndEmpByDetId(@Param("deptId") int deptId)-->
<resultMap id="deptAndEmpResultMap" type="dept">
<id column="dept_id" property="deptId"/>
<result column="dept_name" property="deptName"/>
<collection property="emps" ofType="Emp">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="age" property="age"/>
<result column="gender" property="gender"/>
</collection>
</resultMap>
<select id="getDeptAndEmpByDetId" 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>使用分步查询处理一对多的映射关系
DeptMapper:
Dept getDeptAndEmpByStepOne(@Param("deptId") int deptId)
EmpMapper:
List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") int deptId);
DeptMapper.xml:
<resultMap id="deptAndEmpResultMapByStepOne" type="Dept">
<id column="dept_id" property="deptId"/>
<collection property="emps"
select="org.example.mapper.EmpMapper.getDeptAndEmpByStepTwo"
column="dept_id"
></collection>
</resultMap>
<!-- Dept getDeptAndEmpByStepOne(@Param("deptId") int deptId)-->
<select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpResultMapByStepOne">
select * from t_dept where dept_id = #{deptId}
</select>
EmpMapper.xml:
<!-- List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") int deptId)-->
<select id="getDeptAndEmpByStepTwo" resultType="Emp">
select * from t_emp where dept_id = #{deptId}
</select>