文章目录
1、条件构造器
Mybatis-Plus 通过 Wrapper——条件构造器,或者 Condition来让用户自由的构建查询条件。Wrapper 是条件构造抽象类,最顶端父类。Wrapper接口的实现类关系如下:
从图中可以看出,AbstractWrapper
和AbstractChainWrapper
是重点实现,接下来我们重点学习 AbstractWrapper
以及其子类。
2、AbastractWrapper 抽象类
Mybatis-Plus 提供一个 AbastractWrapper
抽象类,这个类继承了 Wrapper 抽象类。这个抽象类中包括了很多方法,这些方法用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件。
2.1、allEq
allEq
表示设置所有条件相等,并将所有条件用 and 连接。
allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
//参数:params 的 key 表示为数据库字段名,value 为字段值;
//当参数 null2IsNull 为 true 时,调用 isNull 方法判断 map 的 value 的属性值是否为 null,反之不判断。
//参数:condition 表示这些条件是否加入最后生成的sql中,false 表示不加入
allEq(BiPredicate<R, V> filter, Map<R, V> params)
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
//参数:filter 表示过滤函数,是否允许字段传入比对条件中
Map<String, Object> map = new HashMap<>();
map.put("id", order.getId());
map.put("uid", order.getUid());
UpdateWrapper<Order> updateWrapper = new UpdateWrapper<>();
//SELECT * FROM 表名 WHERE id = ? AND uid= ?
updateWrapper.allEq(map);
//SELECT * FROM 表名 WHERE id = ? AND uid= ?
updateWrapper.allEq((k,v)-(k.equals("id") || k.equals("uid")), map);
//SELECT * FROM 表名 WHERE id = ?
updateWrapper.allEq((k,v)-(k.equals("id")), map);
2.2、基本操作
-
eq
和ne
:等同于SQL中的 = 和 <>//eq 等于 = //参数 condition 表示这些条件是否加入最后生成的sql中,false 表示不加入 eq(R column, Object val) eq(boolean condition, R column, Object val) //SELECT * FROM 表名 WHERE name = '老王 eq("name", "老王") //ne 不等于 <> ne(R column, Object val) ne(boolean condition, R column, Object val) //SELECT * FROM 表名 WHERE name <> '老王' ne("name", "老王")
-
gt
和ge
:等同于SQL中的 > 和 >=//gt 大于 > gt(R column, Object val) gt(boolean condition, R column, Object val) //SELECT * FROM 表名 WHERE age > 18 gt("age", 18) //ge 大于等于 >= ge(R column, Object val) ge(boolean condition, R column, Object val) ge("age", 18) //age >= 18
-
lt
和le
:等同于SQL中的 < 和 <=//lt 小于 < lt(R column, Object val) lt(boolean condition, R column, Object val) //SELECT * FROM 表名 WHERE age < 18 lt("age", 18) //le 小于等于 <= le(R column, Object val) le(boolean condition, R column, Object val) //SELECT * FROM 表名 WHERE age <= 18 le("age", 18)
-
between
和notBetween
:等同于SQL中的区间 between and 和 not between and//between 值1 AND 值2 between(R column, Object val1, Object val2) between(boolean condition, R column, Object val1, Object val2) //SELECT * FROM 表名 WHERE age between 18 and 30 between("age", 18, 30) //notBetween 值1 AND 值2 notBetween(R column, Object val1, Object val2) notBetween(boolean condition, R column, Object val1, Object val2) //SELECT * FROM 表名 WHERE age not between 18 and 30 notBetween("age", 18, 30)
-
in
和notIn
:等同于SQL中的 IN(…) 和 NOT IN(…)// in(value.get(0), value.get(1), ...) in(R column, Collection<?> value) in(boolean condition, R column, Collection<?> value) //SELECT * FROM 表名 WHERE age in (1,2,3) in("age",{1,2,3}) //IN (v0, v1, ...) in(R column, Object... values) in(boolean condition, R column, Object... values) //SELECT * FROM 表名 WHERE age in (1,2,3) in("age", 1, 2, 3) notIn(R column, Collection<?> value) notIn(boolean condition, R column, Collection<?> value) //SELECT * FROM 表名 WHERE //age not in (1,2,3) notIn("age",{1,2,3}) notIn(R column, Object... values) notIn(boolean condition, R column, Object... values) //SELECT * FROM 表名 WHERE age not in (1,2,3) notIn("age", 1, 2, 3)
2.3、模糊查询
-
like
和notLike
:等同于SQL中的 %值% 和 NOT LIKE '%值%//like'%值%' like(R column, Object val) like(boolean condition, R column, Object val) //SELECT * FROM 表名 WHERE name like '%王%' like("name", "王") //not like '%值%' notLike(R column, Object val) notLike(boolean condition, R column, Object val) //SELECT * FROM 表名 WHERE name not like '%王%' notLike("name", "王")
-
likeLeft
和likeRight
:等同于SQL中的 LIKE ‘%值’ 和 LIKE '值%'//like '%值' likeLeft(R column, Object val) likeLeft(boolean condition, R column, Object val) //SELECT * FROM 表名 WHERE name like '%王' likeLeft("name", "王") //LIKE '值%' likeRight(R column, Object val) likeRight(boolean condition, R column, Object val) //SELECT * FROM 表名 WHERE name like '王%' likeRight("name", "王")
-
isNull
和isNotNull
:等同于SQL中的 IS NULL 和 IS NOT NULL//is null isNull(R column) isNull(boolean condition, R column) isNull("name") //name is null //is not null isNotNull(R column) isNotNull(boolean condition, R column) isNotNull("name") //name is not null
-
inSql
和notInSql
:等同于SQL中的 子查询 in 和 子查询 not ininSql(R column, String inValue) inSql(boolean condition, R column, String inValue) 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) notInSql(R column, String inValue) notInSql(boolean condition, R column, String inValue) 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.4、分组
groupBy
:等同于SQL中的 group BygroupBy(R... columns) groupBy(boolean condition, R... columns) //SELECT * FROM 表名 GROUP BY id,name groupBy("id", "name")
having
:等同于SQL中的 havinghaving(String sqlHaving, Object... params) having(boolean condition, String sqlHaving, Object... params) //SELECT * FROM 表名 GROUP BY XXX HAVING sum(age) > 10 having("sum(age) > 10") //SELECT * FROM 表名 GROUP BY XXX HAVING sum(age) > 11 having("sum(age) > {0}", 11)
2.5、排序
orderByAsc
和orderByDesc
:等同于SQL中的 ORDER BY 字段, … ASC 和 ORDER BY 字段, … DESCorderByAsc(R... columns) orderByAsc(boolean condition, R... columns) //SELECT * FROM 表名 ORDER BY id ASC,name ASC orderByAsc("id", "name") orderByDesc(R... columns) orderByDesc(boolean condition, R... columns) //SELECT * FROM 表名 ORDER BY id DESC,name DESC orderByDesc("id", "name")
orderBy
:等同于SQL中的 ORDER BY 字段, …//参数 isAsc 表示是否是 asc 排序,为 true 表示是进行 asc 排序 orderBy(boolean condition, boolean isAsc, R... columns) //SELECT * FROM 表名 ORDER BY id ASC,name ASC orderBy(true, true, "id", "name")
2.6、逻辑查询
or
:有两种用法,一种凭借,一种嵌套。主动调用 or 表示紧接着下一个方法不是用 and 连接(不调用 or 则默认为使用 and 连接)//主动调用or表示紧接着下一个方法不是用and连接 //拼接 or or() or(boolean condition) //SELECT * FROM 表名 WHERE id = 1 or name = '老王' eq("id",1).or().eq("name","老王") //嵌套 or or(Consumer<Param> consumer) or(boolean condition, Consumer<Param> consumer) //SELECT * FROM 表名 WHERE XXX OR (name = '李白' and status <> '活着') or(i -> i.eq("name", "李白").ne("status", "活着"))
and
:AND 嵌套and(Consumer<Param> consumer) and(boolean condition, Consumer<Param> consumer) //SELECT * FROM 表名 WHERE XXX and (name = '李白' and status <> '活着') and(i -> i.eq("name", "李白").ne("status", "活着"))
nested
:正常嵌套 不带 AND 或者 ORnested(Consumer<Param> consumer) nested(boolean condition, Consumer<Param> consumer) //SELECT * FROM 表名 WHERE (name = '李白' and status <> '活着') nested(i -> i.eq("name", "李白").ne("status", "活着"))--->(name = '李白' and status <> '活着')
apply
:拼接 SQL,该方法可用于数据库函数动态入参。//参数 params 对应 applySql内部的{index}部分 apply(String applySql, Object... params) apply(boolean condition, String applySql, Object... params) apply("id = 1") //id = 1 apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")//date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'") aepply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")//date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
last
:无视优化规则直接拼接到 sql 最后,只能调用一次,多次调用以最后一次为准,会造成 sql 注入问题。last(String lastSql) last(boolean condition, String lastSql) //SELECT * FROM 表名 LIMIT 1 last("limit 1")
3、QueryWrapper
QueryWrapper
类继承于 AbstractWrapper
抽象类,QueryWrapper
还定义了唯一一个方法select
,这个方法主要用于查询语句设置查询字段。
select(String... sqlSelect)
// SELECT id,name,age FROM 表名
select("id", "name", "age")
//后面两个方法是过滤查询字段(主键除外)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
4、UpdateWrapper
UpdateWrapper
类继承于 AbstractWrapper
抽象类,UpdateWrapper
主要用于在更新操作时。
set
:设置需要更新的字段和其属性set(String column, Object val) set(boolean condition, String column, Object val)
setSql
:直接填入 SET 部分的 SQLsetSql(String sql)