mybatis-plus 3 条件构造器

前言

上一章节介绍了 MPCRUD 的封装,本章节介绍 MP 的另一个特性 条件构造器,帮助我们在 链式调用 时的各种自定义条件链接

allEq

// key 为 数据库字段名 value为 字段值
allEq(Map<R, V> params)

// null2IsNull 为 true 时
// 当 value 为 null 对应 key is null
// null2IsNull 为 false 时
// 当 value 为 null 直接忽略对应 key
// 默认 true
allEq(Map<R, V> params, boolean null2IsNull)

// filter 过滤对应 KV 是否加入条件
allEq(BiPredicate<R, V> filter, Map<R, V> params)

allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)

示例 demo

	@Test
    public void testAllEq() {

        // name = '1' and age is null
        userService.query()
                .allEq(new HashMap<String, Object>() {
                    {
                        put("name", "1");
                        put("age", null);
                    }
                }, true)
                .list()
                .forEach(System.out::println);

        System.out.println("=========================");

        // name = '1'
        userService.query()
                .allEq(new HashMap<String, Object>() {
                    {
                        put("name", "1");
                        put("age", null);
                    }
                }, false)
                .list()
                .forEach(System.out::println);

        System.out.println("=========================");

        // age is null
        userService.query()
                .allEq((k, v) -> k.length() == 3,
                        new HashMap<String, Object>() {
                            {
                                put("name", "1");
                                put("age", null);
                            }
                        })
                .list()
                .forEach(System.out::println);

    }

eq & ne

// 等于 =
eq(R column, Object val)

// 不等于 <>
ne(R column, Object val)

示例 demo

	@Test
    public void testEqNe() {
    	// name = '1'
        userService.query()
                .eq("name", "1")
                .list()
                .forEach(System.out::println);

		// name <> '1'
        userService.query()
                .ne("name", "1")
                .list()
                .forEach(System.out::println);
    }

gt & ge

// 大于 >
gt(R column, Object val)

// 大于等于 >=
ge(R column, Object val)

示例 demo

	@Test
    public void testGtGe() {

        // age > 1
        userService.query()
                .gt("age", 1)
                .list()
                .forEach(System.out::println);

		// age >= 1
        userService.query()
                .ge("age", 1)
                .list()
                .forEach(System.out::println);
    }

lt & le

// 小于
lt(R column, Object val)

// 小于等于 <=
le(R column, Object val)

示例 demo

	@Test
    public void testLtLe() {

        // age < 1
        userService.query()
                .lt("age", 1)
                .list()
                .forEach(System.out::println);

        // age <= 1
        userService.query()
                .le("age", 1)
                .list()
                .forEach(System.out::println);
    }

between

// between(闭区间)
between(R column, Object val1, Object val2)

// notBetween
notBetween(R column, Object val1, Object val2)

示例 demo

	@Test
    public void testBetween() {
        // age between 1 and 2
        userService.query()
                .between("age", 1, 2)
                .list()
                .forEach(System.out::println);

        // age not between 1 and 2
        userService.query()
                .notBetween("age", 1, 2)
                .list()
                .forEach(System.out::println);
    }

like

like(R column, Object val)

notLike(R column, Object val)

likeLeft(R column, Object val)

likeRight(R column, Object val)

示例 demo

	@Test
    public void testLike() {
        // name like '%1%'
        userService.query()
                .like("name", "1")
                .list()
                .forEach(System.out::println);

        // name not like '%1%'
        userService.query()
                .notLike("name", "1")
                .list()
                .forEach(System.out::println);

        // name like '%1'
        userService.query()
                .likeLeft("name", "1")
                .list()
                .forEach(System.out::println);

        // name like '1%'
        userService.query()
                .likeRight("name", "1")
                .list()
                .forEach(System.out::println);
    }

isNull & isNotNull

isNull(R column)

isNotNull(R column)

示例 demo

	@Test
    public void testIsNull() {
        // name is null
        userService.query()
                .isNull("name")
                .list()
                .forEach(System.out::println);

        // name is not null
        userService.query()
                .isNotNull("name")
                .list()
                .forEach(System.out::println);
    }

in & notIn

in(R column, Collection<?> value)

in(R column, Object... values)

notIn(R column, Collection<?> value)

notIn(R column, Object... values)

示例 demo

	@Test
    public void testIn() {
        // name in (1, 2, 3)
        userService.query()
                .in("name", 1, 2, 3)
                .list()
                .forEach(System.out::println);

        // name not in (1, 2, 3)
        userService.query()
                .notIn("name", 1, 2, 3)
                .list()
                .forEach(System.out::println);
    }

inSql & notInSql

// column 在 inValue 的 子查询 结果集中
inSql(R column, String inValue)

// column 不在 inValue 的 子查询 结果集中
notInSql(R column, String inValue)

示例 demo

	@Test
    public void testInSql() {
        // name in (select name from user where age = 1)
        userService.query()
                .inSql("name", "select name from user where age = 1")
                .list()
                .forEach(System.out::println);

        System.out.println("==================");

        // name not in (select name from user where age = 1)
        userService.query()
                .notInSql("name", "select name from user where age = 1")
                .list()
                .forEach(System.out::println);
    }

groupBy & having

groupBy(R... columns)

having(String sqlHaving, Object... params)

示例 demo

	@Test
    public void testGroupByHaving() {
        // group by name, age having name > '1' and age > 1
        userService.query()
                .groupBy("name", "age")
                .having("name > '0'")
                .having("age > {0}", 1)
                .list()
                .forEach(System.out::println);
    }

orderBy

orderByAsc(R... columns)

orderByDesc(R... columns)

orderBy(boolean condition, boolean isAsc, R... columns)

示例 demo

	@Test
    public void testOrderBy() {
        // order by name ASC, age ASC
        userService.query()
                .orderBy(true, true, "name", "age")
                .list()
                .forEach(System.out::println);

        // order by name ASC, age ASC
        userService.query()
                .orderByAsc("name", "age")
                .list()
                .forEach(System.out::println);

        // order by name DESC, age DESC
        userService.query()
                .orderByDesc("name", "age")
                .list()
                .forEach(System.out::println);
    }

func

// 自定义 Consumer,可用于 条件判断
func(Consumer<Children> consumer)

示例 demo

	@Test
    public void testFunc() {
        boolean condition = true;

        userService.query()
                .func(t -> {
                    if (condition) {
                        t.eq("name", "1");
                    } else {
                        t.eq("name", "2");
                    }
                })
                .list()
                .forEach(System.out::println);
    }

or & and

// 显式调用则为 or,默认即 and()
or()

or(Consumer<Param> consumer)

and(Consumer<Param> consumer)

示例 demo

	@Test
    public void testOrAnd() {
        // name = '1' or name = '2'
        userService.query()
                .eq("name", "1")
                .or()
                .eq("name", "2")
                .list()
                .forEach(System.out::println);

        // name = '1' or name = '2'
        userService.query()
                .eq("name", "1")
                .or(i -> i.eq("name", "2"))
                .list()
                .forEach(System.out::println);

        // name = '1' and age = 1
        userService.query()
                .eq("name", "1")
                .and(i -> i.eq("age", 1))
                .list()
                .forEach(System.out::println);
                
    }

apply

// 动态执行 sql,参数要用占位符 {},否则有 sql注入 的风险
apply(String applySql, Object... params)

示例 demo

	@Test
    public void testApply() {
        // 拼接 age = 1
        userService.query()
                .apply("age = {0}", 1)
                .list()
                .forEach(System.out::println);
    }

last

// 无视优化规则直接拼接到 sql 的最后
// 多次调用以最后一次为准 有 sql注入 的风险,谨慎使用
last(String lastSql)

示例 demo

	@Test
    public void testLast() {
        // select * from user limit 1
        userService.query()
                .last("limit 1")
                .list()
                .forEach(System.out::println);
    }

exists & notExists

exists(String existsSql)

notExists(String notExistsSql)

示例 demo

	@Test
    public void testExist() {
        // 拼接 exits
        userService.query()
                .exists("select name from user")
                .list()
                .forEach(System.out::println);
    }

QueryWrapper#select

// 对应字段
select(String... sqlSelect)

// 条件过滤 
// TableFieldInfo 可以理解为对应实体
select(Predicate<TableFieldInfo> predicate)

// 自行指定实体
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)

示例 demo

	@Test
    public void testSelect() {
        // select name, age from user
        userService.query()
                .select("name", "age")
                .list()
                .forEach(System.out::println);

        System.out.println("===================");

        // select name from user
        userService.query()
                // 自行指定 实体
                .setEntity(new User())
                .select(i -> i.getColumn().equals("name"))
                .list()
                .forEach(System.out::println);

        System.out.println("===================");

        // select name from user
        userService.query()
                .select(User.class, i -> i.getColumn().equals("name"))
                .list()
                .forEach(System.out::println);
    }

UpdateWrapper#set & setSql

set(String column, Object val)

setSql(String sql)

示例 demo

	@Test
    public void testSetSql() {
        User one = userService.query()
                .last("limit 1")
                .one();

        Assert.assertTrue(userService.update()
                .set("name", "u1")
                .setEntity(one)
                .update()
        );

        Assert.assertTrue(userService.update()
                .setSql("name = 'u2'")
                .setEntity(one)
                .update()
        );
    }

lambda

lambda 形式的 链式调用 同理

	@Test
    public void testLambda() {
        userService.lambdaQuery()
                .eq(User::getId, 1)
                .list()
                .forEach(System.out::println);

        Assert.assertTrue(
                userService.lambdaUpdate()
                        .last("limit 1")
                        .set(User::getName, "u3")
                        .update()
        );
    }

总结

本章节介绍了 MP条件构造器,这样我们可以轻松优雅的编写出自己想要的 sql 语句。下一章节介绍 MP 的其他特性

上一篇:mybatis-plus 2 —— CRUD 封装的使用

下一篇:mybatis-plus 4 其他特性

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值