mybatis插件实现自定义改写表名实例代码

 更新时间:2022年04月24日 11:51:13   作者:beiwangnull  
在数据库操作过程中,经常有修改表名的需求,下面这篇文章主要给大家介绍了关于mybatis插件实现自定义改写表名的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

代码如下:

@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
    @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),})
public class RerouteToTableInterceptor implements Interceptor {
    private Map map;
    private Set<String> tableSet;
    public static boolean openInterceptor = false;
    public RerouteToTableInterceptor() {
        //标识使用了该插件
        setOpenInterceptor(true);
    }
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        MappedStatement ms = (MappedStatement) args[0];
        Object parameterObject = args[1];
        BoundSql boundSql = ms.getBoundSql(parameterObject);
        String sql = boundSql.getSql();
        MySqlStatementParser mySqlStatementParser = new MySqlStatementParser(sql);
        SQLStatement statement = mySqlStatementParser.parseStatement();
        SQLExprTableSource sqlTableSource = null;
        if(statement instanceof SQLSelectStatement){
            SQLSelect selectQuery = ((SQLSelectStatement)statement).getSelect();
            MySqlSelectQueryBlock sqlSelectQuery = (MySqlSelectQueryBlock)selectQuery.getQuery();
            sqlTableSource = (SQLExprTableSource)sqlSelectQuery.getFrom();
        }else if(statement instanceof SQLInsertStatement){
            SQLInsertStatement sqlInsertStatement = (SQLInsertStatement)statement;
            sqlTableSource = sqlInsertStatement.getTableSource();
        }else if(statement instanceof SQLUpdateStatement){
            SQLUpdateStatement sqlUpdateStatement = (SQLUpdateStatement)statement;
            sqlTableSource = (SQLExprTableSource)sqlUpdateStatement.getTableSource();
        }else if(statement instanceof SQLDeleteStatement){
            SQLDeleteStatement sqlUpdateStatement = (SQLDeleteStatement)statement;
            sqlTableSource = (SQLExprTableSource)sqlUpdateStatement.getTableSource();
        }
        String tableName = sqlTableSource.toString();
        if(tableSet.contains(tableName)){
            SQLIdentifierExpr sqlExpr = (SQLIdentifierExpr)sqlTableSource.getExpr();
            String newTableName = (String)map.get(tableName);
            if(!StringUtils.isEmpty(newTableName) && null != newTableName)
                sqlExpr.setName(newTableName);
        }
 
        BoundSql bs = new BoundSql(ms.getConfiguration(),statement.toString(),boundSql.getParameterMappings(),parameterObject);
 
        MappedStatement newMs = copyFromMappedStatement(ms, new BoundSqlSqlSource(bs));
        for (ParameterMapping mapping : boundSql.getParameterMappings()) {
            String prop = mapping.getProperty();
            if (boundSql.hasAdditionalParameter(prop)) {
                bs.setAdditionalParameter(prop, boundSql.getAdditionalParameter(prop));
            }
        }
        args[0] = newMs;
 
        return invocation.proceed();
    }
 
    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }
 
    @Override
    public void setProperties(Properties properties) {}
 
    public Map getMap() {
        return map;
    }
 
    public void setMap(Map map) {
        tableSet = map.keySet();
        this.map = map;
    }
    public boolean isOpenInterceptor() {
        return openInterceptor;
    }
 
    public void setOpenInterceptor(boolean openInterceptor) {
        this.openInterceptor = openInterceptor;
    }
 
    private MappedStatement copyFromMappedStatement(MappedStatement ms, SqlSource newSqlSource) {
        MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType());
        builder.resource(ms.getResource());
        builder.fetchSize(ms.getFetchSize());
        builder.statementType(ms.getStatementType());
        builder.keyGenerator(ms.getKeyGenerator());
        if (ms.getKeyProperties() != null && ms.getKeyProperties().length > 0) {
            builder.keyProperty(ms.getKeyProperties()[0]);
        }
        builder.timeout(ms.getTimeout());
        builder.parameterMap(ms.getParameterMap());
        builder.resultMaps(ms.getResultMaps());
        builder.resultSetType(ms.getResultSetType());
        builder.cache(ms.getCache());
        builder.flushCacheRequired(ms.isFlushCacheRequired());
        builder.useCache(ms.isUseCache());
        return builder.build();
    }
 
    public static class BoundSqlSqlSource implements SqlSource {
        private BoundSql boundSql;
        public BoundSqlSqlSource(BoundSql boundSql) {
            this.boundSql = boundSql;
        }
        public BoundSql getBoundSql(Object parameterObject) {
            return boundSql;
        }
    }
}

总结

到此这篇关于mybatis插件实现自定义改写表名的文章就介绍到这了,更多相关mybatis自定义改写表名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JDK14性能管理工具之Jconsole的使用详解

    JDK14性能管理工具之Jconsole的使用详解

    JConsole是JDK自带的管理工具,在JAVA_HOME/bin下面,直接命令JConsole即可开启JConsole。接下来通过本文给大家分享JDK14性能管理工具之Jconsole的使用,感兴趣的朋友一起看看吧
    2020-05-05
  • MyBatis-Plus条件构造器Wrapper应用实例

    MyBatis-Plus条件构造器Wrapper应用实例

    QueryWrapper是用于查询的Wrapper条件构造器,可以通过它来构建SELECT语句中的WHERE条件,这篇文章主要介绍了MyBatis-Plus数据表操作条件构造器Wrapper,需要的朋友可以参考下
    2023-09-09
  • JAVA实现简单停车场系统代码

    JAVA实现简单停车场系统代码

    JAVA项目中正号需要一个停车收费系统,就整理出来java实现的一个简单的停车收费系统给大家分享一下,希望对大家有所帮助
    2017-04-04
  • Kotlin 基础教程之异常

    Kotlin 基础教程之异常

    这篇文章主要介绍了Kotlin 基础教程之异常的相关资料,需要的朋友可以参考下
    2017-06-06
  • Java实现的日历功能完整示例

    Java实现的日历功能完整示例

    这篇文章主要介绍了Java实现的日历功能,结合完整实例形式分析了Java日历功能相关的日期时间获取、计算、显示等操作技巧,需要的朋友可以参考下
    2019-02-02
  • Java字符串定义及常用方法

    Java字符串定义及常用方法

    这篇文章主要介绍了Java字符串定义及常用方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • mybatis中#{}和${}的区别详解

    mybatis中#{}和${}的区别详解

    本文主要介绍了mybatis中#{}和${}的区别详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Spring Event事件通知机制解读

    Spring Event事件通知机制解读

    这篇文章主要介绍了Spring Event事件通知机制解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java排序算法之冒泡排序的原理及优化

    Java排序算法之冒泡排序的原理及优化

    这篇文章主要介绍了Java排序算法之冒泡排序的原理及优化,冒泡排序的思想很简单,遍历数组,比较相邻的两个元素,顺序错误就把它们交换,直到整个数组排序完成,因为每经过一趟排序,越小的元素会经交换而慢慢“浮”到数列的顶端,因此叫做冒泡排序,需要的朋友可以参考下
    2023-11-11
  • spring系列笔记之常用注解

    spring系列笔记之常用注解

    这篇文章主要给大家介绍了关于spring系列笔记之常用注解的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04

最新评论