使用druid的工具包改sql的库名,实现单实例分库
2023-06-13 09:16:39 时间
前言,没时间解释了,先贴代码
1.新增自定义Visitor
/**
* 自定义Visitor ,这里是MySQL,其他数据库请自行更换
**/
public static class MyReplaceTableVisitor extends MySqlASTVisitorAdapter {
private final String databaseName;
public MyReplaceTableVisitor(String databaseName) {
this.databaseName = databaseName;
}
@Override
public boolean visit(SQLExprTableSource x) {
String originTableName = x.getExpr().toString();
if (databaseName != null) {
if (originTableName.contains(".")) {
return true;
}
//修改表名
x.setExpr(databaseName + "." + originTableName);
logger.info(" replace table:" + originTableName + " -> " + databaseName + "." + originTableName);
}
return true;
}
}
2.替换方法
public static String replaceTableName(String sql, String tableName) {
if (tableName == null) {
return sql;
}
List<SQLStatement> statements = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
MyReplaceTableVisitor visitor = new MyReplaceTableVisitor(tableName);
for (SQLStatement stmt : statements) {
stmt.accept(visitor);
}
return SQLUtils.toSQLString(statements, JdbcConstants.MYSQL);
}
调用测试方法
public static void main(String[] args) {
String sql = "select c.*, (select a.name as province_name from portal_area a where a.id = c.province_id) as province_name, (select a.name as city_name from portal_area a where a.id = c.city_id) as city_name, (CASE WHEN c.area_id IS NULL THEN NULL ELSE (select a.name as area_name from portal_area a where a.id = c.area_id) END )as area_name from portal.portal_company c where no = ?";
String s = replaceTableName(sql, "abc");
System.out.println(s);
}
相关文章
- 实现SQL Server 原生数据从XML生成JSON数据的实例代码
- SQL SERVER 分组求和sql语句
- 删除Oracle数据库中的列——SQL实现(oracle删除列sql)
- MySQL轻松实现快速导入SQL文件(mysql快速导入sql文件)
- MySQL动态SQL:实现动态查询的高效方式。(mysql动态sql)
- 操作MySQL数据库:操作SQL语句必备技能(mysql数据库sql语句)
- MySQL分页查询:实现快速简单的SQL语句(mysql分页查询sql语句)
- 实现成功:使用SQL登录Oracle数据库(sql登录oracle)
- 语句MySQL优化:精确掌握SQL语句(mysql优化sql)
- Oracle中的SQL语句学习指南(oracle的sql语句)
- MySQL学习笔记:如何通过SQL语句增加字段?(mysql增加字段sql)
- 学习SQL Server存储过程:实例演示带你熟悉(sqlserver存储过程实例)
- Oracle数据库如何导入SQL表(oracle导入sql表)
- Oracle SQL实现拼接操作: 核心方法与实例演示(oraclesql拼接)
- sql三米长的MySQL SQL:所见皆可攻破(3m mysql)
- 不同云环境中的部署SQL Server实例在云环境中的实现与部署(sqlserver实例在)
- Oracle自动启动:让实例在需要时某种语言编写的脚本自动运行。(oracle自动启动实例)
- SQL数据同步MySQL的详细步骤和注意事项(sql同步mysql)
- MSSQL实现SQL注入防护的完美解决方案(mssql 防sql注入)
- Oracle SQL跟踪工具:优化SQL查询的得力助手(oracle跟踪sql工具)
- Oracle SQL添加列:轻松实现更新数据库表的目的(oracle添加列sql)
- MySQL实现SQL脚本查询与操作(mysql执行sql脚本)
- 如何利用Oracle掌握SQL写作技巧(oracle写sql格式)
- MySQL中防御SQL注入攻击的方法(mysql中sql注入)
- MySQL中SQL语句实现求差(mysql中sql求差)
- MySQL中使用SQL剪切实现数据处理(mysql中sql剪切)
- azure sql比较分析AWS MySQL 与 Azure SQL的区别(aws mysql 还是)
- SQL取用Redis缓存技术实现数据提速(sql读取redis缓存)
- SQL与Redis实现数据的迅速存取(sql与redis)
- Oracle SQL语句实现列数据修改(oracle修改列sql)
- 极速提升Oracle SQL进程效率(oracle sql进程)
- Oracle SQL提交轻松实现数据库信息更新(oracle sql提交)
- Sql学习第一天——SQL练习题(建表/sql语句)