【快速解决】若依管理系统后端将 Mybatis 升级为 Mybatis-Plus

该文章已生成可运行项目,

目录

1、注释掉MyBatis配置,新增MyBatis-Puls配置

2、common中加入MyBatis-Puls依赖

3、framework中注释掉这个bean

4、新加入一个MybatisPlusConfig配置

5、在ruoyi-framework模块下的pom.xml中引入ruoyi-common依赖


1、注释掉MyBatis配置,新增MyBatis-Puls配置

# MyBatis Plus配置
mybatis-plus:
  # 搜索指定包别名
  typeAliasesPackage: com.ruoyi.**.domain
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # 加载全局的配置文件
  configLocation: classpath:mybatis/mybatis-config.xml

2、common中加入MyBatis-Puls依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

3、framework中注释掉这个bean

4、新加入一个MybatisPlusConfig配置

package com.ruoyi.framework.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * Mybatis Plus 配置
 *
 * @author ruoyi
 */
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(paginationInnerInterceptor());
        // 乐观锁插件
        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
        // 阻断插件
        interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
        return interceptor;
    }

    /**
     * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
     */
    public PaginationInnerInterceptor paginationInnerInterceptor() {
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置数据库类型为mysql
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        paginationInnerInterceptor.setMaxLimit(-1L);
        return paginationInnerInterceptor;
    }

    /**
     * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
     */
    public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
        return new OptimisticLockerInnerInterceptor();
    }

    /**
     * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
     */
    public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
        return new BlockAttackInnerInterceptor();
    }
}

5、在ruoyi-framework模块下的pom.xml中引入ruoyi-common依赖

        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>

本文章已经生成可运行项目
<think>首先,用户的问题是:“我想查找在若依框架中将MyBatis升级MyBatis-Plus并实现多租户插件的方法”。用户指定了参考站内引用,提供了四个引用:[^1], [^2], [^3], [^4]。这些引用讨论了MyBatis-PlusMyBatis-Flex的优点、多租户功能等。 关键点: - 用户想在若依框架(RuoYi Framework)中将MyBatis升级MyBatis-Plus- 然后实现多租户插件。 从引用中提取相关信息: - [^1]:提到MyBatis-Plus可以减少代码,提高效率。 - [^2]:讨论未来趋势,提到多租户支持。 - [^3]:具体关于在商城中使用MyBatis-Plus实现多租户功能,涉及TenantLineInnerInterceptor。 - [^4]:详细介绍MyBatis-Plus多租户插件的用法,包括如何过滤SQL不需要租户ID。 系统级指令: - 回答中使用中文。 - 行内数学表达式用$...$(但这里可能不适用数学)。 - 独立公式用$$...$$(不适用)。 - LaTeX语法正确(主要是代码块)。 - 生成相关问题。 - 引用的段落末尾添加引用标识,如[^1]。 用户可见层:回答结构清晰,逐步解决问题,保证真实可靠。 我的回答结构: 1. **理解问题**:确认用户需求。 2. **升级MyBatisMyBatis-Plus**:解释如何在若依框架中升级。 3. **实现多租户插件**:使用MyBatis-Plus的多租户功能。 4. **参考引用**:融入引用中的信息。 5. **代码示例**:提供代码块以展示实现。 6. **相关问题**:生成相关问题。 逐步回答: - **升级MyBatisMyBatis-Plus**: - 若依框架是基于Spring Boot的开源框架,默认使用MyBatis- 升级步骤:添加MyBatis-Plus依赖、替换MyBatis配置、更新Mapper等。 - **实现多租户插件**: - 引用[^4]提供了过滤SQL的方法。 - 引用[^3]提到TenantLineInnerInterceptor。 - 实现多租户需要配置拦截器、定义租户ID字段等。 详细步骤: 1. **添加MyBatis-Plus依赖**:在pom.xml中添加依赖。 2. **配置MyBatis-Plus**:在配置文件中设置。 3. **集成多租户插件**: - 使用TenantLineInnerInterceptor。 - 参考引用[^4]中的过滤方法。 - 定义租户ID处理逻辑。 4. **示例代码**:提供Java配置代码。 生成相关问题: - 相关问题:基于用户查询,如优化、常见问题等。 确保引用: - 在回答中引用相关段落,添加[^1][^3][^4]。 最终回答大纲: - 介绍:简要说明升级和实现多租户的关键点。 - 步骤1:升级MyBatisMyBatis-Plus- 步骤2:配置多租户插件。 - 代码示例。 - 注意事项。 - 相关问题。 </think>### 在若依框架中将MyBatis升级MyBatis-Plus并实现多租户插件的方法 在若依框架(RuoYi)中,将原生MyBatis升级MyBatis-Plus并集成多租户功能,可以显著简化数据访问层开发,减少重复代码,提升效率30%以上[^1]。MyBatis-Plus提供了开箱即用的多租户插件(如`TenantLineInnerInterceptor`),支持租户ID自动注入和SQL过滤。下面是逐步实现方法,基于引用[^3][^4]的最佳实践和官方文档。 --- #### **步骤1: 升级MyBatisMyBatis-Plus** 1. **添加依赖**:在若依项目的`pom.xml`文件中,移除原有MyBatis依赖,添加MyBatis-Plus起步依赖。 ```xml <!-- 移除旧依赖 --> <!-- <dependency> --> <!-- <groupId>org.mybatis.spring.boot</groupId> --> <!-- <artifactId>mybatis-spring-boot-starter</artifactId> --> <!-- </dependency> --> <!-- 添加MyBatis-Plus依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> <!-- 使用最新稳定版本 --> </dependency> ``` 2. **更新配置**:在`application.yml`中,配置MyBatis-Plus全局设置,替换原有MyBatis配置。 ```yaml mybatis-plus: configuration: map-underscore-to-camel-case: true # 开启驼峰命名 global-config: db-config: id-type: auto # 主键策略 mapper-locations: classpath*:mapper/**/*.xml # 映射文件路径 ``` 3. **替换Mapper接口**:将原有Mapper接口继承`BaseMapper`,例如: ```java // 旧接口:public interface UserMapper extends Mapper<User> {} // 新接口: public interface UserMapper extends BaseMapper<User> {} ``` 升级后,MyBatis-Plus将自动增强CRUD操作,减少基础代码量[^1]。 --- #### **步骤2: 实现多租户插件** 多租户功能通过`TenantLineInnerInterceptor`拦截器实现,自动在SQL中注入租户ID字段(如`tenant_id`)。引用[^3]在商城项目中验证了此方案的可行性。 1. **定义租户处理器**:创建类实现`TenantLineHandler`接口,指定租户ID字段和值获取方式(通常从Session或Token中获取)。 ```java public class CustomTenantHandler implements TenantLineHandler { @Override public String getTenantIdColumn() { return "tenant_id"; // 数据库中的租户ID字段名 } @Override public Expression getTenantId() { // 从当前用户上下文中获取租户ID(示例使用固定值,实际从SecurityUtils获取) Long tenantId = SecurityUtils.getTenantId(); // 若依框架的租户管理模块 return new LongValue(tenantId); } @Override public boolean ignoreTable(String tableName) { // 忽略不需要租户过滤的表(如系统表) return "sys_config".equals(tableName); // 示例忽略sys_config表 } } ``` 2. **配置多租户插件**:在MyBatis配置类中注册拦截器。 ```java @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加多租户插件 interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new CustomTenantHandler())); return interceptor; } } ``` 3. **SQL过滤(可选)**:引用[^4]提到,部分SQL可能需跳过租户ID注入。可通过注解或配置过滤器实现: - **方法1:使用`@SqlParser`注解**(适用于特定Mapper方法) ```java public interface UserMapper extends BaseMapper<User> { @SqlParser(filter = true) // 跳过租户过滤 @Update("update user set status=0 where id=#{id}") int adminUpdateStatus(Long id); } ``` - **方法2:配置全局SQL解析器**(在`application.yml`中启用) ```yaml mybatis-plus: global-config: sql-parser-cache: true # 启用SQL解析缓存(MyBatis-Plus 3.1.1+无需此配置) ``` --- #### **步骤3: 集成若依框架的租户管理** 若依框架内置多租户模块(引用[^3]描述),需将MyBatis-Plus插件与其结合: 1. **租户分配**:在若依后台【平台管理】-【平台用户管理】中,为平台用户分配租户。用户登录后,可从Session获取当前租户ID。 2. **租户切换**:实现前端租户切换功能(如左上角下拉菜单),切换时更新后端租户上下文。 ```java // 示例:在Controller中处理租户切换 @PostMapping("/switchTenant") public R switchTenant(Long tenantId) { SecurityUtils.setCurrentTenantId(tenantId); // 存储到ThreadLocal return R.ok(); } ``` 3. **实体类修改**:为相关实体类添加`tenantId`字段,并确保数据库表包含该列。 --- #### **注意事项** - **数据库变更**:所有需租户隔离的表必须添加`tenant_id`字段(类型建议为BIGINT)。 - **性能优化**:引用[^2]提到,MyBatis-Plus的轻量设计适合云环境;避免在全表扫描时忽略租户ID。 - **版本兼容**:使用MyBatis-Plus最新版(如v4.3),支持智能主键策略[^2]。若依框架升级时需测试兼容性。 - **测试验证**:确保插入、查询、更新操作自动注入租户ID,忽略表正常执行。 实践证明,此方案能简化多租户实现,让开发者聚焦业务逻辑[^1]。若遇到问题,参考MyBatis-Plus官方文档或若依社区案例。 --- ### 相关问题 1. 如何优化MyBatis-Plus多租户插件的性能? 2. 若依框架中如何实现动态数据源切换(如分库分表)? 3. MyBatis-PlusMyBatis-Flex在多租户场景下的优缺点对比?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命运之光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值