第八章 Mybatis中自动映射与自定义映射
自动映射【resultType】
自定义映射【resultMap】
8.1 自动映射与自定义映射
- 自动映射【resultType】:指的是自动将表中的字段与类中的属性进行关联映射
- 自动映射解决不了两类问题
- 多表连接查询时,需要返回多张表的结果集
- 单表查询时,不支持驼峰式自动映射【不想为字段定义别名】
- 自定义映射【resultMap】:自动映射解决不了问题,交给自定义映射
- 注意:resultType与resultMap只能同时使用一个
8.2 自定义映射-级联映射
1. <!-- 自定义映射 【员工与部门关系】--> 2. <resultMap id="empAndDeptResultMap" type="employee"> 3. <!-- 定义主键字段与属性关联关系 --> 4. <id column="id" property="id"></id> 5. <!-- 定义非主键字段与属性关联关系--> 6. <result column="last_name" property="lastName"></result> 7. <result column="email" property="email"></result> 8. <result column="salary" property="salary"></result> 9. <!-- 为员工中所属部门,自定义关联关系--> 10. <result column="dept_id" property="dept.deptId"></result> 11. <result column="dept_name" property="dept.deptName"></result> 12. </resultMap> 13. <select id="selectEmpAndDeptByEmpId" resultMap="empAndDeptResultMap"> 14. SELECT 15. e.`id`, 16. e.`email`, 17. e.`last_name`, 18. e.`salary`, 19. d.`dept_id`, 20. d.`dept_name` 21. FROM 22. tbl_employee e, 23. tbl_dept d 24. WHERE 25. e.`dept_id` = d.`dept_id` 26. AND 27. e.`id` = #{empId} 28. </select>
8.3 自定义映射-association映射
- 特点:解决一对一映射关系【多对一】
- 示例代码
1. <!-- 自定义映射 【员工与部门关系】--> 2. <resultMap id="empAndDeptResultMapAssociation" type="employee"> 3. <!-- 定义主键字段与属性关联关系 --> 4. <id column="id" property="id"></id> 5. <!-- 定义非主键字段与属性关联关系--> 6. <result column="last_name" property="lastName"></result> 7. <result column="email" property="email"></result> 8. <result column="salary" property="salary"></result> 9. <!-- 为员工中所属部门,自定义关联关系--> 10. <association property="dept" 11. javaType="com.atguigu.mybatis.pojo.Dept"> 12. <id column="dept_id" property="deptId"></id> 13. <result column="dept_name" property="deptName"></result> 14. </association> 15. </resultMap>
8.4 自定义映射-collection映射
- 示例代码
1. /** 2. * 通过部门id获取部门信息,及部门所属员工信息 3. */ 4. public Dept selectDeptAndEmpByDeptId(int deptId);
1. <resultMap id="deptAndempResultMap" type="dept"> 2. <id property="deptId" column="dept_id"></id> 3. <result property="deptName" column="dept_name"></result> 4. <collection property="empList" 5. ofType="com.atguigu.mybatis.pojo.Employee"> 6. <id column="id" property="id"></id> 7. <result column="last_name" property="lastName"></result> 8. <result column="email" property="email"></result> 9. <result column="salary" property="salary"></result> 10. </collection> 11. </resultMap> 12. <select id="selectDeptAndEmpByDeptId" resultMap="deptAndempResultMap"> 13. SELECT 14. e.`id`, 15. e.`email`, 16. e.`last_name`, 17. e.`salary`, 18. d.`dept_id`, 19. d.`dept_name` 20. FROM 21. tbl_employee e, 22. tbl_dept d 23. WHERE 24. e.`dept_id` = d.`dept_id` 25. AND 26. d.dept_id = #{deptId} 27. </select>
8.5 ResultMap相关标签及属性
- resultMap标签:自定义映射标签
- id属性:定义唯一标识
- type属性:设置映射类型
- resultMap子标签
- id标签:定义主键字段与属性关联关系
- result标签:定义非主键字段与属性关联关系
- column属性:定义表中字段名称
- property属性:定义类中属性名称
- association标签:定义一对一的关联关系
- property:定义关联关系属性
- javaType:定义关联关系属性的类型
- select:设置分步查询SQL全路径
- colunm:设置分步查询SQL中需要参数
- fetchType:设置局部延迟加载【懒加载】是否开启
- collection标签:定义一对多的关联关系
- property:定义一对一关联关系属性
- ofType:定义一对一关联关系属性类型
- fetchType:设置局部延迟加载【懒加载】是否开启
8.6 Mybatis中分步查询
- 为什么使用分步查询【分步查询优势】?
- 将多表连接查询,改为【分步单表查询】,从而提高程序运行效率
- 示例代码
- 一对一
1. /** 2. * 通过员工id获取员工信息及员工所属的部门信息【分步查询】 3. 1. 先通过员工id获取员工信息【id、last_name、email、salary、dept_id】 4. 2. 再通过部门id获取部门信息【dept_id、dept_name】 5. */ 6. public Employee selectEmpAndDeptByEmpIdAssociationStep(int empId);
1. <select id="selectEmpAndDeptByEmpIdAssociationStep" resultMap="empAndDeptResultMapAssocationStep"> 2. select 3. id, 4. last_name, 5. email, 6. salary, 7. dept_id 8. from 9. tbl_employee 10. where 11. id=#{empId} 12. </select>
1. /** 2. * 通过部门id获取部门信息 3. */ 4. public Dept selectDeptByDeptId(int deptId);
1. <select id="selectDeptByDeptId" resultType="dept"> 2. select 3. dept_id, 4. dept_name 5. from 6. tbl_dept 7. where 8. dept_id=#{deptId} 9. </select>
- 一对多
1. /** 2. * 通过部门id获取部门信息,及部门所属员工信息【分步查询】 3. 1. 通过部门id获取部门信息 4. 2. 通过部门id获取员工信息 5. */ 6. public Dept selectDeptAndEmpByDeptIdStep(int deptId);
1. <!-- 通过部门id获取部门信息,及部门所属员工信息【分步查询】--> 2. <!-- 1. 通过部门id获取部门信息--> 3. <!-- 2. 通过部门id获取员工信息--> 4. <select id="selectDeptAndEmpByDeptIdStep" resultMap="deptAndEmpResultMapStep"> 5. select 6. dept_id, 7. dept_name 8. from 9. tbl_dept 10. where 11. dept_id=#{deptId} 12. </select>
1. /** 2. * 通过部门Id获取员工信息 3. * @param deptId 4. * @return 5. */ 6. public List<Employee> selectEmpByDeptId(int deptId);
1. <select id="selectEmpByDeptId" resultType="employee"> 2. select 3. id, 4. last_name, 5. email, 6. salary, 7. dept_id 8. from 9. tbl_employee 10. where 11. dept_id=#{deptId} 12. </select>
8.7 Mybatis延迟加载【懒加载】
- 需要时加载,不需要暂时不加载
- 优势:提升程序运行效率
- 语法
- 全局设置
1. <!-- 开启延迟加载 --> 2. <setting name="lazyLoadingEnabled" value="true"/> 3. <!-- 设置加载的数据是按需加载3.4.2及以后的版本该步骤可省略--> 4. <setting name="aggressiveLazyLoading" value="false"/>
- 局部设置
- fetchType
- eager:关闭局部延迟加载
- lazy:开启局部延迟加载
- 示例代码
1. <association property="dept" 2. select="com.atguigu.mybatis.mapper.DeptMapper.selectDeptByDeptId" 3. column="dept_id" 4. fetchType="eager"> 5. </association>
8.8 扩展
- 如果分步查询时,需要传递给调用的查询中多个参数,则需要将多个参数封装成
Map来进行传递,语法如下: {k1=v1, k2=v2....}