MybatisPlus实现多条件拼接动态查询

1、前 言

最近在开发过程中,需要用 MybatisPlus 实现类似以下形式的 SQL 语句,动态拼接多个条件,进行查询。

select *
from user_info
where is_deleted = 0
and is_tag = 1
and(user_type = '自有' or user_type = '非合作方' or user_type = '合作方')
and(user_role = '管理员' or user_role = '普通用户' or user_role = '访客');

由于不想在 mapper.xml 中写 SQL 语句,因此选择直接在 java 代码中实现,在此记录一下。

2、实 现

这里建立项目工程,整合 SpringBoot 和 MybatisPlus 的过程省略。

2.1 建表语句

这里随便建一个表,用于展示这个示例,建表语句如下:

create table `user_info` (
  `user_id` int(11) not null auto_increment COMMENT '主键id',
  `user_name` varchar(500) not null COMMENT '用户名称',
  `is_tag` tinyint(1) not null default '0' COMMENT '是否标记,0-否,1-是',
  `is_deleted` tinyint(1) not null default '0' COMMENT '是否删除,0-否,1-是',
  `user_type` varchar(200) default null COMMENT '用户类型',
  `user_role` varchar(200) default null COMMENT '用户角色',
  `user_from` varchar(700) not null COMMENT '用户来源',
  `create_time` datetime default CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT '更新时间',
	primary key (`user_id`)
) engine = InnoDB auto_increment = 254 default CHARSET = utf8mb4 COMMENT = '用户记录表';
2.2 实体类
package com.yuhuofei.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

import java.time.LocalDateTime;

/**
 * @author yuhuofei2021
 * @version 1.0
 * @type UserInfoDO
 * @desc 用户记录表
 * @date 2022-08-09 上午10:26:02
 */
@Data
@TableName("user_info")
@ApiModel(description = "用户记录表")
public class UserInfoDO {
    private static final long serialVersionUID = -1L;

    @ApiModelProperty(value = "主键id")
    @TableId(value = "user_id", type = IdType.AUTO)
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Integer userId;

    @ApiModelProperty(value = "用户名称")
    private String userName;

    @ApiModelProperty(value = "是否标注,0-否,1-是")
    private Boolean isTag;

    @ApiModelProperty(value = "是否删除,0-否,1-是")
    private Boolean isDeleted;

    @ApiModelProperty(value = "用户类型")
    private String userType;

    @ApiModelProperty(value = "用户角色")
    private String userRole;

    @ApiModelProperty(value = "用户来源")
    private String userFrom;

    @ApiModelProperty(value = "创建时间")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    @ApiModelProperty(value = "更新时间")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
}

2.3 测 试

MybatisPlus 动态拼接条件,实现查询如下:

@Autowired
private UserInfoMapper userInfoMapper;

public static void main(String[] args) {
    List<String> userTypeList = new ArrayList<>();
    userTypeList.add("自有");
    userTypeList.add("合作方");
    userTypeList.add("非合作方");

    List<String> userRoleList = new ArrayList<>();
    userRoleList.add("管理员");
    userRoleList.add("普通用户");
    userRoleList.add("访客");

    //拼接查询条件
    QueryWrapper<UserInfoDO> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("is_deleted", false);
    queryWrapper.eq("is_tag", true);
    if (null != userTypeList && !userTypeList.isEmpty()) {
        queryWrapper.and(wrapper -> userTypeList.forEach(rapper -> wrapper.or(o -> o.eq("user_type", rapper))));
    }
    if (null != userRoleList && !userRoleList.isEmpty()) {
        queryWrapper.and(wrapper -> userRoleList.forEach(rapper -> wrapper.or(o -> o.eq("user_role", rapper))));
    }

    List<UserInfoDO> userInfoList = userInfoMapper.selectList(queryWrapper);
}

主要是下面这一段,获取列表中的参数,动态拼接查询条件

//拼接查询条件
QueryWrapper<UserInfoDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("is_deleted", false);
queryWrapper.eq("is_tag", true);
if (null != userTypeList && !userTypeList.isEmpty()) {
    queryWrapper.and(wrapper -> userTypeList.forEach(rapper -> wrapper.or(o -> o.eq("user_type", rapper))));
}
if (null != userRoleList && !userRoleList.isEmpty()) {
    queryWrapper.and(wrapper -> userRoleList.forEach(rapper -> wrapper.or(o -> o.eq("user_role", rapper))));
}

希望今天随手记录下的东西,能帮到有缘人!

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
MyBatis-Plus 是一个基于 MyBatis 的增强工具,它提供了一些便捷的方法和功能来简化开发过程。要实现多组条件查询,可以使用 MyBatis-Plus 提供的 Lambda 查询和 QueryWrapper 来构建查询条件。 1. Lambda 查询: 使用 Lambda 查询可以使用实体类的属性名作为查询条件,可以方便地组合多个查询条件。 ```java import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 示例代码 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { public List<User> searchUsers(String username, Integer age) { LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.like(User::getUsername, username) .eq(User::getAge, age); return baseMapper.selectList(queryWrapper); } } ``` 2. QueryWrapper 查询: QueryWrapper 是 MyBatis-Plus 提供的功能强大的查询构造器,它可以拼接多个查询条件,并支持复杂的查询逻辑。 ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; // 示例代码 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { public List<User> searchUsers(String username, Integer age) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("username", username) .eq("age", age); return baseMapper.selectList(queryWrapper); } } ``` 以上是使用 MyBatis-Plus 实现多组条件查询的两种常见方式。可以根据具体的需求选择合适的方式进行查询
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值