mybatis之结果集的映射方式
查询的几种情况
// 1)查询单行数据返回单个对象
public Employee getEmployeeById(Integer id );
// 2) 查询多行数据返回对象的集合
public List<Employee> getAllEmps();
// 3) 查询单行数据返回Map集合
public Map<String,Object> getEmployeeByIdReturnMap(Integer id );
// 4) 查询多行数据返回Map集合
@MapKey("id") // 指定使用对象的哪个属性来充当map的key
public Map<Integer,Employee> getAllEmpsReturnMap();
<!--
查询单行数据返回Map集合
public Map<String, Object> getEmployeeByIdReturnMap(Integer id );
-->
<select id="getEmployeeByIdReturnMap" resultType="java.util.HashMap">
select id ,last_name,email,gender from tbl_employee where id = #{id}
</select>
<!--
查询多行数据返回Map集合
@MapKey("id") // 指定使用对象的哪个属性来充当map的key
public Map<Integer,Employee> getAllEmpsReturnMap();
-->
<select id="getEmpsReturnMap" resultType="com.atguigu.mybatis.beans.Employee">
select id ,last_name,email,gender from tbl_employee
</select>
自动映射类型取决于将数据存储成什么类型,上面的例子虽然最终是多条数据封装成map,但每一条数据的存储类型是Employ对象,所以resultType定义成Employ对象
Select标签来定义查询操作。Id:唯一标识符。用来引用这条语句,需要和接口的方法名一致
parameterType:参数类型。
可以不传,MyBatis会根据TypeHandler自动推断resultType:返回值类型。
别名或者全类名,如果返回的是集合,定义集合中元素的类型。不能和resultMap同时使用
结果集的封装方式(重点)
resultType 自动映射(适合单表查询)
autoMappingBehavior默认是PARTIAL,表示开启自动映射的功能。唯一的要求是列名和JavaBean属性名一致- 如果
autoMappingBehavior设置为null则会取消自动映射 - 数据库字段符合命名规范,POJO属性符合驼峰命名法,如A_COLUMN与aColumn,我们可以开启自动驼峰命名规则映射功能,
mapUnderscoreToCamelCase=true
不再举例,上面的例子都是自动映射方式
resultMap自定义映射(多表查询)
constructor- 类在实例化时, 用来注入结果到构造方法中- idArg - ID 参数; 标记结果作为 ID 可以帮助提高整体效能
- arg - 注入到构造方法的一个普通结果
id– 一个 ID 结果; 标记结果作为 ID 可以帮助提高整体效能result– 注入到字段或 JavaBean 属性的普通结果association– 一个复杂的类型关联;许多结果将包成这种类型- 嵌入结果映射 – 结果映射自身的关联,或者参考一个
collection– 复杂类型的集- 嵌入结果映射 – 结果映射自身的集,或者参考一个
discriminator– 使用结果值来决定使用哪个结果映射case – 基于某些值的结果映射
嵌入结果映射 – 这种情形结果也映射它本身,因此可以包含很多相同的元素,或者它可以参照一个外部的结果映射。
public class Employee {
private Integer id ;
private String lastName;
private String email ;
private Integer gender ;
//联合部门对象属性
private Department dept ;
}
/* 自定义映射
type: 最终结果集封装的类型
<id>: 完成主键列的映射
column: 数据库字段列名
property:对象的属性名
<result>:完成普通列的映射
*/
/*
需求: 查询员工对象, 并且查询员工所在 的部门信息.
*/
<select id="getEmpAndDept" resultMap="myEmpAndDept">
SELECT e.id eid , e.last_name, e.email,e.gender , d.id did , d.dept_name
FROM tbl_employee e , tbl_dept d
WHERE e.d_id = d.id AND e.id = #{id}
</select>
/*
eid last_name email gender did dept_name
1005 玛利亚老师 mly@sina.com 0 4 人事部
*/
<resultMap type="com.atguigu.mybatis.beans.Employee" id="myEmpAndDept">
<id column="eid" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
/* 级联
<result column="did" property="dept.id"/>
<result column="dept_name" property="dept.departmentName"/>
*/
/*
association: 完成关联、联合属性的映射
property: 联合属性名
javaType: 联合属性的类型
*/
<association property="dept" javaType="com.atguigu.mybatis.beans.Department">
<id column="did" property="id" />
<result column="dept_name" property="departmentName"/>
</association>
</resultMap>
分步查询
实际的开发中,对于每个实体类都应该有具体的增删改查方法,也就是DAO层, 因此对于查询员工信息并且将对应的部门信息也查询出来的需求,就可以通过分步的方式
① 先通过员工的id查询员工信息
② 再通过查询出来的员工信息中的外键(部门id)查询对应的部门信息.
/*
association 使用分步查询:
需求: 查询员工信息并且查询员工所在的部门信息.
1. 先根据员工的id查询员工信息
2. 使用外键 d_id查询部门信息
*/
<!-- public Employee getEmpAndDeptStep(Integer id ); -->
<select id="getEmpAndDeptStep" resultMap="myEmpAndDeptStep">
select id, last_name, email,gender ,d_id from tbl_employee where id = #{id}
</select>
<resultMap type="com.atguigu.mybatis.beans.Employee" id="myEmpAndDeptStep">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
//分步查询
<association property="dept"
select="com.atguigu.mybatis.dao.DepartmentMapperResultMap.getDeptById"
column="{did=d_id}" fetchType="eager">
</association>
</resultMap>
分步查询多列值的传递
如果分步查询时,需要传递给调用的查询中多个参数,则需要将多个参数封装成Map来进行传递,语法如下: {k1=v1, k2=v2....}
在所调用的查询方发中,取值时就要参考Map的取值方式,需要严格的按照封装map时所用的key来取值.
association 或 collection的 fetchType属性
1)在association和collection标签中都可以设置fetchType,指定本次查询是否要使用延迟加载。默认为 fetchType=”lazy” ,如果本次的查询不想使用延迟加载,则可设置为fetchType=”eager”.
2)fetchType可以灵活的设置查询是否需要使用延迟加载,而不需要因为某个查询不想使用延迟加载将全局的延迟加载设置关闭.
collection
POJO中的属性可能会是一个集合对象,我们可以使用联合查询,并以级联属性的方式封装对象。使用collection标签定义对象的封装规则
public class Department {
private Integer id ;
private String departmentName ;
private List<Employee> emps ;
}
<select id="getDeptAndEmpsById" resultMap="myDeptAndEmps">
SELECT d.id did, d.dept_name ,e.id eid ,e.last_name ,e.email,e.gender
FROM tbl_dept d LEFT OUTER JOIN tbl_employee e ON d.id = e.d_id
WHERE d.id = #{id}
</select>
<resultMap type="com.atguigu.mybatis.beans.Department" id="myDeptAndEmps">
<id column="did" property="id"/>
<result column="dept_name" property="departmentName"/>
/*
property: 关联的属性名
ofType: 集合中元素的类型
*/
<collection property="emps" ofType="com.atguigu.mybatis.beans.Employee">
<id column="eid" property="id"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
</collection>
</resultMap>
collection分布查询
实际的开发中,对于每个实体类都应该有具体的增删改查方法,也就是DAO层, 因此
对于查询部门信息并且将对应的所有的员工信息也查询出来的需求,就可以通过分步的方式完成查询。
① 先通过部门的id查询部门信息
② 再通过部门id作为员工的外键查询对应的部门信息.
<select id="getDeptAndEmpsByIdStep" resultMap="myDeptAndEmpsStep">
select id ,dept_name from tbl_dept where id = #{id}
</select>
<resultMap type="com.atguigu.mybatis.beans.Department" id="myDeptAndEmpsStep">
<id column="id" property="id"/>
<result column="dept_name" property="departmentName"/>
<collection property="emps"
select="com.atguigu.mybatis.dao.EmployeeMapper.getEmpsByDid"
column="id">
</collection>
</resultMap>
mybatis之结果集的映射方式的更多相关文章
- SSM,即Spring+SpringMVC+MyBatis三个开源框架的整合框架集。
SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻 ...
- mybatis进阶--一对一查询
所谓的一对一查询,就是说我们在查询一个表的数据的时候,需要关联查询其他表的数据. 需求 首先说一个使用一对一查询的小需求吧:假设我们在查询某一个订单的信息的时候,需要关联查询出创建这个订单对应的用户信 ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
- 详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(上)
SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻 ...
- Java归去来第4集:java实战之Eclipse中创建Maven类型的SSM项目
一.前言 如果还不了解剧情,请返回第3集的剧情 Java归去来第3集:Eclipse中给动态模块升级 二.在Eclipse中创建Maven类型的SSM项目 2.1:SSM简介 SSM ...
- 【Spring】Spring+SpringMVC+MyBatis框架的搭建
1,SSM的简介 SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中s ...
- 一文搞定 Mybatis 的应用
Mybatis 介绍 Mybatis 是一个开源的持久层框架,原来叫 ibatis ,它对 jdbc 操作数据库的过程进行了封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动. ...
- SSM 框架集-01-详细介绍-入门问题篇
SSM 框架集-01-详细介绍-入门问题篇 刚开始了解 SSM,首先先解决几个基础问题 1.什么是 SSM 框架集? SSM(Spring+SpringMVC+MyBatis)框架集由 Spring. ...
- mybatis 获得一个map的返回集合
在使用mybatis 查询结果集,有时会有需求返回一个map比如表 id username 1 name1 2 name2 3 name3 希望的查询结果是一个map 并且以id为key 表为实体 ...
随机推荐
- php环境 安装
php 相关 wget https://www.php.net/distributions/php-7.2.16.tar.gz //你可以官网获取最新的包 tar解压 //一般目录 ...
- windom 下面redis安装和扩展安装
参考 https://www.cnblogs.com/yulongcode/p/10585229.html https://blog.csdn.net/qq_41921511/article/deta ...
- P7854-「EZEC-9」GCD Tree【构造】
正题 题目连接:https://www.luogu.com.cn/problem/P7854 题目大意 给出\(n\)数字的一个序列\(a\). 现在要求构造一棵树,使得对于任意的\((x,y)\)都 ...
- Bert文本分类实践(一):实现一个简单的分类模型
写在前面 文本分类是nlp中一个非常重要的任务,也是非常适合入坑nlp的第一个完整项目.虽然文本分类看似简单,但里面的门道好多好多,作者水平有限,只能将平时用到的方法和trick在此做个记录和分享,希 ...
- java 文档自动生成的神器 idoc
写文档 作为一名开发者,每个人都要写代码. 工作中,几乎每一位开发者都要写文档. 因为工作是人和人的协作,产品要写需求文档,开发要写详细设计文档,接口文档. 可是,作为一个懒人,平时最讨厌的一件事情就 ...
- Spring框架访问数据库的两种方式的小案例
1.1 以Xml的方式访问数据库的案例 要以xml的方式访问数据库需要用到JdbcTemplate ,因为 JdbcTemplate(jdbc的模板对象)在Spring 中提供了一个可以操作数据库的对 ...
- VMware Tanzu社区版初体验
VMware Tanzu社区版 VMware Tanzu Community Edition 是一个功能齐全.易于管理的 Kubernetes 平台,供学习者和用户使用. 它是一个免费的.社区支持的. ...
- 成功在Caterpillar代码中插入事件对象-20200917
首先搞清楚了Caterpillar的solidity代码生成机制.Caterpillar分为Caterpillar Core和 executepanel两部分. executePanel是UI前端,用 ...
- .jar文件没有Java(TM) Platform SE binary打开方式解决办法
下面是我个人在打开.jar文件时候的一些小问题: 明明已经配置好了环境变量.jar文件却没有 Java(TM) Platform SE binary 的打开方式, 网上查了资料点明是环境变量的问题,后 ...
- Java:TreeMap类小记
Java:TreeMap类小记 对 Java 中的 TreeMap类,做一个微不足道的小小小小记 概述 前言:之前已经小小分析了一波 HashMap类.HashTable类.ConcurrentHas ...