MyBatis-Plus-In-Action MyBatis-Plus实战

本文详细介绍MyBatis-Plus框架的使用,包括快速入门、基本CRUD操作、条件构造器使用、ActiveRecord模式、代码生成器、插件拓展、自定义全局操作、公共字段自动填充及IDEA插件应用,适合初学者快速掌握。

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

最近有个新项目在开发中使用了MyBatis-Plus框架,之前一直使用的都是MyBatis。为了更好的应用于现有项目,就系统的学习了一下。本系列文章基于笔者学习经验整理而成,适合MyBatis-Plus的快速入门学习。由于本人才疏学浅,在学习过程中,难免有所遗漏和错误,欢迎大牛们指正。

思维导图:

image

笔记目录:

一、MyBatis-Plus简介
二、快速开始——Spring集成Mybatis-Plus
  1、准备测试表
  2、新建Maven项目
    2.1、新建一个空的maven父项目
    2.2、修改pom文件
    2.3、新建mp01模块–快速开始
  源代码
三、基本CRUD操作
  1、insert操作
  2、update操作
  3、select操作
  4、delet操作
  5、完整测试代码
  6、Mybatis-Plus启动注入SQL原理分析
    6.1、问题
    6.2、通过现象看到本质
  源代码
四、条件构造器——AbstractWrapper
  1、使用QueryWrapper的更新操作
  2、使用QueryWrapper的查询操作
  3、使用QueryWrapper的删除操作
  4、完整的测试代码
  源代码
五、ActiveRecord(活动记录)
  1、AR 插入操作
  2、AR 修改操作
  3、AR 查询操作
  4、AR 删除操作
  5、AR 复杂分页操作
  6、完整测试代码
  源代码
六、代码生成器——逆行工程
  1、修改父项目的pom.xml文件
  2、修改mp05的pom.xml
  3、MP 代码生成器示例
  源代码
七、插件拓展
  1、分页插件
    1.1、修改mybatis-config.xml文件,添加分页插件
    1.2、修改applicationContext.xml文件,添加分页插件
    1.3、测试分页插件
  2、执行分析插件
    2.2、修改applicationContext.xml文件,添加执行分析插件
    2.2、测试执行分析插件
  3、乐观锁插件
    3.1、修改applicationContext.xml文件,添加乐观锁插件
    3.2、修改Employee实体类
    3.3、测试乐观锁插件
  源代码
八、自定义全局操作和全局sql注入
  1、修改EmployeeMapper
  2、新建DeleteAll类,继承AbstractMethod
  3、新建MySqlInjector类,继承DefaultSqlInjector
  4、修改applicationContext.xml文件,在 MP 全局策略中,配置自定义注入器
  5、测试自定义全局操作
  6、自定义注入器的应用——逻辑删除
    6.1、修改Employee
    6.2、修改applicationContext.xml文件
    6.3、修改TestMP测试类,添加测试方法
  源代码
九、公共字段自动填充
  1、元数据处理器接口——MetaObjectHandler
  2、开发步骤
    2.1、 注解填充字段 @TableFile(fill = FieldFill.INSERT) 查看 FieldFill
    2.2、 自定义公共字段填充处理器
    2.3、 MP 全局注入 自定义公共字段填充处理器
    2.4、测试
  源代码
十、使用Idea 快速开发插件

源代码:

github:MyBatis-Plus-In-Action

<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、付费专栏及课程。

余额充值