mybatis-plus 3 条件构造器
前言
上一章节介绍了 MP 对 CRUD 的封装,本章节介绍 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 的其他特性