mybatis插件怎么实现自定义改写表名
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,这篇文章主要介绍"mybatis插件怎么实现自定义改写表名",在日常操作中,相信很多人在mybatis插件怎么实现自定义改写表名问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2025年11月10日mybatis插件怎么实现自定义改写表名
这篇文章主要介绍"mybatis插件怎么实现自定义改写表名",在日常操作中,相信很多人在mybatis插件怎么实现自定义改写表名问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"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 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插件怎么实现自定义改写表名"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
插件
学习
更多
帮助
实用
接下来
代码
文章
方法
标识
理论
知识
篇文章
网站
资料
跟着
问题
好用
实践
解答
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库和程序版本不匹配怎么办
江西网络安全知识竞答答案
为什么u盘不能考数据库
数据库远程连接数据库代理
著作权条例数据库
医院的是什么数据库
网络安全中国战略发展趋势
为什么软件开发要留后门
内网linux服务器配置
附件保存在数据库还是操作系统中
天津起源网络技术有限公司
华为软件开发面试资料汇总
常德文艺微刊数据库
统一安全区域的主机和服务器
上云网络技术有限公司
网络技术原理课本
魅族远程拍照系统服务器错误
地下城韩服手游无法连接服务器
服务器 多网卡
即时通讯软件开发收费情况
dreadhunger服务器前端
惠州嵌入式软件开发流程哪家好
浪潮信息云服务器最新
数据库原理及应用实例
吉林特种网络技术服务标准
宜兴加工软件开发项目信息
湖北好的软件开发售后保障
战地怎样选服务器
陇南武都发布网络安全宣传
湖南公共节目儿童网络安全教育