【MyBatis】day02参数传递和映射(下)

简介: 【MyBatis】day02参数传递和映射(下)

第八章 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....}
相关文章
|
13天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
4月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
91 3
|
5月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
71 3
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
|
6月前
|
SQL Java 数据库连接
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
|
6月前
|
算法 BI 数据库
MyBatisPlus查询条件设置、映射匹配兼容性、id生成策略、多数据操作
MyBatisPlus查询条件设置、映射匹配兼容性、id生成策略、多数据操作
374 3
|
6月前
|
SQL Java 数据库连接
15:MyBatis对象关系与映射结构-Java Spring
15:MyBatis对象关系与映射结构-Java Spring
108 4
|
6月前
|
XML Java 数据库连接
java对象有集合mybatis如何映射
java对象有集合mybatis如何映射
49 4
|
6月前
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)