首页 > 其他分享 >mybatis-plus动态表名

mybatis-plus动态表名

时间:2023-02-20 12:22:26浏览次数:40  
标签:插件 String 表名 plus sql mybatis import interceptor com

package com.ruoyi.framework.config;

import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.core.toolkit.TableNameParser;
import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Data
@NoArgsConstructor
@AllArgsConstructor
@SuppressWarnings({"rawtypes"})
public class DynamicTableNameInnerInterceptor implements InnerInterceptor {

    private Map<String, TableNameHandler> tableNameHandlerMap;

    @Override
    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
        PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
        if (InterceptorIgnoreHelper.willIgnoreDynamicTableName(ms.getId())) return;
        mpBs.sql(this.changeTable(mpBs.sql()));
    }

    @Override
    public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
        PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh);
        MappedStatement ms = mpSh.mappedStatement();
        SqlCommandType sct = ms.getSqlCommandType();
        if (sct == SqlCommandType.INSERT || sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) {
            if (InterceptorIgnoreHelper.willIgnoreDynamicTableName(ms.getId())) return;
            PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
            mpBs.sql(this.changeTable(mpBs.sql()));
        }
    }

    protected String changeTable(String sql) {
        TableNameParser parser = new TableNameParser(sql);
        List<TableNameParser.SqlToken> names = new ArrayList<>();
        parser.accept(names::add);
        StringBuilder builder = new StringBuilder();
        int last = 0;
        for (TableNameParser.SqlToken name : names) {
            int start = name.getStart();
            if (start != last) {
                builder.append(sql, last, start);
                String value = name.getValue();
                TableNameHandler handler = tableNameHandlerMap.get(value);
                if (handler != null) {
                    builder.append(handler.dynamicTableName(sql, value));
                } else {
                    builder.append(value);
                }
            }
            last = name.getEnd();
        }
        if (last != sql.length()) {
            builder.append(sql.substring(last));
        }
        return builder.toString();
    }
}
package com.ruoyi.framework.config;

import cn.hutool.core.lang.Console;
import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;

public class MyTableNameHandler implements TableNameHandler {
    /**
     * @param sql       原始SQL
     * @param tableName 表名
     * @return 动态表名
     */
    @Override
    public String dynamicTableName(String sql, String tableName) {
        Console.log("sql:{}",sql);
        // 模拟获取月份参数,实际应该从参数中获取
        String[] month = {"epay"};
        // 随机获取
        String dynamicTableName = month[0] + "." + tableName ;
        System.err.println("动态查询表:" + dynamicTableName);
        return dynamicTableName;
    }
}
@Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 多租户插件
        interceptor.addInnerInterceptor(tenantLineInnerInterceptor());
        // 如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add
        // PaginationInnerInterceptor
        // 用了分页插件必须设置 MybatisConfiguration#useDeprecatedExecutor = false
        // 分页插件
        // interceptor.addInnerInterceptor(paginationInnerInterceptor());

        // 添加动态表名插件
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        TableNameHandler tableNameHandler = new MyTableNameHandler();
        Map<String, TableNameHandler> tableNameHandlerMap = new HashMap<>();
        tableNameHandlerMap.put("sys_user", tableNameHandler); // sys_user 表配置动态表名插件
        dynamicTableNameInnerInterceptor.setTableNameHandlerMap(tableNameHandlerMap);
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);

        // 乐观锁插件
        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
        // 阻断插件
        interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
        return interceptor;
    }

 

标签:插件,String,表名,plus,sql,mybatis,import,interceptor,com
From: https://www.cnblogs.com/wujf/p/17136892.html

相关文章

  • 8. Spring和Mybatis
    AOP和IOC的理解IoC(InversionofControl:控制反转)是一种设计思想,而不是一个具体的技术实现。IoC的思想就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理......
  • Mybatis_缓存知识
    应用程序与数据库进行交互,相对耗时,通过缓存查询结果,可以在一定程度上减少此耗时。  在SQL映射文件中,一个select标签对应的一个statement对象。(以下session指的是SqlS......
  • Mybatis-Plus无法将字段更新为null的原因及解决方法。
    问题描述用Mybatis-Plus的update()或者updateById()来更新数据时,无法将字段设置为null值(更新后数据还是原来的值)。原因概述    默认情况下,Mybatis-Plu......
  • maven 自动生成mybatis代码
    <!--dependency和plugin中jar的版本根据自己需求选择,但同一个jar版本要保持一致--><!--配置在dependencies中--><dependency><groupId>org.mybatis.gener......
  • mybatis操作数据库
    mybatis介绍mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。mybatis结构操......
  • 10.MyBatis-Plus的使用
    整合MyBatis-Plus导入依赖在解决逆向工程生成的代码报错时候已经给bianen-common导入了依赖导入数据库的驱动导入驱动和MySql的版本有关,我安装的MySql版本是5.7.36打......
  • MyBatis面试题
    MyBatis面试题1、什么是Mybatis?1、Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接......
  • element-plus实现table表格序号递增的效果
    element-plus组件排序,可以给序号行加一个type="index"就可以实现按序号排序效果,但是当页码到第二页时,又是从一开始排列了。想要实现的效果是翻页后页码接上一页的顺序......
  • 使用ThreadLocal+OpenSessionInView优化Mybatis使用
    使用一个名为OpenSessionInView的servlet过滤器,简化在服务中使用mybatis的操作。   一、情况分析Mybatis的使用过程:1、获取配置文件2、获取session工厂......
  • springboot mybatis (关联关系:一对一,一对多,多对多)
    例如这个学生选课的这个:这个里面课程跟老师是1对1的,而老师对课程是1对多的,一个课程只能由一个老师教,而一个老师可以教多个课程对于学生和课程之间是多对多的,一个学生可以......