多层嵌套查询
@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
(a=1 and b=2) or( c=3 and d=4)类似的sql
queryWrapper.and(StringUtils.isNotEmpty(callDetailRecordQuery.getCustomerNumber()), wrapper -> {
wrapper.and(w->{
w.eq(CallDetailRecordDO.CONTACT_TYPE, ContactTypeEnum.INBOUND.getCode())
.eq(CallDetailRecordDO.CALLING_NUMBER, callDetailRecordQuery.getCustomerNumber());
});
wrapper.or(w->{
w.eq(CallDetailRecordDO.CONTACT_TYPE, ContactTypeEnum.OUTBOND.getCode())
.eq(CallDetailRecordDO.CALLED_NUMBER, callDetailRecordQuery.getCustomerNumber());
});
});
打印
WHERE (start_time BETWEEN ? AND ? AND ((contact_type = ? AND calling_number = ?) OR (contact_type = ? AND called_number = ?)))
不写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;
}
update有俩个参数,第一个参数DO 对应set 后面语句,如果为空不设置,第二个参数 Wrapper对应 如果执行了eq 方法,那就对应Where后面的语句,执行了set方法对应为set语句后面的,设置为空也会更新的。
Mybatis-Plus Lambda表达式
Wrappers.<User>lambdaQuery().select(User::getId).eq(true, User::getId, 1).orderByDesc(User::getId);
Wrappers.query().select(User.ID);
自定义分页
<select id="selectPageTest" resultType="com.weimob.xiaoke.smart.entity.keyword.po.CallKeywordDO">
SELECT *
FROM t_call_keyword_2022_12
</select>
IPage<CallKeywordDO> selectPageTest(IPage<CallKeywordDO> page);
测试方法
@Test
public void test(){
Page<CallKeywordDO> page=new Page<>();
callKeywordMapper.selectPageTest(page);
System.out.println(JSON.toJSONString(page));
}
参考:
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