前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis-Plus条件构造器

Mybatis-Plus条件构造器

作者头像
别团等shy哥发育
发布2023-02-25 16:08:50
1.1K0
发布2023-02-25 16:08:50
举报
文章被收录于专栏:全栈开发那些事

Mybatis-Plus条件构造器

1、条件构造器

说明:

  • 以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中,例如:query.like(StringUtils.isNotBlank(name), Entity::getName, name) .eq(age!=null && age >= 0, Entity::getAge, age)
  • 以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true
  • 以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法)
  • 以下方法在入参中出现的R为泛型,在普通wrapper中是String,在LambdaWrapper中是函数(例:Entity::getId,Entity为实体类,getId为字段id的getMethod)
  • 以下方法入参中的R column均表示数据库字段,当R具体类型为String时则为数据库字段名(字段名是数据库关键字的自己用转义符包裹!)!而不是实体类数据字段名!!!,另当R具体类型为SFunction时项目runtime不支持eclipse自家的编译器!!!
  • 以下举例均为使用普通wrapper,入参为Map和List的均以json形式表现!
  • 使用中如果入参的Map或者List为空,则不会加入最后生成的sql中!!!

2、AbstractWrapper

说明:

  • QueryWrapper(LambdaQueryWrapper) 和UpdateWrapper(LambdaUpdateWrapper) 的父类用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件
  • 注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为 条件参数如下:

2.1 allEq

代码语言:javascript
复制
allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
  • 全部eq(或个别isNull)

个别参数说明: params : key为数据库字段名,value为字段值 null2IsNull : 为true则在map的value为null时调用 isNull 方法,为false时则忽略value为null的

  • 例1: allEq({id:1,name:"老王",age:null})—>id = 1 and name = '老王' and age is null
  • 例2: allEq({id:1,name:"老王",age:null}, false)—>id = 1 and name = '老王'

个别参数说明: filter : 过滤函数,是否允许字段传入比对条件中 paramsnull2IsNull : 同上

2.2 eq

代码语言:javascript
复制
eq(R column, Object val)
eq(boolean condition, R column, Object val)
  • 等于=
  • 例:eq("name", "老王")—>name = '老王'

2.3 ne

代码语言:javascript
复制
ne(R column, Object val)
ne(boolean condition, R column, Object val)
  • 不等于<>
  • 例:ne("name", "老王")—>name <> '老王'

2.4 gt

代码语言:javascript
复制
gt(R column, Object val)
gt(boolean condition, R column, Object val)
  • 大于等于>=
  • 例:lt("age", 18)—>age < 18

2.5 le

代码语言:javascript
复制
le(R column, Object val)
le(boolean condition, R column, Object val)
  • 小于等于<=
  • 例:le("age", 18)—>age <= 18

2.6 between

代码语言:javascript
复制
between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)
  • BETWEEN 值1 AND 值2
  • 例:between("age", 18, 30)—>age between 18 and 30

2.7 notBetween

代码语言:javascript
复制
notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
  • NOT BETWEEN 值1 AND 值2
  • notBetween("age", 18, 30)—>age not between 18 and 30

2.8 like

代码语言:javascript
复制
like(R column, Object val)
like(boolean condition, R column, Object val)
  • LIKE ‘%值%’
  • 例:like("name", "王")—>name like '%王%'

2.9 notLike

代码语言:javascript
复制
notLike(R column, Object val)
notLike(boolean condition, R column, Object val)
  • NOT LIKE ‘%值%’
  • 例:notLike(“name”, “王”)—>name not like ‘%王%’

2.10 likeLeft

代码语言:javascript
复制
likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)
  • LIKE ‘%值’
  • 例: likeLeft("name", "王")—>name like '%王'

2.11 likeRight

代码语言:javascript
复制
likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)
  • LIKE ‘值%’
  • 例: likeRight("name", "王")—>name like '王%'

2.12 isNull

代码语言:javascript
复制
isNull(R column)
isNull(boolean condition, R column)
  • 字段 IS NULL
  • 例: isNull("name")—>name is null

2.13 isNotNull

代码语言:javascript
复制
isNotNull(R column)
isNotNull(boolean condition, R column)
  • 字段 IS NOT NULL
  • 例: isNotNull("name")—>name is not null

2.14 in

代码语言:javascript
复制
in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value)
  • 字段 IN (value.get(0), value.get(1), …)
  • 例: in("age",{1,2,3})—>age in (1,2,3)
代码语言:javascript
复制
in(R column, Object... values)
in(boolean condition, R column, Object... values)
  • 字段 IN (v0, v1, …)
  • 例: in("age", 1, 2, 3)—>age in (1,2,3)

2.15 notIn

代码语言:javascript
复制
notIn(R column, Collection<?> value)
notIn(boolean condition, R column, Collection<?> value)
  • 字段 NOT IN (value.get(0), value.get(1), …)
  • 例: notIn("age",{1,2,3})—>age not in (1,2,3)
代码语言:javascript
复制
notIn(R column, Object... values)
notIn(boolean condition, R column, Object... values)
  • 字段 NOT IN (v0, v1, …)
  • 例: notIn("age", 1, 2, 3)—>age not in (1,2,3)

2.16 inSql

代码语言:javascript
复制
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)
  • 字段 IN ( sql语句 )
  • 例: inSql("age", "1,2,3,4,5,6")—>age in (1,2,3,4,5,6)
  • 例: inSql("id", "select id from table where id < 3")—>id in (select id from table where id < 3)

2.17 notInSql

代码语言:javascript
复制
notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)
  • 字段 NOT IN ( sql语句 )
  • 例: notInSql("age", "1,2,3,4,5,6")—>age not in (1,2,3,4,5,6)
  • 例: notInSql("id", "select id from table where id < 3")—>id not in (select id from table where id < 3)

2.18 groupBy

代码语言:javascript
复制
groupBy(R... columns)
groupBy(boolean condition, R... columns)
  • 分组:GROUP BY 字段, …
  • 例: groupBy("id", "name")-–>group by id,name

2.19 orderByAsc

代码语言:javascript
复制
orderByAsc(R... columns)
orderByAsc(boolean condition, R... columns)
  • 排序:ORDER BY 字段, … ASC
  • 例: orderByAsc("id", "name")—>order by id ASC,name ASC

2.20 orderByDesc

代码语言:javascript
复制
orderByDesc(R... columns)
orderByDesc(boolean condition, R... columns)

排序:ORDER BY 字段, … DESC 例: orderByDesc("id", "name")—>order by id DESC,name DESC

2.21 orderBy

代码语言:javascript
复制
orderBy(boolean condition, boolean isAsc, R... columns)

排序:ORDER BY 字段, … 例: orderBy(true, true, "id", "name")—>order by id ASC,name ASC

2.22 having

代码语言:javascript
复制
having(String sqlHaving, Object... params)
having(boolean condition, String sqlHaving, Object... params)
  • HAVING ( sql语句 )
  • 例: having("sum(age) > 10")—>having sum(age) > 10
  • 例: having("sum(age) > {0}", 11)—>having sum(age) > 11

2.23 func

代码语言:javascript
复制
func(Consumer<Children> consumer)
func(boolean condition, Consumer<Children> consumer)
  • func 方法(主要方便在出现if…else下调用不同方法能不断链)
  • 例: func(i -> if(true) {i.eq("id", 1)} else {i.ne("id", 1)})

2.24 or

代码语言:javascript
复制
or()
or(boolean condition)
  • 拼接 OR

注意事项: 主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)

  • 例: eq("id",1).or().eq("name","老王")—>id = 1 or name = '老王'
代码语言:javascript
复制
or(Consumer<Param> consumer)
or(boolean condition, Consumer<Param> consumer)
  • OR 嵌套
  • 例: or(i -> i.eq("name", "李白").ne("status", "活着"))—>or (name = '李白' and status <> '活着')

2.25 and

代码语言:javascript
复制
and(Consumer<Param> consumer)
and(boolean condition, Consumer<Param> consumer)
  • AND 嵌套 例: and(i -> i.eq("name", "李白").ne("status", "活着"))--->and (name = '李白' and status <> '活着')

2.26 nested

代码语言:javascript
复制
nested(Consumer<Param> consumer)
nested(boolean condition, Consumer<Param> consumer)
  • 正常嵌套 不带 AND 或者 OR
  • 例: nested(i -> i.eq("name", "李白").ne("status", "活着"))—>(name = '李白' and status <> '活着')

2.27 apply

代码语言:javascript
复制
apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)
  • 拼接 sql

注意事项: 该方法可用于数据库函数 动态入参的params对应前面applySql内部的{index}部分.这样是不会有sql注入风险的,反之会有!

  • 例: apply("id = 1")—>id = 1
  • 例: apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")—>date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
  • 例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")—>date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")

2.28 last

代码语言:javascript
复制
last(String lastSql)
last(boolean condition, String lastSql)
  • 无视优化规则直接拼接到 sql 的最后

注意事项: 只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用

  • 例: last("limit 1")

2.29 exists

代码语言:javascript
复制
exists(String existsSql)
exists(boolean condition, String existsSql)
  • 拼接 EXISTS ( sql语句 )
  • 例: exists("select id from table where age = 1")—>exists (select id from table where age = 1)

2.30 notExists

代码语言:javascript
复制
notExists(String notExistsSql)
notExists(boolean condition, String notExistsSql)
  • 拼接 NOT EXISTS ( sql语句 )
  • 例: notExists("select id from table where age = 1")—>not exists (select id from table where age = 1)

3、QuereyWrapper

说明: 继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取

3.1 select

代码语言:javascript
复制
select(String... sqlSelect)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)

设置查询字段 说明:

以上方法分为两类. 第二类方法为:过滤查询字段(主键除外),入参不包含 class 的调用前需要wrapper内的entity属性有值! 这两类方法重复调用以最后一次为准

  • 例: select("id", "name", "age")
  • 例: select(i -> i.getProperty().startsWith("test"))

4、UpdateWrapper

说明: 继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件LambdaUpdateWrapper, 可以通过 new UpdateWrapper().lambda() 方法获取!

4.1 set

代码语言:javascript
复制
set(String column, Object val)
set(boolean condition, String column, Object val)
  • SQL SET 字段
  • 例: set("name", "老李头")
  • 例: set("name", "")—>数据库字段值变为空字符串
  • 例: set("name", null)—>数据库字段值变为null

4.2 setSql

代码语言:javascript
复制
setSql(String sql)
  • 设置 SET 部分 SQL
  • 例: setSql("name = '老李头'")

4.3 lambda

获取 LambdaWrapperQueryWrapper中是获取LambdaQueryWrapperUpdateWrapper中是获取LambdaUpdateWrapper

5、实例

先创建一个SpringBoot工程

5.1 引入依赖:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.baomidou.mybatisplus</groupId>
    <artifactId>mybatisplus01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatisplus01</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

5.2 application.yml

代码语言:javascript
复制
# DataSource Config
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mp?&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
# mybatis-plus配置控制台打印sql语句:
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.3 Mybatis-plus分页拦截器

@MapperScan注解我加在了SpringBoot的启动类上面,所以这个配置类并没有写

代码语言:javascript
复制
package com.baomidou.mybatisplus.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;

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

5.4 Employee.java

代码语言:javascript
复制
package com.baomidou.mybatisplus.bean;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * @TableName
 *  value:指定当前实体类所对应的表名
 */
@Data
@TableName(value = "tbl_employee")
public class Employee {
    /**
     * @TableId:
     *  value:指定表中的主键列的列名,如果实体属性名和列名一致,可以省略不指定
     *  type:指定主键策略
     */
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;         //int

    @TableField(value = "last_name")
    private String lastName;

    @TableField(value = "email")
    private String email;

    @TableField(value = "gender")
    private Integer gender;

    @TableField(value = "age")
    private Integer age;

//    @TableField(exist = false)
//    private Double salary;
}

5.5 条件构造器:查询操作

我们需要分页查询tbl_employee表中,年龄在18~50之间且性别为男且姓名为Tom的所有用户

代码语言:javascript
复制
   Page<Employee> employeePage = employeeMapper.selectPage(new Page<Employee>(1, 2),
                new QueryWrapper<Employee>()
                        .between("age", 18, 50)
                        .eq("gender", 1)
                        .eq("last_name", "Tom")
        );
        List<Employee> employeeList=employeePage.getRecords();
        employeeList.forEach(System.out::println);
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询tbl_employee表中性别为女,且名字中带有“老师”或者邮箱中带有‘a’

代码语言:javascript
复制
 List<Employee> employeeList = employeeMapper.selectList(new QueryWrapper<Employee>()
                .eq("gender", 0)
                .like("last_name", "老师")
                .or()
                .like("email", "a")
        );
        employeeList.forEach(System.out::println);
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查询性别为女的,根据age进行排序(asc/desc)

代码语言:javascript
复制
        List<Employee> employeeList = employeeMapper.selectList(
                new QueryWrapper<Employee>()
                        .eq("gender", 0)
//                        .orderBy(true,true,"age")
//                        .orderByDesc("age")
                        .orderByAsc("age")
        );
        employeeList.forEach(System.out::println);
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.6 条件构造器 修改操作

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
 @Test
    public void testWrapperUpdate(){
        Employee employee=new Employee();
        employee.setLastName("苍老师");
        employee.setEmail("cls@sina.com");
        employee.setGender(0);

        Integer result = employeeMapper.update(employee,
                new UpdateWrapper<Employee>()
                .eq("last_name","Tom")
                .eq("age",45)
        );
        System.out.println("result="+result);
    }
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.7 条件构造器 删除操作

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
 /**
     * 条件构造器  删除操作
     */
    @Test
    public void testWrapperDelete(){

        Integer result = employeeMapper.delete(new QueryWrapper<Employee>()
                .eq("last_name", "Tom")
                .eq("age", 33)
        );
        System.out.println("result="+result);
    }
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Mybatis-Plus条件构造器
  • 1、条件构造器
  • 2、AbstractWrapper
    • 2.1 allEq
      • 2.2 eq
        • 2.3 ne
          • 2.4 gt
            • 2.5 le
              • 2.6 between
                • 2.7 notBetween
                  • 2.8 like
                    • 2.9 notLike
                      • 2.10 likeLeft
                        • 2.11 likeRight
                          • 2.12 isNull
                            • 2.13 isNotNull
                              • 2.14 in
                                • 2.15 notIn
                                  • 2.16 inSql
                                    • 2.17 notInSql
                                      • 2.18 groupBy
                                        • 2.19 orderByAsc
                                          • 2.20 orderByDesc
                                            • 2.21 orderBy
                                              • 2.22 having
                                                • 2.23 func
                                                  • 2.24 or
                                                    • 2.25 and
                                                      • 2.26 nested
                                                        • 2.27 apply
                                                          • 2.28 last
                                                            • 2.29 exists
                                                              • 2.30 notExists
                                                              • 3、QuereyWrapper
                                                                • 3.1 select
                                                                • 4、UpdateWrapper
                                                                  • 4.1 set
                                                                    • 4.2 setSql
                                                                      • 4.3 lambda
                                                                      • 5、实例
                                                                        • 5.1 引入依赖:
                                                                          • 5.2 application.yml
                                                                            • 5.3 Mybatis-plus分页拦截器
                                                                              • 5.4 Employee.java
                                                                                • 5.5 条件构造器:查询操作
                                                                                  • 5.6 条件构造器 修改操作
                                                                                    • 5.7 条件构造器 删除操作
                                                                                    相关产品与服务
                                                                                    数据库
                                                                                    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                                                                                    领券
                                                                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档