查询的几种情况

// 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 自动映射(适合单表查询)

  1. autoMappingBehavior默认是PARTIAL,表示开启自动映射的功能。唯一的要求是列名和JavaBean属性名一致
  2. 如果autoMappingBehavior设置为null则会取消自动映射
  3. 数据库字段符合命名规范,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>

分步查询多列值的传递

  1. 如果分步查询时,需要传递给调用的查询中多个参数,则需要将多个参数封装成Map来进行传递,语法如下: {k1=v1, k2=v2....}

  2. 在所调用的查询方发中,取值时就要参考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之结果集的映射方式的更多相关文章

  1. SSM,即Spring+SpringMVC+MyBatis三个开源框架的整合框架集。

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻 ...

  2. mybatis进阶--一对一查询

    所谓的一对一查询,就是说我们在查询一个表的数据的时候,需要关联查询其他表的数据. 需求 首先说一个使用一对一查询的小需求吧:假设我们在查询某一个订单的信息的时候,需要关联查询出创建这个订单对应的用户信 ...

  3. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  4. 详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(上)

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻 ...

  5. Java归去来第4集:java实战之Eclipse中创建Maven类型的SSM项目

    一.前言 如果还不了解剧情,请返回第3集的剧情          Java归去来第3集:Eclipse中给动态模块升级 二.在Eclipse中创建Maven类型的SSM项目 2.1:SSM简介 SSM ...

  6. 【Spring】Spring+SpringMVC+MyBatis框架的搭建

    1,SSM的简介 SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中s ...

  7. 一文搞定 Mybatis 的应用

    Mybatis 介绍 Mybatis 是一个开源的持久层框架,原来叫 ibatis ,它对 jdbc 操作数据库的过程进行了封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动. ...

  8. SSM 框架集-01-详细介绍-入门问题篇

    SSM 框架集-01-详细介绍-入门问题篇 刚开始了解 SSM,首先先解决几个基础问题 1.什么是 SSM 框架集? SSM(Spring+SpringMVC+MyBatis)框架集由 Spring. ...

  9. mybatis 获得一个map的返回集合

    在使用mybatis 查询结果集,有时会有需求返回一个map比如表 id username 1  name1 2 name2 3 name3 希望的查询结果是一个map 并且以id为key  表为实体 ...

随机推荐

  1. javascript 函数节流 throttle 解决函数被频繁调用、浏览器卡顿的问题

    * 使用setTimeout index.html <html> <head> <meta charset="UTF-8"> <title ...

  2. javascript 自定义事件 发布-订阅 模式 Event

    * javascript自定义事件 var myEvent = document.createEvent("Event"); myEvent.initEvent("myE ...

  3. 3-等待线程终止的join方法

    等待线程终止的join方法 在项目实践中经常会遇到一个场景,就是需要等待某几件事完成之后才能继续往下执行,比如线程加载资源等等. package com.heiye.learn1; public cl ...

  4. 无法解析的外部符号"void_cdecl caffe::caffe_gpu_dot<double>(int,double........)"

    将源码中的.cu文件添加到项目中即可,即使创建的就是NVIDIA的项目,也需要把这些个.cu文件添加进来

  5. caffe.cpp解析

    来自链接:http://blog.csdn.net/u014114990/article/details/47747025 主要讲解:GetBrewFunction()函数定义如下,其返回BrewFu ...

  6. 基于ZooKeeper,Spring设计实现的参数系统

    一.简介 基于ZooKeeper服务端.ZooKeeper Java客户端以及Spring框架设计的用于系统内部进行参数维护的系统. 二.设计背景 在我们日常开发的系统内部,开发过程中最常见的一项工作 ...

  7. Serverless 的初心、现状和未来

    作者 | 不瞋 导读:Serverless 是如何产生的?当前有哪些落地场景?Serverless 的未来又将如何?本文分享了阿里云高级技术专家不瞋对于 Serverless 的看法,回顾其发展历程, ...

  8. Linux查找运行程序主目录

    1.查看程序所在PID netstat -lntup 2.根据PID查找程序所在目录 ll /proc/PID/exe 3.查找程序配置路径 /proc/PID/exe -t

  9. javascriptRemke之深入迭代

    javascriptRemke之深入迭代 前言:"迭代"意为按照顺序反复多次执行一段程序,ECMAscript6中新增了两个高级特性:迭代器与生成器,使用这两个特性能更高效地实现迭 ...

  10. Git学习笔记02-配置

    安装好Git之后,做的就是需要配置Git了 第一步,配置自己的名称和邮箱 打开Git Bash 输入命令 git config --global user.name "用户名" g ...