历史文章(文章累计480+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
EasyPoi实战系列集合
MyBatis-Plus是什么以及特性[MyBatis-Plus系列] - 第481篇
MyBatis-Plus快速开始[MyBatis-Plus系列] - 第482篇
MyBatis-Plus快速实现增删改[MyBatis-Plus系列] - 第483篇
师傅:徒儿,最近看你状态还不错来着~
悟纤:必须的必~
师傅:有何喜事,分享一下来着。
悟纤:最近感情顺了很多~前些日子差点要搞emo,隔三差五就要来一波小情绪,真的是没法搞。
师傅:有何感悟可以分享一下?
悟纤:每天生活在一起,问题会比较快爆发出来。这个时候吗,就看两个人的情绪稳定性以及对对方的喜欢和包容程度了,越喜欢包容度会越高,存在的问题也会比较少。
师傅:看来这一次,徒儿这是动真格了,恭喜恭喜,情绪管理和耐心又升级了一个段位。
悟纤:每个女人都是一所大学~^_^
师傅:那倒是~ 但这所大学无法教会你技术哦~ 技术还得自己学习来着。
悟纤:技术是生存的根本,徒儿不能丢,Good good study,day day up!
导读
Hi,大家好,我是悟纤。我就是我,不一样的烟火。我就是我,与众不同的小苹果。
在前面有个小节中,就有查询的例子了,为什么这类要单独罗列出来一个篇章呢?
在实际的项目中,删除是最简单的,一般大部分的需求场景根据id删除;对于创建和修改可以认为是一个事情,当然如果是修改状态的话,那么就是单个字段的修改,大同小异。
因此在项目中最难的是查询操作,如果是单表查询,那到还好,但是如果是多表查询的话,那么复杂程度会增加;再者就是业务场景中常见的分页查询。
关于如何快速开始使用MyBatis-Plus,可以关注公众号「SpringBoot」,
回复关键字「483」查看相应的文章。
EasyPoi实战系列:
01.《MyBatis-Plus是什么以及特性[MyBatis-Plus系列]-第482篇》
02.《MyBatis-Plus快速开始 [MyBatis-Plus系列]-第483篇》
03.《MyBatis-Plus快速实现增删改 [MyBatis-Plus系列]-第484篇》
一、普通查询
先来看下普通查询(未分页),这种查询很简单,就是查询条件如何进行设置,常规的查询条件就是等于,大于,小于,模糊查询之类的。
2.1 查询所有数据
没有条件的查询,使用的方法是selectList:
@Test
public void testSelectAll() {
List
userList = userMapper.selectList(null); userList.forEach(System.out::println);
}
运行结果:
说明:这里的执行信息的打印还是很清晰的。
(1)预执行的SQL:SELECT id,name,age,email FROM user
(2)Parameters:参数(这里没有条件参数)
(3)Columns/Row:返回的列名和每一行的信息。
(4)Total:总共返回的行数。
2.2 条件查询
在实际项目讲数据库所有数据都查出来的这样子的需求毕竟是少数,更多的是场景是根据某个查询条件进行查询,比如id查询、名称模糊查询,年龄大于查询等。
(-)根据id进行查询:
@Test
public void testSelectById() {
User user = userMapper.selectById(1L);
System.out.println(user);
}
运行结果:
说明:
(1)预执行的SQL:SELECT id,name,age,email FROM user WHERE id=?
(2)Parameters:参数,这里1是id=1的查询条件
(3)Columns/Row:返回的列名和每一行的信息。
(4)Total:总共返回的行数。
(-)名称模糊查询:
模糊插叙在实际的业务场景中,经常会碰到,比如:电商系统中根据商品的名称、描述、标签之类的进行模糊查询;在社交app中,通过模糊搜索自己关注的网友…
@Test
public void testSelectLike() {
QueryWrapper
wrapper = new QueryWrapper(); wrapper.like("name","悟");
List
userList = userMapper.selectList(wrapper); userList.forEach(System.out::println);
}
运行结果:
这种写法也可以通过eq方法来实现通过id查询的方式:
@Test
public void testSelectById2() {
QueryWrapper
wrapper = new QueryWrapper(); wrapper.eq("id",1);
List
userList = userMapper.selectList(wrapper); userList.forEach(System.out::println);
}
运行结果:
这里可以在调整的地方,通过id进行查询,数据很明显只有1条,那么可以调用参数相同的另外一个方法selectOne:
@Test
public void testSelectById3() {
QueryWrapper
wrapper = new QueryWrapper(); wrapper.eq("id",1);
User user = userMapper.selectOne(wrapper);
System.out.println(user);
}
说明:执行结果是一样的,区别就在两个方法的返回值,一个集合List,一个注解是实体对象User。
(3)大于查询:
常规的查询都是使用到QueryWrapper,这个类提供了很多开箱即用的方法:等于、大于、小于、between区间…
对于需求查询出年龄21以上的,可以这么做:
@Test
public void testSelectGT() {
QueryWrapper
wrapper = new QueryWrapper(); wrapper.gt("age",21);
List
userList = userMapper.selectList(wrapper); userList.forEach(System.out::println);
}
运行结果:
说明需求是年龄大于等于21岁的,可以使用方法ge("age",21)。
(4)自定义查询语句:
有些时候,框架提供的约定的方法无法满足产品需求,这个时候可以使用自定义查询语句的方式:
@Test
public void testSelectApply() {
QueryWrapper
wrapper = new QueryWrapper(); wrapper.apply("email like {0} and age>={1}","%qq.com%",18);
List
userList = userMapper.selectList(wrapper); userList.forEach(System.out::println);
}
运行结果:
2.3 自定义查询字段
在开发的时候,前端页面并不会展示数据库中的所有字段,那么这个时候,只需要返回某些字段就可以:
@Test
public void testSelectPointFields() {
QueryWrapper
wrapper = new QueryWrapper(); wrapper.select("id","name");
wrapper.ge("age",21);//gt、ge
List
userList = userMapper.selectList(wrapper); userList.forEach(System.out::println);
}
运行结果:
说明:从运行结果来看这个时候,就只返回字段id和name了。
二、分页查询
由于数据一般都会比较多,一次性返回会撑爆服务器的内存,另外返回那么多的数据意义也不是很大,所以在实际的项目中,都会做分页查询。
对于MyBatis-Plus也提供了开箱即用的分页方法进行使用,在使用之前需要先做一个添加一个配置:
package com.kfit.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//Spring boot方式
@Configuration
public class MybatisPlusConfig {
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
// 旧版
// @Bean
// public PaginationInterceptor paginationInterceptor() {
// PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// // paginationInterceptor.setOverflow(false);
// // 设置最大单页限制数量,默认 500 条,-1 不受限制
// // paginationInterceptor.setLimit(500);
// // 开启 count 的 join 优化,只针对部分 left join
// paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
// return paginationInterceptor;
// }
}
要将mybatisPlusInterceptor 这个方法注册到Bean里面,不然插件就会失效。
分页查询代码:
@Test
public void testSelectPage() {
QueryWrapper
wrapper = new QueryWrapper(); IPage
page = new Page<>(2,3); page = userMapper.selectPage(page,wrapper);
long total = page.getTotal();//总条数
long pageNum = page.getCurrent();//当前页码
long pageSize = page.getSize();//每页显示条数
List
records = page.getRecords();//记录数据 System.out.println("total:"+total+",pageNum:"+pageNum+",pageSize:"+pageSize);
}
说明:定义分页查询对象Page,调用selectPage()方法。
运行结果:
说明:通过结果可以看出,这里会执行两次的SQL,一次就是查询符合条件的总记录数,一次就是通过limit查询出分页数据。
小结
这一节讲解了查询相关的以及如何分页查询,来总结本节的重点:
(1)普通查询主要是使用到的方法:selectList()、selectById()、selectOne()。
(2)分页查询:selectPage(page,wrapper)。
(3)条件类:查询是QueryWrapper,修改/删除是UpdateWrapper。
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
à悟纤学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
ShardingJDBC分库分表:http://t.cn/A6ZarrqS
分布式事务解决方案:http://t.cn/A6ZaBnIr
JVM内存模型调优实战:http://t.cn/A6wWMVqG
Spring入门到精通:https://t.cn/A6bFcDh4
大话设计模式之爱你:https://dwz.cn/wqO0MAy7