MP的通用CRUD操作可以只进行少量的配置就可实现大部分的单表CRUD操作,还有强大的条件构造器。
通用CRUD
常用Mapper接口
Insert 示例
//插入一条记录
int insert(T entity);
Delete
//删除一条记录
int delete(@Param(Constants.WRAPPER) Wrapper wrapper);
//根据id批量删除
int deleteBatchIds(@Param(Constants.COLLECTION) Collection idList);
//根据id删除
int deleteById(Serializable id);
Update
//根据whereWrapper更新
int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper whereWrapper);
//根据id更新
int updateById(@Param(Constants.ENTITY) T entity);
Select
//根据id查询
T selectById(Serializable id);
//根据queryWrapper查询
T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);
//根据id批量查询
List selectBatchIds(@Param(Constants.COLLECTION) Collection idList);
//根据queryWrapper查询
List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);
//根据wrapper查询总数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);
Service接口
Service封装了IService接口,是对BaseMapper接口的扩充。多了很多批量的操作。
根据实体类创建对应的mapper类,mapper类要继承自basemapper接口。
一般情况下,Mapper接口就足以解决你的需求。(主要是我还不熟)
更多详细接口可以前往官网🛫🛫🛫
CRUD 接口条件构造器
mp的条件构造器是一种链式编程。
比如
QueryWrapper wrapper = new QueryWrapper<>().eq("sex",1).like("name","L");
这就构建了一个查询sex=1,name中有L的一个QueryWrapper。
以下是常用的条件构造器,只列举名称和主要功能,具体的参数可以参考官方文档🛫🛫🛫
。
比较
- allEq 全部相等
-
- e.g. allEq(id:1, name:"HH")
- eq =
-
- e.g. eq("name", "HH")
- ne <>(不等)
-
- e.g. ne("name", "HH")
- gt >
-
- e.g. gt("age", 18)
- ge >=
-
- e.g. ge("age", 18)
- lt <
-
- e.g. lt("age", 18)
- le <=
-
- e.g. le("age", 18)
范围
- between between xxx and yyy等价于 >=xxx and <= yyy
-
- e.g. between("age", 18, 29)
- notBetween between的补集
-
- e.g. notBetween("age", 18, 29)
模糊
- like 左右模糊
-
- e.g. like("name", "h")
- notLike like的补集
-
- e.g. notLike("name", "h")
- likeLeft 左模糊
-
- e.g. likeLeft("name", "L")
- likeRight 右模糊
-
- e.g. likeRight("name", "e")
分组
- groupBy 同sql group by
-
- e.g. groupBy("sex")
排序
- orderByAsc 根据某个或某些字段升序
-
- e.g. orderByAsc("id")
- orderByDesc 根据某个或某些字段降序
-
- e.g. orderByDesc("id")
- orderBy 默认升序
-
- e.g. orderBy("id")
逻辑
- or 用来拼接or
其他
- isNull 字段is null
- isNotNull 字段is not null
- in 同sql in
- notIn in的补集
- inSql 字段in(sql语句)
- notInSql inSql补集
- having havin(sql语句)
- func 主要用于在if...else中不断链。 func示例
- apply 用于拼接sql
- last 无视规则拼接sql到最后
-
- e.g. last("limit 1")
- 最后一次调用有效,有sql注入风险
🌰
Mapper接口示例
insert
User user = new User("lee", "F");
userMapper.insert(user);
delete
QueryWrapper query = new QueryWrapper<>().eq("name", "Lee").eq("sex", "F");
xxxMapper.delete(query);
update
//根据wrapper更新, 效果 -> 把age字段由17更新为18
User user = new User("lee", "F", 18);
UpdateWrapper wrapper = new UpdateWrapper().eq("name", "lee").eq("age", 17);
userMapper.update(user, wrapper);
select
//查找id为111的记录
xxxMapper.selectById(111);
//根据queryWrapper查询
QueryWrapper wrapper = new QueryWrapper<>().eq("sex", "F");
xxxMapper.selectCount(wrapper);
条件构造器示例
使用func需要使用lambda表达式。
比如有如下场景:
我们需要查询名字中含有字母L的人,但是有个条件condition,当condition为true时查男性,condition为false时查女性。
QueryWrapper wrapper = new QueryWrapper<>().lambda()
.like("name","L")
.func(i -> {
if (condition) {
i.eq("sex","F");
} else {
i.eq("sex","M");
}
})
当condition为true时,这就相当于下面的语句。所以说func的主要功能是保证在if...else中不断链。
QueryWrapper wrapper = new QueryWrapper<>().like("name","L").eq("sex","F");
or示例
// 默认是and,即 "name"="Lee" and "sex"="F"
QueryWrapper wrapper = new QueryWrapper<>().eq("name","Lee").eq("sex","F");
// 使用or,即"name"="Lee"或"sex"="F"
QueryWrapper wrapper = new QueryWrapper<>().eq("name","Lee").or().eq("sex","F");
逻辑删除
在项目的application.properties中配置逻辑删除的值
mybatis-plus.global-config.logic-delete-value=1
mybatis-plus.global-config.logic-not-delete-value=0
1表示删除,0表示未删除。(当然你也可以设置为其他数值,但应该不会有人那么做)
接下来配置逻辑删除字段,只需在该实体类字段上加上注解@TableLogic即可。(此处以deleted字段为例)
所以当执行delete时,会转变为更新,实际上执行的sql语句是
update xxx set deleted=1 where xxx and deleted=0
查询时会追加限制条件,用来过滤已删除的记录,所以执行的sql语句是
select xxx from xxx where xxx and deleted=0