MyBatis-Plus 常用记录
1. or查询
简单or查询,拼装条件用or()方法连接
// mybatis-plus
List<Student> list = studentService.list(
new QueryWrapper<Student>()
.eq("sex", "男")
.or()
.eq("name", "张三")
);
//对应sql
// select * from student where ( sex = ? or name= ? )
2. and和or一起使用
查询条件中出现(A or B)and (C or D)情况查询:
// mybatis-plus
List<Student> list = studentService.list(
new QueryWrapper<Student>()
.eq("name", "张三")
.or(qw->qw.eq("sex", "男").eq("age",24))
//对应sql
// select * from student where ( name = ? or ( ( sex = ? and age = ? ) ) )
查询条件中出现(A and B) or (C and D)情况查询:
// mybatis-plus
List<Student> list = studentService.list(
new QueryWrapper<Student>()
.eq("name", "张三")
and(qw->qw->qw.eq("sex", "男").eq("age",24))
//对应sql
// select * from student where ( name = ? and ( ( sex = ? and age = ? ) ) )
3. 取前n条 limit n
List<String> taskIds = taskMapper.selectList(
new QueryWrapper<Task>().select("taskId")
.in("status", Arrays.asList(Constants.WAITING, Constants.RUNNING))
.or(qw->qw.eq("status",Constants.SUCCESS).isNull("endTime"))
.last("limit 100"))
.stream().map(TaskEntity::getTaskId).collect(Collectors.toList());
4.LambdaUpdateWrapper 使用
int updateCount= taskMapper.update(null ,new LambdaUpdateWrapper<>(Task.class)
.eq(Task::getTaskId, taskId)
.set(Task::getStatus, Constants.SUCCESS)
.set(Task::getEndTime, new Date()));
Mapper封装的updateById()方法不能将字段更新为null
用updateById方法来更新数据时,把一个字段设置为null,实际更新后数据没有为null还是原来的值,原因是mybatis-plus在更新的时候做了null判断,默认不更新为null的传参。
解决方法:
官网说明:
补充: 注解方式在实体类对应的字段上加注解@TableField(strategy=FieldStrategy.IGNORED),忽略null值的判断;
全局注解和字段注解不推荐,可能对其他方法造成影响
在mybatis-plus中,除了updateById方法,还提供了一个update方法,除了以上官网的写法,还可以这样写:
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.set(User::getAge(), null);
wrapper.eq(User::getId(),id);
mapper.update(null,wrapper);
// 或者
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>().eq(User::getId,id);
User user = new User();
user.setAge(null);
mapper.update(user, wrapper);