1、 掌握数据库表字段与实体类属性不同的处理方式
2、 掌握查询返回无对应实体类的处理方法
3、 掌握多表联合查询映射处理
* 字段名和属性名不一致的情况,如何处理映射关系 * 1、为查询的字段设置别名,和属性名保持一致 * 2、当字段符合MySQL的要求使用,而属性符合java的要求使用驼峰 * 此时可以在mybatis的核心配置文件中设置一个全局变量,可以自动将下划线映射为 驼峰(settings) * emp_id--->empId emp_name--->empName * 使用resultMap自定义映射处理(三种方法) * resultMap:设置自定义的映射关系 * id:唯一标识 * type:处理映射关系的实体类的类型 * 常用的标签: * id:处理主键和实体类中属性的映射关系 * result:处理普通字段和实体类中属性的映射关系 * associatin:处理多对一的映射文件(处理实体类类型的属性) * collection:处理一对多的映射文件(处理集合类型的属性) * colum:设置映射关系中字段名,必须是sql查询出的某个字段 * property:设置映射关系中属性的属性名,必须是处理的实体类类型中属性名 * 处理多对一的映射关系: * 1、级联方式处理 * 2、associatin:处理实体类类型的属性 * 3、分步查询 * 处理一对多的映射关系: * 1、collection * 2、分步查询 * *
1 解决字段名与实体类属性名不同的方法:
若字段名和实体类中的属性名不一致,可以通过resultMap设置自定义映射
1 )查询时为字段起别名,与属性名一样:
select emp_id empId ,emp_name empName, age ,gender from t_emp where emp_id=#{empId}
select * from t_emp where emp_id=#{empId}
2 )当字段名符合mysql要求,用了_,而属性名符合java驼峰规范,可以采用配置方式开启自动映射
在核心配置文件中,进行setttings的配置
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
settings>
3) 自定义映射resultMap
Emp getEmpByEmpId(@Param("empId") Integer empId);
<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>
<select id="getEmpByEmpId" resultMap="empResultMap">
select * from t_emp where emp_id=#{empId}
select>
2 多对一映射关系三种处理方式:
查询员工信息以及员工所对应的部门信息
1 )级联方式处理映射关系
Emp getEmpAndDeptByEmpId(@Param("empId") Integer empId);
<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(sql语句同前)
<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>
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>
3) 分步查询
首先,查询员工的信息:
Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
然后,在association中用select标签调用前面准备好语句,调用时利用column标签向被调用方法传递参数
<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" fetchType="eager"
select="edu.gdpu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
column="dept_id" >
association>
resultMap>
<select id="getEmpAndDeptByStep" resultMap="EmpAndDeptResultMap">
select * from t_emp where emp_id=#{empId}
select>
其次:
/**
* 通过分步查询查询员工以及所对应的部门信息的第二步
* @param deptId
* @return
*/
Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);
<select id="getEmpAndDeptByStepTwo" resultType="Dept">
select * from t_dept where dept_id=#{deptId}
select>
3 一对多映射关系处理(两种处理方式)
1) 用collection
/**
* 查询部门以及部门中员工信息
* @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>
<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>
<select id="getDeptAndEmpByDeptId" resultMap="deptAndEmpResultMap">
SELECT
t_dept.*,t_emp.*
FROM t_dept
LEFT JOIN t_emp
ON t_emp.dept_id=t_dept.dept_id
WHERE t_dept.dept_id=#{deptId}
select>
2)分步查询
先准备好将被调用的接口及SQL映射
/**
* 通过分步查询查询员工以及所对应的部门信息的第一步
* @param empId
* @return
*/
Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
<select id="getEmpAndDeptByStepOne" resultMap="EmpAndDeptResultMapThree">
select * from t_emp where emp_id=#{empId}
select>
然后进行主查询:
/**
* 通过分步查询部门以及部门员工中信息的第二步
* @param deptId
* @return
*/
List<Emp> getDeptAndByStepTwo(@Param("deptId")Integer deptId);
<resultMap id="deptAndEmpResultMapByStep" type="Dept">
<id column="dept_id" property="deptId">id>
<result column="dept_name" property="deptName">result>
<collection property="emps"
select="edu.gdpu.mybatis.mapper.DeptMapper.getDeptAndByStepTwo"
column="dept_id">
collection>
resultMap>
<select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpResultMapByStep">
select * from t_dept where dept_id=#{deptId}
select>
*通过动手操作实验,我逐渐掌握了**数据库表字段与实体类属性不同的处理方式**、**查询返回无对应实体类的处理方法**和**多表联合查询映射处理**,**在实验过程中,我也遇到了一些麻烦,但是也慢慢解决他,并弄懂了。最重要的是,感觉知识点容易忘记。*