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的传参。
解决方法:
官网说明:
image
image
补充: 注解方式在实体类对应的字段上加注解@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);
posted @ 2023-04-25 11:21  wandoubaguo  阅读(40)  评论(0编辑  收藏  举报