服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - mybatis插件实现自定义改写表名实例代码

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

2022-11-21 13:33beiwangnull Java教程

在数据库操作过程中,经常有修改表名的需求,下面这篇文章主要给大家介绍了关于mybatis插件实现自定义改写表名的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
@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自定义改写表名内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/hncaoyuqi/article/details/103187983

延伸 · 阅读

精彩推荐