<MyBatis>入门五 查询的返回值处理
select :
返回对象:
<select id = " " resultType= "对象的全类名" />
List:
<select id = " " resultType = "list泛型中的值" />
Map:
1.返回一条记录 Map<String,Object>
key -> 字段
value -> 值
<select id = " " resultType="map" />
2.返回多条记录 Map<Integer,Employee>
key -> @MapKey("column")标注在接口方法上,表名哪个字段作为Key
value -> 对象
<select id = " " resultTyppe="对象的全类名" />
ResultMap:
一对一:
1.级联属性
<resultMap id="myEmpAndDept" type="org.maple.pojo.Employee">
<id column="id" property="id"/>
<result column="last_name" property="name"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<result column="did" property="dept.id"/>
<result column="deptName" property="dept.deptName"/>
</resultMap>
<select id="getEmpAndDeptById" resultMap="myEmpAndDept">
2.association
<resultMap id="myEmpAndDept2" type="org.maple.pojo.Employee">
<id column="id" property="id"/>
<result column="last_name" property="name"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<association property="dept" javaType="org.maple.pojo.Department">
<id column="did" property="id"/>
<result column="deptName" property="deptName"/>
</association>
</resultMap>
3.association 分布查询
<association property="dept" select="org.maple.mapper.DepartmentMapper.getDeptById" column="d_id"/>
一对多
collection查询
<!-- 要通过id查询部门信息和所有员工 -->
<resultMap id="myDept" type="org.maple.pojo.Department">
<id column="id" property="id"/>
<result column="dept_name" property="deptName"/>
<!--定义集合时,使用collection属性-->
<collection property="emps" ofType="org.maple.pojo.Employee">
<id column="eId" property="id"/>
<result column="last_name" property="name"/>
<result column="gender" property="gender"/>
<result column="email" property="email"/>
</collection>
</resultMap> collection分部查询
<resultMap id="myDeptStep" type="org.maple.pojo.Department">
<id column="id" property="id"/>
<result column="dept_name" property="deptName"/>
<collection property="emps" select="org.maple.mapper.EmployeeMapper.findEmpsById" column="id"></collection>
</resultMap>
update,delete,insert:返回Integer,Long,Boolean,void
1.返回List
返回集合类型,resultType中写集合中元素的类型
/**
* 返回List集合
*/
List<Employee> getEmpsByNameLike(String name);
<!--如果返回的是集合,resultType需要写集合中元素的类型-->
<select id="getEmpsByNameLike" resultType="org.maple.pojo.Employee">
SELECT id,last_name name,email,gender
FROM tbl_employee
WHERE last_name like concat('%',#{name},'%');
</select>
Employee{id=1, name='tom', gender=0, email='tom@atguigu.com'}
Employee{id=8, name='rose', gender=1, email='rose@qq.com'}
Employee{id=9, name='zhaozhihao', gender=1, email='chenquan@qq.com'}
Employee{id=12, name='nihao', gender=1, email='nihao@qq.com'}
2.返回Map
1.返回的一条记录的map
key:字段名
value:表中的名字
/**
* 返回一条记录map,key就是列名,值就是表中的值
*/
Map<String,Object> getEmpByIdReturnMap(Integer id);
<!--如果返回的是map,resultType需要写map,mybatis为常用类起了别名-->
<select id="getEmpByIdReturnMap" resultType="map">
SELECT id,last_name name,email,gender
FROM tbl_employee
WHERE id = #{id}
</select>
{gender=0, name=tom, id=1, email=tom@atguigu.com}
2.返回多条记录的map
Map<column,Employee>
key:哪个字段作为key,使用@MapKey("column")
value:封装对象
/**
* 多条记录封装Map,Map<Integer,Employee>
* @MapKey 告诉mybaits使用哪个属性封装成map的key
*/
@MapKey("id")
Map<Integer,Employee> getEmpByNameLikeReturnMap(String name);
<!--如果返回的是map,封装成emp,resultType需要写Employee-->
<select id="getEmpByNameLikeReturnMap" resultType="org.maple.pojo.Employee">
SELECT id,last_name name,email,gender
FROM tbl_employee
WHERE last_name like concat('%',#{name},'%');
</select>
{1=Employee{id=1, name='tom', gender=0, email='tom@atguigu.com'},
8=Employee{id=8, name='rose', gender=1, email='rose@qq.com'},
9=Employee{id=9, name='zhaozhihao', gender=1, email='chenquan@qq.com'},
12=Employee{id=12, name='nihao', gender=1, email='nihao@qq.com'}}
3.ResultMap
1.简单的使用
/**
* 根据id查询员工
*/
Employee getEmpById(Integer id);
<mapper namespace="org.maple.mapper.EmployeeMapperPlus"> <!--resultMap 自定义封装规则-->
<!--
id:唯一id,方便引用
type:自定义规则的java类型
-->
<resultMap id="MyEmp" type="org.maple.pojo.Employee">
<!--
id 主键的封装规则,底层会有优化
column 数据库中字段
property javaBean中的字段
-->
<id column="id" property="id"/>
<result column="last_name" property="name"/>
<!--其他不指定的列,如果名字一样,会自动封装。但是写resultMap建议都写上-->
<result column="email" property="email"/>
<result column="gender" property="gender"/>
</resultMap> <!--简单的使用resultMap-->
<select id="getEmpById" resultMap="MyEmp">
SELECT id,last_name,email,gender
FROM tbl_employee
WHERE id = #{id}
</select> </mapper>
2.多表使用(一对一)
public class Employee { private Integer id; private String name; private Character gender; private String email; private Department dept;
}
public class Department { private Integer id;
private String deptName;
}
2.1 第一种规则
级联属性的方式
/**
* 根据id查出员工和部门信息
*/
Employee getEmpAndDeptById(Integer id);
<!--1.级联属性的方式-->
<resultMap id="myEmpAndDept" type="org.maple.pojo.Employee">
<id column="id" property="id"/>
<result column="last_name" property="name"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<result column="did" property="dept.id"/>
<result column="deptName" property="dept.deptName"/>
</resultMap> <select id="getEmpAndDeptById" resultMap="myEmpAndDept">
SELECT e.id,e.last_name,e.email,e.gender,d.id did,d.dept_name deptName
FROM tbl_employee e
INNER JOIN tbl_dept d
ON e.d_id = d.id
WHERE e.id = #{id}
</select>
2.2 第二种规则(association定义对象)
association: property 是 Employee对象中的属性,javaType是指该属性属于哪个javaBean
<!--2.使用association-->
<resultMap id="myEmpAndDept2" type="org.maple.pojo.Employee">
<id column="id" property="id"/>
<result column="last_name" property="name"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<association property="dept" javaType="org.maple.pojo.Department">
<id column="did" property="id"/>
<result column="deptName" property="deptName"/>
</association>
</resultMap>
2.3 第三种规则(分部查询,association)
假设之前部门的mapper中已经定义了通过部门id查找部门信息,那么我们就可以通过分部查询来查询出员工信息和部门信息
/**
* 根据id查出员工和部门信息,分部查询
*/
Employee getEmpAndDeptByIdStep(Integer id);
<!--使用association进行分布查询-->
<resultMap id="myEmpAndDeptStep" type="org.maple.pojo.Employee">
<id column="id" property="id" />
<result column="last_name" property="name"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<!--property:Employee中的属性
select:调用DepartmentMapper中的查询方法 命名空间+方法
column:传给select 方法哪个参数
-->
<association property="dept" select="org.maple.mapper.DepartmentMapper.getDeptById" column="d_id"/>
</resultMap> <select id="getEmpAndDeptByIdStep" resultMap="myEmpAndDeptStep">
select id,last_name,gender,email,d_id from tbl_employee where id = #{id}
</select>
分部查询的好处,可以实现懒加载:当只需要调用员工的信息时,第二条sql语句就不会发出,知道需要调用部门的信息,才会发sql语句
通过在全局配置文件中添加:
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
3.多表的使用(一对多)
public class Department { private Integer id;
private String deptName;
private List<Employee> emps;
}
1. 嵌套结果集的方式
/**
* 根据id查询部门信息和所有员工
*/
Department getDeptAndEmpsById(Integer id);
<!-- 要通过id查询部门信息和所有员工 -->
<resultMap id="myDept" type="org.maple.pojo.Department">
<id column="id" property="id"/>
<result column="dept_name" property="deptName"/>
<!--定义集合时,使用collection属性-->
<collection property="emps" ofType="org.maple.pojo.Employee">
<id column="eId" property="id"/>
<result column="last_name" property="name"/>
<result column="gender" property="gender"/>
<result column="email" property="email"/>
</collection>
</resultMap> <select id="getDeptAndEmpsById" resultMap="myDept">
SELECT d.id,d.dept_name,e.id eId,e.last_name,e.gender,e.email
FROM tbl_dept d
LEFT JOIN tbl_employee e
ON d.id = e.d_id
WHERE d.id = #{id}
</select>
2.分部查询的方式
/**
* 根据id 分部查询出部门信息和所有员工
*/
Department getDeptAndEmpsByIdStep(Integer id);
<!--分部查询-->
<resultMap id="myDeptStep" type="org.maple.pojo.Department">
<id column="id" property="id"/>
<result column="dept_name" property="deptName"/>
<collection property="emps" select="org.maple.mapper.EmployeeMapper.findEmpsById" column="id"></collection>
</resultMap> <select id="getDeptAndEmpsByIdStep" resultMap="myDeptStep">
SELECT id,dept_name
FROM tbl_dept
WHERE id = #{id}
</select>
<MyBatis>入门五 查询的返回值处理的更多相关文章
- MyBatis查询,返回值Map或List<Map>
一.返回值Map 1.mapper.xml <select id="selectUserMapLimitOne" resultType="java.util.Has ...
- mybatis的增删改查返回值小析(六)
本文验证了通过mybatis访问数据库时的,增删改查的返回值情况. 直接看代码. 1.service层 /** *@Author: Administrator on 2020/3/12 15:15 * ...
- 获取动态SQL查询语句返回值(sp_executesql)
在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值 ...
- MyBatis insert/delete/update 的返回值
insert,返回值是:新插入行的主键(primary key):需要包含<selectKey>语句,才会返回主键,否则返回值为null. <insert id="inse ...
- mybatis调用存储过程获得取返回值
总体思路:map传值 controller: Map<String,Object> m=new HashMap<String,Object>(); m.put("na ...
- C# lambda查询带返回值
问题来源: <深入理解C#(第3版)> 11页 具体如下: var lists=new List<string>{"111","222" ...
- Python3入门系列之-----return返回值,我终于懂了
前言 初学者学习return的用法有点蒙,不知道它的作用是什么?返回的是什么?在什么时候要用?小伙伴也可能会遇到和我同样的困扰,给大家举个例子,马上就明白了. 同一段代码,函数中带return和没有r ...
- MyBatis参数条件查询传入的值为0时的判断
MyBatis条件查询对字段判断是否为空一般为: <if test="testValue!=null and testValue != ''"> and test_va ...
- spring+mybatis下delete和insert返回值-2147482646
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"&g ...
随机推荐
- ubuntu安装Android Studio
参考 https://developer.android.com/guide/?hl=zh-CN 下载 https://developer.android.com/studio/?hl=zh-CN 解 ...
- BZOJ_3133_[Baltic2013]ballmachine_堆+倍增
BZOJ_3133_[Baltic2013]ballmachine_堆+倍增 Description 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树 ...
- [Codeforces 339D] Xenia and Bit Operations
[题目链接] https://codeforces.com/problemset/problem/339/D [算法] 线段树模拟即可 时间复杂度 :O(MN) [代码] #include<bi ...
- 【SCOI 2007】 降雨量
[题目链接] 点击打开链接 [算法] 线段树 此题细节很多,写程序时要细心! [代码] #include<bits/stdc++.h> using namespace std; #defi ...
- openStack Aio 环境的neutron agent-list和cluster 环境 CLI结果对比
- 最短路径(Dijkstra算法)
当用图结构来表示通信.交通等网络,权重代表距离或者成本,寻找最短路径就成为了一个重要的任务. 给定带权网络G=(V;E),源点s,对于其他所有顶点v,寻找s到v的最短路径,连接成一颗最短路径树.可以证 ...
- $CF241D\ Numbers$
problem 题目大意: 给你n个数和p,都小于50000要求留下若干个数字,使得剩下的数字异或为0,并且从左到右串联起来可以被p整除,求一种这样的方案. 搜索 #include <bits/ ...
- [Qt Creator 快速入门] 第8章 界面外观
一个完善的应用程序不仅应该有实用的功能,还要有一个漂亮的外观,这样才能使应用程序更加友好,更加吸引用户.作为一个跨平台的UI开发框架,Qt提供了强大而灵活的界面外观设计机制.这一章将学习在Qt中设计应 ...
- GIT学习之路第一天 简介及其安装
本文参考廖雪峰老师的博客进行总结,完整学习请转廖雪峰博客 Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git有什么特点?简单来说就是:高端大气上档次! 那什么是版本控制 ...
- hdu2031
http://acm.hdu.edu.cn/showproblem.php?pid=2031 #include<stdio.h> #include<math.h> #inclu ...