mybatis-plus的condition的使用,简化代码的方法

本文探讨了在使用MyBatis-Plus进行接口查询时如何优化条件构造,特别是非空判断的处理。通过示例展示了利用condition方法简化代码,并提醒了在使用or条件时需要注意的错误陷阱,强调了将非空判断置于前面的重要性,以避免SQL构建错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在接口查询的时候,很多时候要使用这种非空的判断

    @Test
    public void testCondition() {
        String name = "梅";
        LambdaQueryWrapper<User> userQueryWrapper = Wrappers.<User>lambdaQuery();
        if(StringUtils.isNotEmpty(name)){
            userQueryWrapper.likeRight(User::getName, name );
        }
        List<User> users = userMapper.selectList(userQueryWrapper);
        System.out.println(users);
    }

 一旦非空判断多了,会导致代码过多,mp提供了condition来解决,可以节省很多代码

condition=true加入sql,false条件不会加入到sql中

    @Test
    public void testCondition() {
        String name = "梅";
        LambdaQueryWrapper<User> userQueryWrapper = Wrappers.<User>lambdaQuery();
//        if(StringUtils.isNotEmpty(name)){
//            userQueryWrapper.likeRight(User::getName, name );
//        }
        //和上面的方法是等价的
        userQueryWrapper.likeRight(StringUtils.isNotEmpty(name),User::getName, name );
        List<User> users = userMapper.selectList(userQueryWrapper);
        System.out.println(users);
    }

但是有个问题需要注意,当我们使用功能or()条件的时候,把非空一定要放在前面,否则很容易报错,举例如下

    @Test
    public void testCondition() {
        String name = "梅";
        LambdaQueryWrapper<User> userQueryWrapper = Wrappers.<User>lambdaQuery();
        String email = null;
        Integer age = null;
        userQueryWrapper.likeRight(StringUtils.isNotEmpty(name), User::getName, "梅")
                .and(wq -> wq
                        //下面使用or查询,如果刚好like和ge的condition都是false,这个sql就会报错
                        .like(StringUtils.isNotEmpty(name), User::getEmail, email)
                        .or()
                        .gt(age != null, User::getAge, age));
        List<User> users = userMapper.selectList(userQueryWrapper);
        System.out.println(users);
    }
}

推荐把条件判断放到前面(此处仅作出代码示范,为考虑sql逻辑)

    @Test
    public void testCondition() {
        String name = "梅";
        LambdaQueryWrapper<User> userQueryWrapper = Wrappers.<User>lambdaQuery();
        String email = null;
        Integer age = null;
        userQueryWrapper.likeRight(StringUtils.isNotEmpty(name), User::getName, "梅")
                .and(StringUtils.isNotEmpty(name) && age != null,wq -> wq
                        //下面使用or查询,如果刚好like和ge的condition都是false,这个sql就会报错
                        .like(User::getEmail, email)
                        .or()
                        .gt(User::getAge, age));
        List<User> users = userMapper.selectList(userQueryWrapper);
        System.out.println(users);
    }

 

 

 

 

 

 

 

 

 

 

 

 

<think>嗯,用户之前问了关于org.anyline-data-jdbc的问题,现在又问如何将它与MyBatis-Plus结合使用。我需要先理解他们为什么会这么问。可能用户已经在使用MyBatis-Plus,但想引入AnyLine的功能,比如动态SQL生成或者更灵活的结果映射,同时保留MyBatis-Plus的优点,比如方便的CRUD操作。 首先,我得确认这两个框架是否可以协同工作。AnyLine的data-jdbc主要是对JDBC的封装,而MyBatis-Plus是基于MyBatis的增强工具,两者在数据访问层的定位有些重叠,但可能有不同的侧重点。用户可能希望结合两者的优势,比如用MyBatis-Plus处理基础的CRUD,而用AnyLine处理复杂的动态查询。 接下来,我需要考虑如何整合它们。可能的整合点包括数据源配置、事务管理、以及在不同场景下使用不同的工具。例如,在需要复杂条件查询时使用AnyLine的Condition构建动态SQL,而在简单的CRUD操作时继续使用MyBatis-Plus的Mapper接口。 需要注意的是,两者可能都需要配置数据源,所以需要确保它们共享同一个数据源,避免资源浪费和事务问题。此外,事务管理可能需要统一,比如使用Spring的@Transactional注解来管理。 另外,用户可能关心是否需要额外的配置或依赖冲突。需要检查AnyLine和MyBatis-Plus的依赖是否兼容,尤其是它们的版本是否与当前项目中的Spring或其他框架版本匹配。 还有,用户可能希望看到具体的代码示例,比如如何在同一个Service中既调用MyBatis-Plus的Mapper,又使用AnyLine的JDBCService进行查询。这时候需要展示如何注入这两个组件,并在方法中结合使用。 同时,需要提醒用户注意两者在事务管理上的协同,确保在同一个事务中操作,避免数据不一致的问题。此外,要指出适用场景,比如复杂查询与简单CRUD的分工,以及可能的学习成本和维护复杂性。 最后,总结整合的优势和注意事项,帮助用户权衡是否适合他们的项目需求。可能还需要提到社区支持和文档资源,以便用户进一步查阅。</think>将 **AnyLine Data JDBC** 与 **MyBatis-Plus** 结合使用,可以结合两者的优势:利用 MyBatis-Plus 的快速 CRUD 和代码生成能力,同时借助 AnyLine 的动态 SQL 和灵活查询功能。以下是结合使用的典型场景和实现方式: --- ### **结合思路** - **分工协作** - **MyBatis-Plus**:处理简单 CRUD(如单表增删改查、自动分页)。 - **AnyLine Data JDBC**:处理复杂动态查询(如多表关联、动态条件拼接)。 - **共享数据源**:共用同一数据源,避免资源浪费。 - **事务统一管理**:通过 Spring 事务管理器统一控制。 --- ### **实现步骤** #### 1. **依赖配置** 确保项目中同时引入两者的依赖(注意版本兼容性): ```xml <!-- MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <!-- AnyLine Data JDBC --> <dependency> <groupId>org.anyline</groupId> <artifactId>anyline-data-jdbc</artifactId> <version>8.5.1</version> </dependency> ``` #### 2. **共享数据源** 在 Spring Boot 中配置统一数据源(如 HikariCP): ```yaml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test username: root password: 123456 type: com.zaxxer.hikari.HikariDataSource ``` #### 3. **服务层调用示例** 在 Service 中同时注入 MyBatis-Plus 的 Mapper 和 AnyLine 的 `JDBCService`: ```java @Service public class UserService { @Autowired private UserMapper userMapper; // MyBatis-Plus Mapper @Autowired private JDBCService jdbcService; // AnyLine JDBCService // 使用 MyBatis-Plus 查询单条记录 public User getById(Long id) { return userMapper.selectById(id); } // 使用 AnyLine 执行动态复杂查询 public List<User> findUsers(String name, Integer minAge) { Condition cond = condition("NAME LIKE ?", "%" + name + "%") .and("AGE > ?", minAge) .orderBy("CREATE_TIME"); DataSet data = jdbcService.querys("USER", cond); return data.getList(User.class); } } ``` #### 4. **事务管理** 通过 `@Transactional` 统一管理事务: ```java @Transactional public void updateUser(User user) { // MyBatis-Plus 更新操作 userMapper.updateById(user); // AnyLine 记录日志到另一张表 jdbcService.insert("USER_LOG", values("USER_ID", user.getId()) .add("ACTION", "update") ); } ``` --- ### **结合场景** #### 1. **复杂条件查询 + 简单 CRUD** - **MyBatis-Plus**:处理 `insert`, `update`, `delete` 等基础操作。 - **AnyLine**:处理动态过滤、多表关联、统计查询等场景。 #### 2. **动态 SQL 扩展** 当 MyBatis-Plus 的 `QueryWrapper` 无法满足复杂条件时,改用 AnyLine 的 `Condition`: ```java public List<User> search(Map<String, Object> params) { Condition cond = condition(); if (params.containsKey("name")) { cond.and("NAME LIKE ?", params.get("name")); } if (params.containsKey("roles")) { cond.and("ROLE IN (?)", (List<String>) params.get("roles")); } return jdbcService.querys("USER", cond).getList(User.class); } ``` #### 3. **多数据源混合操作** 结合 MyBatis-Plus 的主库和 AnyLine 的从库查询: ```java @Autowired @Qualifier("masterDataSource") private DataSource masterDataSource; // MyBatis-Plus 主库 @Autowired @Qualifier("slaveDataSource") private DataSource slaveDataSource; // AnyLine 从库 public void readFromSlaveWriteToMaster() { JDBCService slaveService = new JDBCService(slaveDataSource); DataSet data = slaveService.querys("READ_ONLY_TABLE"); userMapper.batchInsert(data.getList(User.class)); // 写入主库 } ``` --- ### **注意事项** 1. **避免功能重叠** 两者均支持分页、条件查询,需明确边界(例如:MyBatis-Plus 负责单表,AnyLine 负责多表)。 2. **事务一致性** 跨框架操作时,确保使用 Spring 事务管理器(如 `@Transactional`)保障原子性。 3. **性能权衡** MyBatis-Plus 的 ORM 映射效率更高,AnyLine 的灵活性可能带来轻微性能损耗。 4. **版本兼容性** 确保 AnyLine 和 MyBatis-Plus 的依赖库(如 Spring、JDBC 驱动)版本兼容。 --- ### **优势总结** - **灵活互补**:MyBatis-Plus 简化基础操作,AnyLine 填补复杂查询缺口。 - **降低迁移成本**:逐步替换原有复杂 SQL,无需重写全部 DAO 层。 - **统一维护**:共享数据源和事务管理,降低运维复杂度。 如果需要更深入集成(如自定义 MyBatis 插件调用 AnyLine 功能),可参考两者的扩展 API 文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值