前言
为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)
五、CRUD进阶开发I
1.mp日志简化(加快程序运行速度)
- 在application.yml中添加配置
# 开启mp日志 (输出到控制台) mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 运行结果(多了很多查询结果的详细信息)
- 进一步简化控制台输出
- 编辑applicatiion.yml(输入banner就会有对应提示)
- 创建logback.xml并编写该配置文件
<?xml version="1.0" encoding="UTF-8"?> <configuration> </configuration>
- 简化后的控制台输出(spring加载与mybatis-plus加载相关信息不再显示)
2.条件查询的三种方式
- 方式一:常规写法按条件查询
- 在测试类的查询全部方法 selectList() 方法上ctrl + 鼠标左键进入该方法的源代码,可知当 selectList() 方法的参数为null的时候代表查全部,当参数为Wrapper类的时候代表按该类的限制条件查询
- 在Wrapper上ctrl + 鼠标左键进入该类源码,然后crtl + H查看该类的继承体系,可知该类是个抽象类,无法直接使用,此处我们选用该类的实现类QueryWrapper类来实现限制条件的编写
- 在测试类的 testGetAll() 方法中编写按条件查询的代码
@Test void testGetAll() { //按条件查询 //创建QueryWrapper类对象 QueryWrapper qw = new QueryWrapper<>(); //编写限制条件(查询年龄小于18岁的用户信息) //lt代表 < gt代表 >,第一个参数是列名,第二个参数是限制条件的数值 qw.lt("age", 18); //将条件Wrapper<T>类型的参数qw传入selectList()方法中 List<User> userList = userDao.selectList(qw); System.out.println(userList); }
- 运行结果
可以看到只查询了2条记录(原表有4条记录)
2. 方式二:lambda格式按条件查询I
- 常规写法中的列名是写在字符串里的,出错不容易发现,可以借助lambda表达式确保列名不会写错,注意QuerWrapper接口后面要注入实体类
@Test void testGetAll() { //方式二:lambda格式按条件查询I //创建QueryWrapper类对象,并指定泛型 QueryWrapper<User> qw = new QueryWrapper<User>(); //编写限制条件(查询年龄大于18岁的用户) //lt代表 < gt代表 >,第一个参数是列名,第二个参数是限制条件的数值 qw.lambda().gt(User::getAge, 18); //将条件Wrapper<T>类型的参数qw传入selectList()方法中 List<User> userList = userDao.selectList(qw); System.out.println(userList); }
- 运行结果
- 方式三:lambda格式按条件查询II(推荐)
@Test void testGetAll() { //方式三:lambda格式按条件查询II //创建LambdaQueryWrapper类对象,并指定泛型 LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //编写限制条件(查询年龄小于4岁的用户) //lt代表 < gt代表 >,第一个参数是列名,第二个参数是限制条件的数值 lqw.lt(User::getAge, 4); //将条件Wrapper<T>类型的参数lqw传入selectList()方法中 List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
- 运行结果
- 多条件查询(举例)
- and逻辑(比如 x > 3 并且 x < 10)
@Test void testGetAll() { //方式三:lambda格式多条件查询 //创建LambdaQueryWrapper类对象,并指定泛型 LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //编写限制条件(查询大于3岁小于10岁的用户) //lt代表 < gt代表 >,第一个参数是列名,第二个参数是限制条件的数值 //链式编程 lqw.lt(User::getAge, 10).lqw.gt(User::getAge, 3); //将条件Wrapper<T>类型的参数传入selectList()方法中 List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
- 运行结果
- or逻辑 (比如 x < 3 或者 x > 10)
@Test void testGetAll() { //方式三:lambda格式按条件查询 //创建LambdaQueryWrapper类对象,并指定泛型 LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //编写限制条件(查詢年齡大10岁或者小于4岁的用户) //lt代表 < gt代表 >,第一个参数是列名,第二个参数是限制条件的数值 //链式编程 lqw.gt(User::getAge, 10). or().lt(User::getAge, 4); //将条件Wrapper<T>类型的参数传入selectList()方法中 List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
- 运行结果
3.条件查询null判断
- 应用场景举例
当我们在网上购物的时候筛选商品价格区间一般只设置上限或者下限,不设置值的那个输入框需要进行控制判断
- 原本的User类作为下限类,新建一个Userquery类继承User类表示上限
package com.example.dl_mp.domain.query; import com.example.dl_mp.domain.User; import lombok.Data; //@Data 注解的主要作用是提高代码的简洁, // 使用这个注解可以省去代码中大量的get()、 set()、 toString()等方法(这些通用方法可以一键生成); //要使用 @Data 注解要先引入lombok,它是一个工具类库,可以用简单的注解形式来简化代码,提高开发效率。 @Data public class Userquery extends User { //以年龄为例,设置上限属性age2 private Integer age2; }
- 模拟网页传入测试数据
@Test void testGetAll() { //模拟页面传递过来的查询数据 Userquery uq = new Userquery(); uq.setAge(3); uq.setAge2(10); //创建LambdaQueryWrapper类对象,并指定泛型 LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //编写限制条件(查詢年齡大于3岁或者小于10岁的用户) //lt代表 < gt代表 >,第一个参数是列名,第二个参数是限制条件的数值 lqw.gt(User::getAge, uq.getAge()); lqw.lt(User::getAge, uq.getAge2()); //将条件Wrapper<T>类型的参数传入selectList()方法中 List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
- 运行结果(但是如果getAge ()或者getAge2()为空,则查询失败)
- 用if语句判断(太多的if语句程序冗余,能用但是不推荐)
@Test void testGetAll() { //模拟页面传递过来的查询数据 Userquery uq = new Userquery(); //此处不设置下限Age的值 //uq.setAge(3); uq.setAge2(10); //创建LambdaQueryWrapper类对象,并指定泛型 LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //编写限制条件(查詢年齡小于10岁的用户) //lt代表 < gt代表 >,第一个参数是列名,第二个参数是限制条件的数值 if(null != uq.getAge()){ lqw.gt(User::getAge, uq.getAge()); } lqw.lt(User::getAge, uq.getAge2()); //将条件Wrapper<T>类型的参数传入selectList()方法中 List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
- 运行结果
- 用【mybatis-plus条件构造器】的语法格式
@Test void testGetAll() { //模拟页面传递过来的查询数据 Userquery uq = new Userquery(); uq.setAge(3); //此处不设置上限限Age2的值 //uq.setAge2(10); //创建LambdaQueryWrapper类对象,并指定泛型 LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); //编写限制条件(查詢年齡大于3岁的用户) //lt代表 < gt代表 >,第一个参数是列名,第二个参数是限制条件的数值 lqw.lt(null != uq.getAge2(), User::getAge, uq.getAge2()); lqw.gt(null != uq.getAge(), User::getAge, uq.getAge()); //将条件Wrapper<T>类型的参数传入selectList()方法中 List<User> userList = userDao.selectList(lqw); System.out.println(userList); }
- 运行结果