李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
03.MyBatis各种查询功能
Leefs
2022-12-06 PM
742℃
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
43
标签云
JVM
微服务
算法
Linux
数据结构
查找
Java工具类
Jquery
MySQL
JavaWeb
Jenkins
Spark Streaming
Java
队列
Elasticsearch
Docker
数据结构和算法
Java编程思想
Flume
Spark
哈希表
Beego
SpringBoot
Spark SQL
RSA加解密
Nacos
SQL练习题
Shiro
GET和POST
CentOS
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞