上一篇文章中简单的整合了spring boot 与mybatisplus,本篇文章主要介绍一下mybatisplus中条件构造器以及分页插件的使用.
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 和父类AbstractWrapper中提供了许多的操作sql的方法。mybatisplus提供这些实体包装器,用于处理 sql 拼接,排序,实体参数查询等!。
条件参数说明:
查询方式 | 说明 |
---|---|
and | AND 语句,拼接 + AND 字段=值 |
or | OR 语句,拼接 + OR 字段=值 |
eq | 等于= |
allEq | 基于 map 内容等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查询 LIKE |
notLike | 模糊查询 NOT LIKE |
in | IN 查询 |
notIn | NOT IN 查询 |
isNull | NULL 值查询 |
isNotNull | IS NOT NULL |
groupBy | 分组 GROUP BY |
having | HAVING 关键词 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
last | 拼接在最后,例如:last("LIMIT 1") |
下面只列举部分方法使用,其余方法都是类似使用的
@Test
void queryByQueryWrapper(){
// 创建查询wrapper构造器
QueryWrapper queryWrapper = new QueryWrapper<>();
// 设置条件为id=1 and age is not null
queryWrapper.eq("id",1).isNotNull("age");
User user = userMapper.selectOne(queryWrapper);
LOG.info("user : {}",user);
}
结果如下:
上述是使用构造器查询单个结果,如果需要查询多个结果则需使用其他的方法(可以使用构造器也可以使用map),下面是一个简单的示例:
@Test
void queryList(){
User user = new User();
user.setAge(20);
// 创建查询wrapper构造器
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper = new QueryWrapper<>();
/**
* 条件构造器中这些方法中出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中,不传默认是true
* 该参数可以用于校验要使用的参数是否付和规范,符合就加入到sql中
*/
queryWrapper.eq(Objects.nonNull(user),"age",user.getAge()).isNotNull("age");
// 如果传入null则查询所有
List userList = userMapper.selectList(queryWrapper);
userList.forEach(u ->{
LOG.info("user : {}",u);
});
userList.clear();
// 除了使用构造器外还可以使用map
LOG.info("===========map============");
// map条件查询,key为列名,value为具体的值
Map map = new HashMap<>();
map.put("age",20);
// 如果传入的参数为null则查询所有
userList = userMapper.selectByMap(map);
userList.forEach(u ->{
LOG.info("user : {}",u);
});
}
结果如下:
上述对于等值比较使用构造器和map获取的结果是一致的,他们的区别是:map只能做等值比较,如果还需要做其它的条件比如大于某个值时是没办法处理的而构造器就能使用自己的gt()方法去操作。
mybatisplus也支持使用lambda表达式,相比较于QueryWrapper指定列名的时候不是使用字符串而是使用对于字段的get方法,列名直接使用对象属性名无需再写字符串(ps:后续列名改变后,在idea只需使用shift+f6改变对象属性名,所有的引用改字段的get方法之类也会自动改变),具体如下使用:
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getAge,20).isNotNull(User::getName);
// 如果传入null则查询所有
userList = userMapper.selectList(lambdaQueryWrapper);
userList.forEach(u ->{
LOG.info("user : {}",u);
});
结果如下:
@Test
void testUpdate(){
// 创建相应update构造器
UpdateWrapper userUpdateWrapper = new UpdateWrapper<>();
// 设置条件将所有年龄为22时将年龄设置成20
userUpdateWrapper.eq("age",22).set("age",20);
// 根据构造器修改符合条件的数据
int count = userMapper.update(new User(),userUpdateWrapper);
LOG.info("count : {}",count);
List userList = userMapper.selectByMap(null);
userList.forEach(u ->{
LOG.info("user : {}",u);
});
LOG.info("=============update by id==========");
// 获取要修改的对象
User user = userMapper.selectById(1);
LOG.info("update before user : {}",user);
user.setName("test");
// 根据传入对象的id去修改指定的记录
count = userMapper.updateById(user);
LOG.info("count : {}",count);
user = userMapper.selectById(1);
LOG.info("updateById after user : {}",user);
}
@Test
void testInsert(){
User user = new User();
user.setName("test_8");
user.setAge(19);
user.setEmail("[email protected]");
int count = userMapper.insert(user);
LOG.info("插入成功:{}条",count);
}
结果:
@Test
void testDelete(){
// 使用条件构造器删除符合条件的,使用QueryWrapper和UpdateWrapper都行,没有删除相关的wrapper
QueryWrapper queryWrapper = new QueryWrapper<>();
int count = userMapper.delete(queryWrapper.eq("name","test_8"));
LOG.info("删除成功:{}条",count);
UpdateWrapper updateWrapper = new UpdateWrapper<>();
count = userMapper.delete(updateWrapper.eq("name","Jone_u"));
LOG.info("删除成功:{}条",count);
// 使用map删除
Map map = new HashMap<>();
map.put("id",7);
count = userMapper.deleteByMap(map);
LOG.info("删除成功:{}条",count);
// 使用id删除
count = userMapper.deleteById(5);
LOG.info("删除成功:{}条",count);
}
@EnableTransactionManagement
@Configuration
@MapperScan("com.le.mybatis_plus.mapper.*mapper*")
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
return paginationInterceptor;
}
}
@Test
void testPagination(){
Page page = new Page<>();
// 设置当前是哪一页,页数从1开始,传入小于1的数据都会当作1处理
page.setCurrent(-1);
// 设置每页的数据大小
page.setSize(2);
IPage userIPage = userMapper.selectPage(page,null);
// 获取数据库中总记录数
LOG.info("total : {}",userIPage.getTotal());
// 打印当前页中所有记录
userIPage.getRecords().forEach(user -> {
LOG.info("user : {}",user);
});
}
具体结果如下: