多层嵌套查询
@Test
public void test1(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.select(User.ID);
String param="admin";
queryWrapper.eq(User.SEX, 0);
queryWrapper.and(Objects.nonNull(param), wrapper -> {
wrapper.like(User.NAME, param);
wrapper.or().like(User.ACCOUNT, param);
return wrapper;
});
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(JSON.toJSONString(userList));
}
打印的SQL
: ==> Preparing: SELECT id FROM t_system_user WHERE sex = ? AND ( name LIKE ? OR account LIKE ? )
: ==> Parameters: 0(Integer), %admin%(String), %admin%(String)
: <== Total: 2
不写sql执行数学运算
UpdateWrapper<User> updateWrapper = new UpdateWrapper();
String setSql = String.format("%s = %s + %d", User.HIT_NUM, User.HIT_NUM, 1);
updateWrapper.in(User.ID, id)
.lambda().setSql(setSql);
mindLabelService.update(updateWrapper);
碰到前端设置时间为空,要求更新到数据,安装正常情况下,mybatis-plus只会更新不为空的数据,可以设置TableField注解的updateStrategy值为IGNORED,但是比较危险,所有使用这个pojo的位置都会受到影响,比如我现在只更新a字段,pojo中b字段则为null,那样的设置就会更新b。比较保守的方式如下:
@PostMapping("/editTest")
public Object editTest(@RequestBody InspectReviewPlanDO inspectReviewPlanDO) throws ParseException {
System.out.println(JSON.toJSONString(inspectReviewPlanDO));
//日期类型的字段,前端传"",映射到后台为null,使用updateById是不能更新的。
// 字符串类型的字段,前端传"",映射到后台为"",使用updateById是能更新的。
LambdaUpdateWrapper<InspectReviewPlanDO> wrapper = new LambdaUpdateWrapper<>();
//将那些为null,但是需要更新到db的使用set方法设置一下即可。
wrapper.set(InspectReviewPlanDO::getInspectBeginTime,inspectReviewPlanDO.getInspectBeginTime());
wrapper.eq(InspectReviewPlanDO::getId,inspectReviewPlanDO.getId());
inspectReviewPlanMapper.update(inspectReviewPlanDO,wrapper);
//inspectReviewPlanMapper.updateById(inspectReviewPlanDO);
return inspectReviewPlanDO;
}
参考:
https://blog.csdn.net/lsqingfeng/article/details/106411954
https://blog.csdn.net/qq_39403545/article/details/85334250
https://blog.csdn.net/xiaoxiong_blog/article/details/107186168
来源:oschina
链接:https://my.oschina.net/u/4265788/blog/4721992