zl程序教程

您现在的位置是:首页 >  后端

当前栏目

全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like(),between(),orderByAsc()等方法以及分页操作

方法mybatis学习 操作 详细 以及 and or
2023-09-14 09:07:24 时间

1. 引言

mybatis大家都有使用过,既面向对象又灵活可配。不友好的地方是,会随着使用出现大量xml文件和SQL语句。

此时,mybatis-plus应运而生,对mybatis做了无侵入增强,还可以简化SQL语句,或者不写SQL语句。

  1. MyBatis-Plus官网:https://mp.baomidou.com

  2. MyBatis-Plus官方文档:https://baomidou.com/pages

  3. 码云项目地址:https://gitee.com/baomidou/mybatis-plus

  4. GitHub地址:https://github.com/baomidou/mybatis-plus

  5. MyBatis-Plus开发组织:https://gitee.com/baomidou

2. 结构关系

queryWrappermybatis plus中实现查询的对象封装操作类,其层级关系如下:

在这里插入图片描述

上图的字段解释:

  • Wrapper: 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示

  • AbstractWrapper: 用于查询条件封装,生成sqlwhere条件

  • AbstractLambdaWrapperLambda语法使用Wrapper统一处理解析lambda获取column

  • LambdaQueryWrapper:看名称也能明白就是用于Lambda语法使用的查询Wrapper

  • LambdaUpdateWrapperLambda更新封装Wrapper

  • QueryWrapperEntity对象封装操作类,不是用lambda语法

  • UpdateWrapperUpdate条件封装,用于Entity对象更新操作

3. 环境配置

  1. 引入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>
  1. 创建数据源
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);
  1. 创建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;
}
  1. 创建UserMapper

因为UserMapper继承BaseMapper接口后,无需编写userMapper.xml文件,即可获得CRUD功能,如下所示:

/**
 * @author 念兮为美
 * @create 2020-05-29 10:13
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

}
  1. 创建UserService
/**
 * @author 念兮为美
 * @create 2020-05-29 10:54
 */
public class UserService extends ServiceImpl<UserMapper, User> {
  @Resource public UserMapper userMapper;
}

4. 操作演示

上述环境搭建完成后,我们即可实现queryWrapper的相关操作,如下列出常见的使用场景。

  1. 分页查询

queryWrapper做分页查询以及查询时的注意事项,在我的这篇博文中写的很详细,可以点击链接查看:详解Mybatis-Plus中分页插件PaginationInterceptor, MybatisPlusInterceptor在SpringBoot中的使用

  1. or查询

我们在使用queryWrapper的or查询时,这里存在一个小小的坑,可以参考我的这篇博文,写的很详细:mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系

  1. 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
  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
  1. likeLeftlikeRight

    • 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
  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
  1. orderByAscorderByDesc排序

    • 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的方法较多,大家可以参考如下表格进行实际操作。

在这里插入图片描述