CRUD指增加(Create)、读取(Read)、更新(Update)和删除(Delete),mybatis-plus提供了两种CRUD的接口,一种是Mapper的,一种是Service的(当然Service的CRUD实际上也是继承Mapper的),先来看看几个不用条件构造器的简单CRUD:
新增
@Test
public void fndUserSaveTest() {
FndUser fndUser = new FndUser();
fndUser.setJobNumber("123456789");
fndUser.setUserPhone("1888888888");
fndUser.setUserName("橙子");
fndUser.setLoginName("chenkang");
iFndUserService.save(fndUser);
}
使用mybatis-plus的id生成策略,在保存的时候自动set值
根据id更新
@Test
public void fndUserUpdateTest() {
FndUser fndUser = new FndUser();
fndUser.setJobNumber("1234567891");
fndUser.setUserName("栗子");
fndUser.setId("1154034819131699202");
fndUser.setLoginName("lizi");
iFndUserService.updateById(fndUser);
}
查询全部
@Test
public void fndUserListTest() {
List<FndUser> fndUserList = iFndUserService.list();
}
根据id删除
@Test
public void fndUserDeleteTest() {
iFndUserService.removeById("1154034819131699202");
}
这些最简单的增删改查,但实际情况下,我们需要更为灵活的运用这些接口,所以mybatis-plus也给我们提供了更灵活的条件构造器。
先上一个条件构造关系图:
[外链图片转存失败(img-VRnoMAI8-1567238834096)(https://www.lmorange.com/oss-image/lmsystem/8dfb0d7dcc6948798f844fc78a2ec2181567077314021.png)]
对于wrapper的介绍:
QueryWrapper是非常常用的条件构造器:
public List<FndUser> simpleQuery(FndUser fndUser) {
QueryWrapper<FndUser> fndUserQueryWrapper = new QueryWrapper<>();
// 等于= 例: eq("name", "老王")--->name = '老王'
fndUserQueryWrapper.eq("job_number", fndUser.getJobNumber());
// 大于等于 >= 例: ge("age", 18)--->age >= 18
fndUserQueryWrapper.ge("age", fndUser.getAge());
// LIKE '%值%' 例: like("name", "王")--->name like '%王%'
fndUserQueryWrapper.like("login_name", fndUser.getLoginName());
// 排序:ORDER BY 字段, ... DESC 例: orderByDesc("id", "name")--->order by id DESC,name DESC
fndUserQueryWrapper.orderByDesc("s_ct","job_number");
// Mapper的查询接口(当然对应的删除、更新、插入接口都是有的)
return baseMapper.selectList(fndUserQueryWrapper);
}
以上代码类似于sql
select * from fnd_user
where job_number = '123456789' and age > 18
and login_name like '%wang%'
order by s_ct,job_number desc
可以看出,使用条件构造器我们可以拼构出我们想要的的sql
注意:我经常为了确保单条查询不出错,经常在构造器中加上
limit 1
,例如:fndUserQueryWrapper.last(“limit 1”),这样是可以限制只查询一条;但是如果使用使用fndUserQueryWrapper.lambda().last(“limit 1”)的话最后拼接出的sql中不会带出limit 1
,说明唯一的限制没有了,可能会报错;
对于LambdaQueryWrapper,我们可以这样写:
public List<FndUser> lambdaSimpleQuery(FndUser fndUser) {
LambdaQueryWrapper<FndUser> fndUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
fndUserLambdaQueryWrapper
// 等于= 例: eq("name", "老王")--->name = '老王'
.eq(FndUser::getJobNumber, fndUser.getJobNumber())
// 大于等于 >= 例: ge("age", 18)--->age >= 18
.ge(FndUser::getAge, fndUser.getAge())
// LIKE '%值%' 例: like("name", "王")--->name like '%王%'
.like(FndUser::getLoginName, fndUser.getLoginName())
// 排序:ORDER BY 字段, ... DESC 例: orderByDesc("id", "name")--->order by id DESC,name DESC
.orderByDesc(FndUser::getSCt, FndUser::getJobNumber);
// Service的查询接口(和Mapper的selectList接口是差不多的意思,)
return super.list(fndUserLambdaQueryWrapper);
}
其实就是换了种写法,意思还是一样的,就看你习惯那种写法;
还有一种常用的UpdateWrapper
public void simpleUpdate(FndUser fndUser) {
UpdateWrapper<FndUser> fndUserUpdateWrapper = new UpdateWrapper<>();
// .lambda()这种形式和LambdaUpdateWrapper是一个意思
fndUserUpdateWrapper.lambda().set(FndUser::getJobNumber, fndUser.getJobNumber())
.set(FndUser::getLoginName, fndUser.getLoginName());
super.update(fndUserUpdateWrapper);
}
可用来更新实体类,当然QueryWrapper也是可以用来更新,只不过时Service(或者Mapper)调用的接口方法不同而已,比如也可以这样:
public void simpleQueryWrapperUpdate(FndUser fndUser) {
QueryWrapper<FndUser> fndUserQueryWrapper = new QueryWrapper<>();
fndUserQueryWrapper.eq("job_number", fndUser.getJobNumber());
super.update(fndUser, fndUserQueryWrapper);
}
这段代码的意思其实就是根据fndUserQueryWrapper来作为更新的限制条件,而更新内容则是实体类fndUser
不同warpper的方法可能存在差异,但是常用的方法就那么一些,下面列出一些常用的:
[外链图片转存失败(img-3C3ys9CO-1567238834098)(https://www.lmorange.com/oss-image/lmsystem/285e94c3a3a449fc822d54d5e13723ba1567128835639.png)]
以上内容来源于