MybatisPlus-特殊用法整理

多层嵌套查询

@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

MyBatis-Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上,提供了许多实用的功能,简化了 MyBatis 的使用,让开发更加高效。 MyBatis-Plus-Plus 是对 MyBatis-Plus 的再次封装,提供了更加简洁易用的 API,让开发者更加便捷地使用 MyBatis-Plus。 下面是 MyBatis-Plus-Plus 的使用示例: 1. 引入 MyBatis-Plus 和 MyBatis-Plus-Plus 的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>com.github.beyondlov1</groupId> <artifactId>mybatisplus-plus</artifactId> <version>1.0.0</version> </dependency> ``` 2. 创建实体类: ```java @Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; // 主键id private String name; // 名称 private Integer age; // 年龄 private String email; // 邮箱 } ``` 3. 创建 Mapper 接口: ```java public interface UserMapperPlus extends MybatisPlusMapper<User> { } ``` 4. 使用 MyBatis-Plus-Plus 的 API: ```java @Autowired private UserMapperPlus userMapper; // 插入数据 User user = new User(); user.setName("test"); user.setAge(18); user.setEmail("test@test.com"); userMapper.insert(user); // 更新数据 user.setName("test1"); userMapper.updateById(user); // 根据 id 查询数据 User user1 = userMapper.selectById(user.getId()); // 查询所有数据 List<User> userList = userMapper.selectList(null); // 分页查询数据 Page<User> page = new Page<>(1, 10); QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(User::getName, "test"); userMapper.selectPage(page, queryWrapper); ``` 以上就是 MyBatis-Plus-Plus 的简单使用示例,更多使用方法可以参考官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值