import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter; class TableNameModifier extends MySqlASTVisitorAdapter{ private String tableName; private String newTableName; public TableNameModifier(String tableName, String newTableName) { this.tableName = tableName; this.newTableName = newTableName; } @Override public boolean visit(SQLSelectStatement astNode) { astNode.getSelect().accept(this); return false; } @Override public boolean visit(SQLSelect x){ x.getQuery().accept(this); return false; } @Override public boolean visit(SQLExprTableSource x){ x.getExpr().accept(this); return false; } @Override public boolean visit(SQLIdentifierExpr x) { if(x.getName().toLowerCase().trim().equals(tableName)){ x.setName(newTableName); } return false; } }
import java.text.MessageFormat; import java.util.List; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; import com.alibaba.druid.stat.TableStat.Condition; public class Sql { public static void main(String[] args) { String tableName = "xx_comic_readrecord", column = "user_id"; String newTableFormater = "xx_comic_readrecord_{0}"; String sqlInsert = "insert into xx_comic_readrecord(user_id, comic_id, image_ids, chapter_ids) values(4, 891,?,?)"; String sqlSelect = "select user_id, comic_id, image_ids, chapter_ids from xx_comic_readrecord where user_id=4 and comic_id in (select comic_id from xx_comic where status=3)"; String sqlUpdate = "update xx_comic_readrecord set image_ids=? where user_id=4 and comic_id=891"; String sqlDelete = "delete from xx_comic_readrecord where user_id=4 and comic_id=891"; MySqlOutputVisitor output = new MySqlOutputVisitor(new StringBuilder()); MySqlStatementParser parser = new MySqlStatementParser(sqlUpdate); MySqlSchemaStatVisitor schema = new MySqlSchemaStatVisitor(); List<SQLStatement> sqlStatements = parser.parseStatementList(); for(SQLStatement sqlStatement:sqlStatements){ sqlStatement.accept(schema); // if(schema.containsTable(tableName)){ // TableNameModifier tnm = new TableNameModifier(tableName,"xx_comic_readrecord_4"); // sqlStatement.accept(tnm); // } // if(schema.getColumn(tableName, column)!=null){ for(Condition c:schema.getConditions()){ if(c.getColumn().getName().equals(column) && c.getOperator().equals("=")){ Integer userId = (Integer) c.getValues().get(0); String newTableName =MessageFormat.format(newTableFormater, userId); TableNameModifier tnm = new TableNameModifier(tableName,newTableName); sqlStatement.accept(tnm); } } } sqlStatement.accept(output); } System.out.println(output.getAppender().toString().replaceAll("\n"," ").replaceAll("\t"," ")); } }
相关推荐
druid 重连mysql 非常好用
在Spring Boot的主类上添加`@WebMvcConfigurer`注解,并重写`addResourceHandlers`方法: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config....
我们需要创建一个子类,重写determineCurrentLookupKey()方法,根据业务规则判断当前应使用哪个数据源。 4. 配置数据源切换:在`@Configuration`注解的类中,使用`@Bean`注解创建一个`PrimaryDataSourceBean`和`...
3. **自定义配置类**:如果需要更复杂的配置,可以创建一个@Configuration类,扩展`DruidDataSourceAutoConfigure`并重写相关方法。 Druid的主要特性包括: - **监控统计**:内置的Web监控页面可以实时查看数据库...
Servlet生命周期包括初始化、服务、销毁三个阶段,可以通过重写doGet和doPost方法来处理HTTP的GET和POST请求。 【Druid数据源】 Druid是阿里巴巴开源的一个高性能、强大的数据库连接池组件。它除了提供基本的连接...
1. **配置抽象数据源**:创建一个继承自`AbstractRoutingDataSource`的类,重写`determineCurrentLookupKey()`方法,该方法会根据当前环境(比如用户请求、系统配置等)返回选择的数据源key。 2. **定义数据源工厂*...
要在业务代码中动态切换数据源,可以创建一个`AbstractRoutingDataSource`的子类,例如`DynamicDataSource`,并重写`determineCurrentLookupKey`方法来根据业务逻辑选择数据源。 6. 配置Mybatis的Mapper: 为每个...
### Spring Boot 搭建(二):整合 Druid 数据库连接池与监控 #### 一、概述 在上一篇文章中,我们介绍了 Spring Boot 的基础搭建流程。本文将在此基础上进一步探讨如何集成 Druid 数据库连接池,并实现对数据库...
第二种方法是通过继承`AbstractRoutingDataSource`,并重写`determineCurrentLookupKey()`方法,以动态决定当前应使用哪个数据源。这种方法更为灵活,可以通过自定义的逻辑动态路由到对应的数据源。在提供的代码中,...
为了实现数据源的切换,我们可以创建一个`AbstractRoutingDataSource`的子类,重写`determineCurrentLookupKey`方法,根据业务逻辑或请求参数来决定使用哪个数据源。在需要切换数据源的地方,注入这个动态数据源即可...
java部分:程序基本概念、数据类型、流程控制、顺序、选择 、循环、跳转语句、变量、类、方法、实用类、JDBC、三层架构Druid连接池、Apache的DBUtils使用、Servlet等。 数据库部分:创建表、增删改查语句的书写等。 ...
java部分:程序基本概念、数据类型、流程控制、顺序、选择 、循环、跳转语句、变量、类、方法、实用类、JDBC、三层架构Druid连接池、Apache的DBUtils使用、Servlet等。 数据库部分:创建表、增删改查语句的书写等。 ...
整合Druid用于数据库连接,并使用Druid对业务层监控spring jdbc 整合EhCache,对Mybatis的二级缓存进行管理和对spring进行缓存管理 整合FastJson对指定http类型的数据进行转换 整合hibernate.validator校验器对...
首先,我们需要创建一个自定义的RoutingDataSource,继承AbstractRoutingDataSource,并重写determineCurrentLookupKey方法,该方法返回当前应该使用的数据源key。 接着,配置每个具体的数据源。这里我们可以使用...
java部分:程序基本概念、数据类型、流程控制、顺序、选择 、循环、跳转语句、变量、类、方法、实用类、JDBC、三层架构Druid连接池、Apache的DBUtils使用、Servlet等。 数据库部分:创建表、增删改查语句的书写等。 ...
3. **定义路由逻辑**:创建一个继承自AbstractRoutingDataSource的自定义数据源,重写determineCurrentLookupKey方法,以实现根据业务逻辑选择数据源。 4. **设置默认数据源**:在主数据源bean上添加`@Primary`注解...
4. SQL解析和重写:Sharding JDBC能够解析SQL语句,并根据分片策略将其重写成可以在分片后的数据库表中执行的SQL语句。 5. 连接管理:提供数据库连接池管理,比如Apache Commons DBCP,这是Apache Commons下的一个...
数据库持久层:阿里巴巴druid1.0.1 核心框架: Spring3.1.2、SpringMVC3.1.2、Hibernate3.6.6 缓存技术: Memcache2.5 全文检索: Lucene3.5.0、HibernateSearch3.6.6 模板视图: Velocity1.5、HTML、CSS、JQuery...
5. 数据源路由:引入Spring的AbstractRoutingDataSource,重写determineCurrentLookupKey方法,根据当前操作的性质(读或写)选择对应的数据源。 6. MyBatis的Mapper配置:每个Mapper接口需要在对应的XML配置文件中...
重写mysql的Dockerfile文件,修改install过程 bug修复,footer样式调整 logo文件修改,附件上传功能 评论功能及页面修改 域名及网站的公网备案 docker-compose实现多容器部署 删除原...