李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
03.MyBatis各种查询功能
Leefs
2022-12-06 PM
1540℃
0条
[TOC] ### 前言 使用`Mybatis`进行查询的时候,查询出来的数据可能有一条数据,也可能是多条,我们就得根据返回数据的条数来指定返回类型,如果记录是多条,那么返回值类型就不能是实体类。 **如果查询出的数据只有一条,可以通过:** 1. 实体类对象接收 2. List集合接收 3. Map集合接收,结果`{password=123456, sex=男, id=1, age=23, username=admin}` **如果查询出的数据有多条,一定不能用实体类对象接收,会抛异常`TooManyResultsException`,可以通过**: 1. 实体类类型的List集合接收 2. Map类型的List集合接收 3. 在mapper接口的方法上添加`@MapKey`注解 ### 一、查询一个实体类对象 > 需求:根据用户id查询用户信息 + **Mapper接口** ```java /** * 根据id查询用户信息 */ User getUserById(@Param("id") Integer id); ``` + **MyBatis SQL语句** ```xml
select * from t_user where id = #{id}
``` + **测试代码** ```java @Test public void testGetUserById(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); System.out.println(mapper.getUserById(3)); } ``` **运行结果** ``` DEBUG 12-06 20:42:20,336 ==> Preparing: select * from t_user where id = ? (BaseJdbcLogger.java:137) DEBUG 12-06 20:42:20,390 ==> Parameters: 3(Integer) (BaseJdbcLogger.java:137) DEBUG 12-06 20:42:20,440 <== Total: 1 (BaseJdbcLogger.java:137) User{id=3, username='Leefs', password='123456', age=23, sex='男', email='123@qq.com'} ``` **说明** 通过id查询用户信息,最多只能查询出一条数据,可以通过实体类对象来接收,也可以通过一个List集合来接收返回结果。 ### 二、查询一个List集合 > 需求:查询所有用户信息 + **Mapper接口** ```java /** * 查询所有的用户信息 */ List
getAllUser(); ``` + **MyBatis SQL语句** ```xml
select * from t_user
``` + **测试代码** ```java @Test public void testGetAllUser(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); System.out.println(mapper.getAllUser()); } ``` **运行结果** ``` DEBUG 12-06 20:53:20,580 ==> Preparing: select * from t_user (BaseJdbcLogger.java:137) DEBUG 12-06 20:53:20,654 ==> Parameters: (BaseJdbcLogger.java:137) DEBUG 12-06 20:53:20,693 <== Total: 3 (BaseJdbcLogger.java:137) [User{id=1, username='admin', password='123456', age=22, sex='男', email='123@qq.com'}, User{id=2, username='李四', password='123', age=23, sex='男', email='123@qq.com'}, User{id=3, username='Leefs', password='123456', age=23, sex='男', email='123@qq.com'}] ``` > 注意 > > + 若sql语句查询的结果为多条时,一定不能以实体类类型作为方法的返回值,否则会抛出`TooManyResultsException` > > + 若sql语句查询的结果为1条时,此时可以使用实体类类型或list集合类型作为方法的返回值 ### 三、查询单个数据 > 需求:查询用户的总数量 + **Mapper接口** ```java /** * 查询用户信息的总记录数 */ Integer getCount(); ``` + **MyBatis SQL语句** ```xml
select count(*) from t_user
``` > 注意 > > MyBatis中为Java中常用的类型设置了类型别名 > > + Integer:`Integer`,int > > + int:`_int`,`_integer` > > + Map:map > > + String:string + **测试代码** ```java @Test public void testGetCount(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); System.out.println(mapper.getCount()); } ``` **运行结果** ``` DEBUG 12-06 21:01:02,389 ==> Preparing: select count(*) from t_user (BaseJdbcLogger.java:137) DEBUG 12-06 21:01:02,458 ==> Parameters: (BaseJdbcLogger.java:137) DEBUG 12-06 21:01:02,487 <== Total: 1 (BaseJdbcLogger.java:137) 3 ``` ### 四、查询一条数据为map集合 > 需求:根据id查询用户信息为map集合 + **Mapper接口** ```java /** * 根据id查询用户信息为一个map集合 */ Map
getUserByIdToMap(@Param("id") Integer id); ``` + **MyBatis SQL语句** ```xml
select * from t_user where id = #{id}
``` + **测试代码** ```java @Test public void testGetUserByIdToMap(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); System.out.println(mapper.getUserByIdToMap(3)); } ``` **运行结果** ``` DEBUG 12-06 21:11:18,488 ==> Preparing: select * from t_user where id = ? (BaseJdbcLogger.java:137) DEBUG 12-06 21:11:18,537 ==> Parameters: 3(Integer) (BaseJdbcLogger.java:137) DEBUG 12-06 21:11:18,572 <== Total: 1 (BaseJdbcLogger.java:137) {password=123456, sex=男, id=3, age=23, email=123@qq.com, username=Leefs} ``` **注意:若查询的结果有的字段的值为null,那么该字段不会存在Map集合中** **实体类和Map集合有什么区别?** > 实体类里的属性就是固定的,而Map集合里的键不固定。 > > 当的查询结果没有相对应的实体类时,就可以通过Map集合来接收查询结果对象。 ### 五、查询多条数据为map集合 > 需求:查询所有的用户信息为map集合 #### 方式一 + **Mapper接口** ```java /** * 查询所有用户信息为map集合 */ List
> getAllUserToMap(); ``` 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,此时可以将这些map放在一个list集合中获取。 + **MyBatis SQL语句** ```xml
select * from t_user
``` #### 方式二 + **Mapper接口** ```java /** * 查询所有用户信息为map集合 */ @MapKey("id")//此主键的作用是将查询出来的结果的id作为map集合的键,结果作为map集合的值 Map
getAllUserToMap(); ``` 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,并且最终要以一个map的方式返回数据,此时需要通过`@MapKey`注解设置map集合的键,值是每条数据所对应的map集合 + **MyBatis SQL语句** ```xml
select * from t_user
``` **测试代码**(方法一和方法二相同) ```java @Test public void testGetAllUserToMap(){ SqlSession sqlSession = SqlSessionUtils.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); System.out.println(mapper.getAllUserToMap()); } ``` **结果:方法一** ``` DEBUG 12-06 21:33:17,900 ==> Preparing: select * from t_user (BaseJdbcLogger.java:137) DEBUG 12-06 21:33:17,951 ==> Parameters: (BaseJdbcLogger.java:137) DEBUG 12-06 21:33:17,996 <== Total: 3 (BaseJdbcLogger.java:137) [{password=123456, sex=男, id=1, age=22, email=123@qq.com, username=admin}, {password=123, sex=男, id=2, age=23, email=123@qq.com, username=李四}, {password=123456, sex=男, id=3, age=23, email=123@qq.com, username=Leefs}] ``` **结果:方法二** ``` DEBUG 12-06 21:34:11,725 ==> Preparing: select * from t_user (BaseJdbcLogger.java:137) DEBUG 12-06 21:34:11,822 ==> Parameters: (BaseJdbcLogger.java:137) DEBUG 12-06 21:34:11,853 <== Total: 3 (BaseJdbcLogger.java:137) {1={password=123456, sex=男, id=1, age=22, email=123@qq.com, username=admin}, 2={password=123, sex=男, id=2, age=23, email=123@qq.com, username=李四}, 3={password=123456, sex=男, id=3, age=23, email=123@qq.com, username=Leefs}} ``` *附参考文章地址* *《尚硅谷MyBatis教程》*
标签:
MyBatis
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2667.html
上一篇
02.MyBatis获取参数值的两种方式
下一篇
04.MyBatis特殊SQL执行
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
SpringBoot
Zookeeper
数据结构
Eclipse
Linux
BurpSuite
Nacos
线程池
Spark RDD
Netty
Java工具类
JavaSE
Beego
随笔
SpringCloud
RSA加解密
国产数据库改造
队列
前端
pytorch
ajax
Elastisearch
链表
持有对象
Kafka
NIO
并发编程
锁
二叉树
数学
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭