MP的通用CRUD操作可以只进行少量的配置就可实现大部分的单表CRUD操作,还有强大的条件构造器。
通用CRUD
常用Mapper接口
Insert 示例
//插入一条记录intinsert(Tentity);
Delete 示例
//删除一条记录intdelete((Constants.WRAPPER) Wrapperwrapper); //根据id批量删除intdeleteBatchIds((Constants.COLLECTION) CollectionidList); //根据id删除intdeleteById(Serializableid);
Update 示例
//根据whereWrapper更新intupdate((Constants.ENTITY) TupdateEntity, (Constants.WRAPPER) WrapperwhereWrapper); //根据id更新intupdateById((Constants.ENTITY) Tentity);
Select 示例
//根据id查询TselectById(Serializableid); //根据queryWrapper查询TselectOne((Constants.WRAPPER) WrapperqueryWrapper); //根据id批量查询ListselectBatchIds((Constants.COLLECTION) CollectionidList); //根据queryWrapper查询ListselectList((Constants.WRAPPER) WrapperqueryWrapper); //根据wrapper查询总数IntegerselectCount((Constants.WRAPPER) WrapperqueryWrapper);
Service接口
Service封装了IService接口,是对BaseMapper接口的扩充。多了很多批量的操作。
根据实体类创建对应的mapper类,mapper类要继承自basemapper接口。
一般情况下,Mapper接口就足以解决你的需求。(主要是我还不熟)
更多详细接口可以前往官网🛫🛫🛫CRUD 接口
条件构造器
mp的条件构造器是一种链式编程。
比如
QueryWrapperwrapper=newQueryWrapper<>().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
- e.g. eq("xx","xx").or().eq("xx","xx") 示例
其他
- 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
Useruser=newUser("lee", "F"); userMapper.insert(user);
delete
QueryWrapperquery=newQueryWrapper<>().eq("name", "Lee").eq("sex", "F"); xxxMapper.delete(query);
update
//根据wrapper更新, 效果 -> 把age字段由17更新为18Useruser=newUser("lee", "F", 18); UpdateWrapperwrapper=newUpdateWrapper().eq("name", "lee").eq("age", 17); userMapper.update(user, wrapper);
select
//查找id为111的记录xxxMapper.selectById(111); //根据queryWrapper查询QueryWrapperwrapper=newQueryWrapper<>().eq("sex", "F"); xxxMapper.selectCount(wrapper);
条件构造器示例
func示例
使用func需要使用lambda表达式。
比如有如下场景:
我们需要查询名字中含有字母L的人,但是有个条件condition,当condition为true时查男性,condition为false时查女性。
QueryWrapperwrapper=newQueryWrapper<>().lambda() .like("name","L") .func(i-> { if (condition) { i.eq("sex","F"); } else { i.eq("sex","M"); } })
当condition为true时,这就相当于下面的语句。所以说func的主要功能是保证在if...else中不断链。
QueryWrapperwrapper=newQueryWrapper<>().like("name","L").eq("sex","F");
or示例
// 默认是and,即 "name"="Lee" and "sex"="F"QueryWrapperwrapper=newQueryWrapper<>().eq("name","Lee").eq("sex","F"); // 使用or,即"name"="Lee"或"sex"="F"QueryWrapperwrapper=newQueryWrapper<>().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=1where xxx and deleted=0
查询时会追加限制条件,用来过滤已删除的记录,所以执行的sql语句是
select xxx from xxx where xxx and deleted=0