全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like(),between(),orderByAsc()等方法以及分页操作
1. 引言
mybatis
大家都有使用过,既面向对象又灵活可配。不友好的地方是,会随着使用出现大量xml
文件和SQL
语句。
此时,mybatis-plus
应运而生,对mybatis
做了无侵入增强,还可以简化SQL
语句,或者不写SQL
语句。
-
MyBatis-Plus
官网:https://mp.baomidou.com -
MyBatis-Plus
官方文档:https://baomidou.com/pages -
MyBatis-Plus
开发组织:https://gitee.com/baomidou
2. 结构关系
queryWrapper
是mybatis plus
中实现查询的对象封装操作类,其层级关系如下:
上图的字段解释:
-
Wrapper
: 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示 -
AbstractWrapper
: 用于查询条件封装,生成sql
的where
条件 -
AbstractLambdaWrapper
:Lambda
语法使用Wrapper
统一处理解析lambda
获取column
-
LambdaQueryWrapper
:看名称也能明白就是用于Lambda
语法使用的查询Wrapper
-
LambdaUpdateWrapper
:Lambda
更新封装Wrapper
-
QueryWrapper
:Entity
对象封装操作类,不是用lambda
语法 -
UpdateWrapper
:Update
条件封装,用于Entity
对象更新操作
3. 环境配置
- 引入jar包
<properties>
<java.version>1.8</java.version>
<baomidouMybatisPlus.version>3.5.2</baomidouMybatisPlus.version>
</properties>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${baomidouMybatisPlus.version}</version>
</dependency>
- 创建数据源
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`nick_name` varchar(255) NOT NULL,
`age` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8;
INSERT INTO `user` VALUES (1, 'chenxier', '陈希尔', 18);
INSERT INTO `user` VALUES (2, 'zhangsan', '张三', 22);
INSERT INTO `user` VALUES (3, 'lisi', '李四', 20);
INSERT INTO `user` VALUES (4, 'wanger', '王二', 23);
- 创建
User
实体类
如果User
实体类中的某属性名称和数据表中对应的字段名称一致,TableField
注解可写可不写。
/**
* @author 念兮为美
* @create 2020-05-29 10:00
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@TableName("user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
@TableField(value = "nick_name")
private String nickname;
private Integer age;
}
- 创建
UserMapper
类
因为UserMapper
继承BaseMapper
接口后,无需编写userMapper.xml
文件,即可获得CRUD
功能,如下所示:
/**
* @author 念兮为美
* @create 2020-05-29 10:13
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
- 创建
UserService
类
/**
* @author 念兮为美
* @create 2020-05-29 10:54
*/
public class UserService extends ServiceImpl<UserMapper, User> {
@Resource public UserMapper userMapper;
}
4. 操作演示
上述环境搭建完成后,我们即可实现queryWrapper
的相关操作,如下列出常见的使用场景。
- 分页查询
queryWrapper
做分页查询以及查询时的注意事项,在我的这篇博文中写的很详细,可以点击链接查看:详解Mybatis-Plus中分页插件PaginationInterceptor, MybatisPlusInterceptor在SpringBoot中的使用
or
查询
我们在使用queryWrapper
的or查询时,这里存在一个小小的坑,可以参考我的这篇博文,写的很详细:mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系
eq
查询
如下代码所示:
@Test
void contextLoads() {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("username","chenxier");
User one = userService.getOne(queryWrapper);
System.out.println(JSONUtil.toJsonPrettyStr(one));
}
输出结果:
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6212dc7d] will not be managed by Spring
==> Preparing: SELECT id,username,nick_name,age FROM user WHERE (username = ?)
==> Parameters: chenxier(String)
<== Columns: id, username, nick_name, age
<== Row: 1, chenxier, 陈希尔, 18
<== Total: 1
like
查询
如下代码所示:
@Test
void contextLoads() {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.like("username","chenxier");
User one = userService.getOne(queryWrapper);
System.out.println(JSONUtil.toJsonPrettyStr(one));
}
从输出结果可以看到,如果我们使用.like
方法时,querywrapper
会自动加上%searchParam%
,如下所示:
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@4833bb83] will not be managed by Spring
==> Preparing: SELECT id,username,nick_name,age FROM user WHERE (username LIKE ?)
==> Parameters: %chenxier%(String)
<== Columns: id, username, nick_name, age
<== Row: 1, chenxier, 陈希尔, 18
<== Total: 1
-
likeLeft
和likeRight
-
likeLeft
左%
查询,比如username like '%san'
-
likeRight
右%
查询,比如username like 'zhang%'
-
具体如下代码所示:
@Test
void contextLoads() {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.likeLeft("username","san");
queryWrapper.likeRight("username","zhang");
User one = userService.getOne(queryWrapper);
System.out.println(JSONUtil.toJsonPrettyStr(one));
}
输出结果如下:
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3d4ea4cf] will not be managed by Spring
==> Preparing: SELECT id,username,nick_name,age FROM user WHERE (username LIKE ? AND username LIKE ?)
==> Parameters: %san(String), zhang%(String)
<== Columns: id, username, nick_name, age
<== Row: 2, zhangsan, 张三, 22
<== Total: 1
between
查询
如下代码所示:
@Test
void contextLoads() {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.between("age",20,23);
List list = userService.list(queryWrapper);
System.out.println(JSONUtil.toJsonPrettyStr(list));
}
根据输出结果可以看到,between查询是左闭右闭,即age >= 20 and age <= 23
,如下所示:
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@c9a8e12] will not be managed by Spring
==> Preparing: SELECT id,username,nick_name,age FROM user WHERE (age BETWEEN ? AND ?)
==> Parameters: 20(Integer), 23(Integer)
<== Columns: id, username, nick_name, age
<== Row: 2, zhangsan, 张三, 22
<== Row: 3, lisi, 李四, 20
<== Row: 4, wanger, 王二, 23
<== Total: 3
-
orderByAsc
和orderByDesc
排序-
orderByAsc
升序排列 -
orderByDesc
降序排列
-
具体如下代码所示:
@Test
void contextLoads() {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.orderByAsc("age");
queryWrapper.orderByDesc("id");
List list = userService.list(queryWrapper);
System.out.println(JSONUtil.toJsonPrettyStr(list));
}
从输出结果可以看到,先按age
升序,如果age
相同则按id
降序排列,如下所示:
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@10bf2726] will not be managed by Spring
==> Preparing: SELECT id,username,nick_name,age FROM user ORDER BY age ASC,id DESC
==> Parameters:
<== Columns: id, username, nick_name, age
<== Row: 1, chenxier, 陈希尔, 18
<== Row: 3, lisi, 李四, 22
<== Row: 2, zhangsan, 张三, 22
<== Row: 4, wanger, 王二, 23
<== Total: 4
5. 注意事项
由于querywrapper
的方法较多,大家可以参考如下表格进行实际操作。
相关文章
- 命令行中执行批量SQL的方法
- hibernate向mysql插入数据后,得到该条数据主键的方法
- Mybatis中配置Mapper的方法
- spring与mybatis三种整合方法
- 使用rundll32.exe绕过应用程序白名单(多种方法)
- 自适应变异引用(AWR)方法(an adaptive warped reference (AWR) method )
- 请问当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
- 多重共线性问题的几种解决方法
- 使用noConclict后仍然能够在函数体内继续使用$的方法
- Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略
- final关键字的作用 (修改方法、变量、类)
- MyBatis源码第9章之继承HashMap并重写方法
- MyBatis里面为什么老是实现HashMap重写get方法呢1
- Mybatis出现Parameter ‘XXX‘ not found. Available parameters are [0, 1, param1, param2]错误解决方法
- Mybatis源码分析之(三)mapper接口底层原理(为什么不用写方法体就能访问到数据库)
- Java创建并执行线程的四种方法
- 目标检测论文解读复现【NO.23】FS-YOLOv5:轻量化红外目标检测方法