历史文章(文章累计480+)
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:
@Testpublic void testSelectAll() { List<User> 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进行查询:
@Testpublic 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中,通过模糊搜索自己关注的网友...
@Testpublic void testSelectLike() { QueryWrapper<User> wrapper = new QueryWrapper(); wrapper.like("name","悟"); List<User> userList = userMapper.selectList(wrapper); userList.forEach(System.out::println);}
运行结果:
这种写法也可以通过eq方法来实现通过id查询的方式:
@Testpublic void testSelectById2() { QueryWrapper<User> wrapper = new QueryWrapper(); wrapper.eq("id",1); List<User> userList = userMapper.selectList(wrapper); userList.forEach(System.out::println);}
运行结果:
这里可以在调整的地方,通过id进行查询,数据很明显只有1条,那么可以调用参数相同的另外一个方法selectOne:
@Testpublic void testSelectById3() { QueryWrapper<User> wrapper = new QueryWrapper(); wrapper.eq("id",1); User user = userMapper.selectOne(wrapper); System.out.println(user);}
说明:执行结果是一样的,区别就在两个方法的返回值,一个集合List,一个注解是实体对象User。
(3)大于查询:
常规的查询都是使用到QueryWrapper,这个类提供了很多开箱即用的方法:等于、大于、小于、between区间...
对于需求查询出年龄21以上的,可以这么做:
@Testpublic void testSelectGT() { QueryWrapper<User> wrapper = new QueryWrapper(); wrapper.gt("age",21); List<User> userList = userMapper.selectList(wrapper); userList.forEach(System.out::println);}
运行结果:
说明需求是年龄大于等于21岁的,可以使用方法ge("age",21)。
(4)自定义查询语句:
有些时候,框架提供的约定的方法无法满足产品需求,这个时候可以使用自定义查询语句的方式:
@Testpublic void testSelectApply() { QueryWrapper<User> wrapper = new QueryWrapper(); wrapper.apply("email like {0} and age>={1}","%qq.com%",18); List<User> userList = userMapper.selectList(wrapper); userList.forEach(System.out::println);}
运行结果:
2.3 自定义查询字段
在开发的时候,前端页面并不会展示数据库中的所有字段,那么这个时候,只需要返回某些字段就可以:
@Testpublic void testSelectPointFields() { QueryWrapper<User> wrapper = new QueryWrapper(); wrapper.select("id","name"); wrapper.ge("age",21);//gt、ge List<User> 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方式@Configurationpublic 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里面,不然插件就会失效。
分页查询代码:
@Testpublic void testSelectPage() { QueryWrapper<User> wrapper = new QueryWrapper(); IPage<User> page = new Page<>(2,3); page = userMapper.selectPage(page,wrapper); long total = page.getTotal();//总条数 long pageNum = page.getCurrent();//当前页码 long pageSize = page.getSize();//每页显示条数 List<User> 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