MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用
转自:https://www.jb51.net/article/239792.htm
首先创建一个数据库表,如下图所示:
然后创建一个Spring Boot项目,pom.xml和配置如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>org.kaven</groupId> 8 <artifactId>mybatis-plus</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 <parent> 12 <groupId>org.springframework.boot</groupId> 13 <artifactId>spring-boot-starter-parent</artifactId> 14 <version>2.3.4.RELEASE</version> 15 <relativePath/> 16 </parent> 17 18 <properties> 19 <java.version>1.8</java.version> 20 </properties> 21 22 <dependencies> 23 <dependency> 24 <groupId>org.springframework.boot</groupId> 25 <artifactId>spring-boot-starter</artifactId> 26 </dependency> 27 <dependency> 28 <groupId>org.springframework.boot</groupId> 29 <artifactId>spring-boot-starter-test</artifactId> 30 </dependency> 31 <dependency> 32 <groupId>org.springframework.boot</groupId> 33 <artifactId>spring-boot-starter-webflux</artifactId> 34 </dependency> 35 <dependency> 36 <groupId>com.baomidou</groupId> 37 <artifactId>mybatis-plus-boot-starter</artifactId> 38 <version>3.4.0</version> 39 </dependency> 40 <dependency> 41 <groupId>mysql</groupId> 42 <artifactId>mysql-connector-java</artifactId> 43 <version>5.1.49</version> 44 </dependency> 45 <dependency> 46 <groupId>org.projectlombok</groupId> 47 <artifactId>lombok</artifactId> 48 </dependency> 49 </dependencies> 50 51 <build> 52 <plugins> 53 <plugin> 54 <groupId>org.springframework.boot</groupId> 55 <artifactId>spring-boot-maven-plugin</artifactId> 56 </plugin> 57 </plugins> 58 </build> 59 </project>
application.yml配置:
spring: application: name: mybatis-plus datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: ITkaven@123 url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false server: port: 8085 logging: level: root: warn com.kaven.mybatisplus.dao: trace pattern: console: '%p%m%n' mybatis-plus: mapper-locations: classpath:mappers/*.xml
实体类User:
1 package com.kaven.mybatisplus.entity; 2 3 import com.baomidou.mybatisplus.annotation.TableField; 4 import com.baomidou.mybatisplus.annotation.TableId; 5 import com.baomidou.mybatisplus.annotation.TableName; 6 import lombok.Data; 7 8 @TableName("user") 9 @Data 10 public class User { 11 12 @TableId 13 private String id; 14 15 @TableField("username") 16 private String username; 17 18 @TableField("password") 19 private String password; 20 21 @TableField("age") 22 private Integer age; 23 24 /** 25 * 使用 @TableField(exist = false) ,表示该字段在数据库中不存在 ,所以不会插入数据库中 26 * 使用 transient 、 static 修饰属性也不会插入数据库中 27 */ 28 @TableField(exist = false) 29 private String phone; 30 }
启动类:
1 package com.kaven.mybatisplus; 2 3 import org.mybatis.spring.annotation.MapperScan; 4 import org.springframework.boot.SpringApplication; 5 import org.springframework.boot.autoconfigure.SpringBootApplication; 6 7 @SpringBootApplication 8 @MapperScan(basePackages = "com.kaven.mybatisplus.dao") 9 public class AppRun { 10 public static void main(String[] args) { 11 SpringApplication.run(AppRun.class , args); 12 } 13 }
@MapperScan(basePackages = "com.kaven.mybatisplus.dao")
这个一定要加上。
@MapperScan作用:
我们先在数据库中添加几行数据,方便演示。
selectMaps
来看一下源码:
1 /** 2 * 根据 Wrapper 条件,查询全部记录 3 * 4 * @param queryWrapper 实体对象封装操作类(可以为 null) 5 */ 6 List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
方法返回List<Map<String, Object>>
类型的值,它的应用场景就是当我们只需要对象的一小部分属性或者对象没有的属性时,这种方法就显得很有用了。
我们先不使用selectMaps
来实现一下只需要对象的一部分属性。
1 package com.kaven.mybatisplus.dao; 2 3 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 import com.kaven.mybatisplus.entity.User; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.boot.test.context.SpringBootTest; 10 import org.springframework.test.context.junit4.SpringRunner; 11 12 import java.util.HashMap; 13 import java.util.List; 14 import java.util.Map; 15 16 17 @RunWith(SpringRunner.class) 18 @SpringBootTest 19 public class UserMapperMapsTest { 20 21 @Autowired 22 private UserMapper userMapper; 23 24 @Test 25 public void selectList(){ 26 QueryWrapper<User> userQueryWrapper = Wrappers.query(); 27 28 userQueryWrapper.select(User.class , e -> !e.getColumn().equals("password")).lt("age" , 50); 29 List<User> userList = userMapper.selectList(userQueryWrapper); 30 userList.forEach(System.out::println); 31 } 32 }
结果如下:
结果虽然是正确的,但输出的user
数据中有为null
的属性,当不需要的属性比较多时,这种方法就不太好。
使用selectMaps
来实现一下只需要对象的一部分属性。
1 package com.kaven.mybatisplus.dao; 2 3 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 import com.kaven.mybatisplus.entity.User; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.boot.test.context.SpringBootTest; 10 import org.springframework.test.context.junit4.SpringRunner; 11 12 import java.util.HashMap; 13 import java.util.List; 14 import java.util.Map; 15 16 17 @RunWith(SpringRunner.class) 18 @SpringBootTest 19 public class UserMapperMapsTest { 20 21 @Autowired 22 private UserMapper userMapper; 23 24 @Test 25 public void selectMaps(){ 26 QueryWrapper<User> userQueryWrapper = Wrappers.query(); 27 28 userQueryWrapper.select(User.class , e -> !e.getColumn().equals("password")).lt("age" , 50); 29 List<Map<String , Object>> mapList = userMapper.selectMaps(userQueryWrapper); 30 mapList.forEach(System.out::println); 31 } 32 }
结果如下:
结果也是正确的,并且没有那些为null
的属性值。
再来演示一下selectMaps
怎么返回给我们实体类中不存在的属性。
以age
进行分组,并且每组age
和要小于60
,输出平均age
、最大age
、最小age
。
这个例子可能不太好,但能体现出selectMaps
的方便之处,因为平均age
、最大age
、最小age
是User
实体类中没有的属性。
1 package com.kaven.mybatisplus.dao; 2 3 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 import com.kaven.mybatisplus.entity.User; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.boot.test.context.SpringBootTest; 10 import org.springframework.test.context.junit4.SpringRunner; 11 12 import java.util.HashMap; 13 import java.util.List; 14 import java.util.Map; 15 16 17 @RunWith(SpringRunner.class) 18 @SpringBootTest 19 public class UserMapperMapsTest { 20 21 @Autowired 22 private UserMapper userMapper; 23 24 @Test 25 public void selectMaps2(){ 26 QueryWrapper<User> userQueryWrapper = Wrappers.query(); 27 28 userQueryWrapper.select("avg(age) avg_age" , "min(age) min_age" , "max(age) max_age") 29 .groupBy("age") 30 .having("sum(age) < {0}" , 60); 31 List<Map<String , Object>> mapList = userMapper.selectMaps(userQueryWrapper); 32 mapList.forEach(System.out::println); 33 } 34 }
结果是正确的,可以看一下输出的sql
语句。
selectObjs
看一下源码:
1 /** 2 * 根据 Wrapper 条件,查询全部记录 3 * <p>注意: 只返回第一个字段的值</p> 4 * 5 * @param queryWrapper 实体对象封装操作类(可以为 null) 6 */ 7 List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
从源码的注释中可以看到注意: 只返回第一个字段的值
这句话,我们来演示一下该方法就能明白这句话了。
1 package com.kaven.mybatisplus.dao; 2 3 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 import com.kaven.mybatisplus.entity.User; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.boot.test.context.SpringBootTest; 10 import org.springframework.test.context.junit4.SpringRunner; 11 12 import java.util.HashMap; 13 import java.util.List; 14 import java.util.Map; 15 16 17 @RunWith(SpringRunner.class) 18 @SpringBootTest 19 public class UserMapperOtherTest { 20 21 @Autowired 22 private UserMapper userMapper; 23 24 @Test 25 public void selectObjs(){ 26 QueryWrapper<User> userQueryWrapper = Wrappers.query(); 27 28 userQueryWrapper.select("username" , "age").likeRight("username","k").le("age" , 30); 29 List<Object> objectList = userMapper.selectObjs(userQueryWrapper); 30 objectList.forEach(System.out::println); 31 } 32 }
结果如下:
很显然,结果是正确的,并且只返回了username
。
selectCount
看一下源码:
1 /** 2 * 根据 Wrapper 条件,查询总记录数 3 * 4 * @param queryWrapper 实体对象封装操作类(可以为 null) 5 */ 6 Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
该方法其实就是返回符合条件的记录数。
我们来演示一下。
1 package com.kaven.mybatisplus.dao; 2 3 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 import com.kaven.mybatisplus.entity.User; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.boot.test.context.SpringBootTest; 10 import org.springframework.test.context.junit4.SpringRunner; 11 12 import java.util.HashMap; 13 import java.util.List; 14 import java.util.Map; 15 16 17 @RunWith(SpringRunner.class) 18 @SpringBootTest 19 public class UserMapperOtherTest { 20 21 @Autowired 22 private UserMapper userMapper; 23 24 @Test 25 public void selectCount(){ 26 QueryWrapper<User> userQueryWrapper = Wrappers.query(); 27 28 userQueryWrapper.likeRight("username","k").le("age" , 30); 29 Integer count = userMapper.selectCount(userQueryWrapper); 30 System.out.println(count); 31 } 32 }
结果如下:
结果也是正确的。
结果也是正确的。
selectOne
也来看一下源码:
1 /** 2 * 根据 entity 条件,查询一条记录 3 * 4 * @param queryWrapper 实体对象封装操作类(可以为 null) 5 */ 6 T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
这个方法会返回一个实体,所以,如果有多条数据匹配的话,就会报错。
我们来演示一下报错的情况。
1 package com.kaven.mybatisplus.dao; 2 3 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 import com.kaven.mybatisplus.entity.User; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.boot.test.context.SpringBootTest; 10 import org.springframework.test.context.junit4.SpringRunner; 11 12 import java.util.HashMap; 13 import java.util.List; 14 import java.util.Map; 15 16 17 @RunWith(SpringRunner.class) 18 @SpringBootTest 19 public class UserMapperOtherTest { 20 21 @Autowired 22 private UserMapper userMapper; 23 24 @Test 25 public void selectOneError(){ 26 QueryWrapper<User> userQueryWrapper = Wrappers.query(); 27 28 userQueryWrapper.like("username","k"); 29 User user = userMapper.selectOne(userQueryWrapper); 30 System.out.println(user); 31 } 32 }
报错如下:
再来演示一下正确的情况。
1 package com.kaven.mybatisplus.dao; 2 3 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 import com.kaven.mybatisplus.entity.User; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.boot.test.context.SpringBootTest; 10 import org.springframework.test.context.junit4.SpringRunner; 11 12 import java.util.HashMap; 13 import java.util.List; 14 import java.util.Map; 15 16 17 @RunWith(SpringRunner.class) 18 @SpringBootTest 19 public class UserMapperOtherTest { 20 21 @Autowired 22 private UserMapper userMapper; 23 24 @Test 25 public void selectOne(){ 26 QueryWrapper<User> userQueryWrapper = Wrappers.query(); 27 28 userQueryWrapper.like("username","kaven"); 29 User user = userMapper.selectOne(userQueryWrapper); 30 System.out.println(user); 31 } 32 }
结果如下:
结果是正确的。
到此这篇关于MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用的文章就介绍到这了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2018-11-10 spring自定义类中@AutoWired标识的元素注入为null
2018-11-10 mysql中min和max查询优化
2018-11-10 Mysql千万级大数据量查询优化
2018-11-10 mybatis中sql标签、where标签、foreach标签用法
2018-11-10 阿里jstorm和storm区别
2018-11-10 jstorm简介