From c644066ad295955ecb5204ef62e3a6b987d62c03 Mon Sep 17 00:00:00 2001 From: Gz Date: Mon, 28 Sep 2020 10:47:28 +0800 Subject: [PATCH] =?UTF-8?q?#501=20sql=E8=AF=A6=E7=BB=86=E5=88=86=E6=9E=90?= =?UTF-8?q?=E7=B1=BB=E9=80=82=E9=85=8D=E5=A4=9A=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/META-INF/spring.factories | 2 +- .../txlcn/tc/jdbc/sql/MysqlSqlAnalyse.java | 4 +-- .../sql/analyse/MysqlSqlDetailAnalyse.java | 7 +++++ .../tc/jdbc/sql/analyse/SqlDetailAnalyse.java | 4 +++ .../sql/strategy/SqlDetailAnalyseFactory.java | 31 +++++++++++++++++++ .../sql/strategy/SqlSqlAnalyseHandler.java | 2 +- .../sql/strategy/StrategyConfiguration.java | 11 +++++-- .../chan/CheckTableContainsPkFilter.java | 4 +-- .../chan/CheckWhereContainsPkFilter.java | 6 ++-- .../{FilterFacaer.java => FilterFacade.java} | 2 +- .../sql/strategy/chan/ItemsListFilter.java | 4 +-- .../sql/strategy/chan/SqlAnalysqFilter.java | 2 +- .../strategy/chan/SqlAnalysqFilterChain.java | 4 +-- .../jdbc/sql/strategy/chan/WhereFilter.java | 6 ++-- .../mysql/MysqlDeleteAnalyseStrategy.java | 18 ++++++----- .../mysql/MysqlInsertAnalyseStrategy.java | 21 +++++++------ .../mysql/MysqlUpdateAnalyseStrategy.java | 18 ++++++----- .../tc/jdbc/sql/MysqlSqlAnalyseTest.java | 22 +++++++++---- 18 files changed, 113 insertions(+), 55 deletions(-) create mode 100644 txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/SqlDetailAnalyseFactory.java rename txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/{FilterFacaer.java => FilterFacade.java} (95%) diff --git a/starter-txlcn-tc/src/main/resources/META-INF/spring.factories b/starter-txlcn-tc/src/main/resources/META-INF/spring.factories index 6044c8bf0..7e68a86de 100644 --- a/starter-txlcn-tc/src/main/resources/META-INF/spring.factories +++ b/starter-txlcn-tc/src/main/resources/META-INF/spring.factories @@ -16,5 +16,5 @@ com.codingapi.txlcn.tc.reporter.ReporterConfiguration,\ com.codingapi.txlcn.tc.resolver.ResolverConfiguration,\ com.codingapi.txlcn.tc.runner.TcRunnerConfiguration,\ com.codingapi.txlcn.tc.rpc.RpcTransactionConfiguration,\ -com.codingapi.txlcn.tc.TCAutoConfiguration,\ +com.codingapi.txlcn.tc.TCAutoConfiguration diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/MysqlSqlAnalyse.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/MysqlSqlAnalyse.java index 8649879a9..0b9c08ece 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/MysqlSqlAnalyse.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/MysqlSqlAnalyse.java @@ -36,15 +36,13 @@ public String sqlType() { public String analyse(String sql,StatementInformation statementInformation) throws SQLException { log.debug("mysql analyse:{}", sql); Connection connection = statementInformation.getConnectionInformation().getConnection(); - // sql.toUpperCase().substring(0,6) 这样实现有风险 - // if else 实现并不是很优雅 CCJSqlParserManager parser = new CCJSqlParserManager(); Statement stmt = parser.parse(new StringReader(sql)); SqlSqlAnalyseHandler sqlSqlAnalyseHandler = analyseStrategryFactory.getInvokeStrategy(sqlType(),stmt); if(sqlSqlAnalyseHandler==null){ return sql; } - return sqlSqlAnalyseHandler.analyse(sql,connection,stmt); + return sqlSqlAnalyseHandler.analyse(sqlType(),sql,connection,stmt); } @Override diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/analyse/MysqlSqlDetailAnalyse.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/analyse/MysqlSqlDetailAnalyse.java index 1f12e18af..05c7cb1ed 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/analyse/MysqlSqlDetailAnalyse.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/analyse/MysqlSqlDetailAnalyse.java @@ -11,6 +11,7 @@ import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.select.Join; import org.apache.commons.dbutils.QueryRunner; @@ -143,4 +144,10 @@ else if(JDBCType.BIGINT.getName().equals(primaryKeyType.getName())){ sql = sql.concat(")"); return sql; } + + @Override + public boolean preAnalyse(String sqlType) { + return "mysql".equals(sqlType); + } + } diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/analyse/SqlDetailAnalyse.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/analyse/SqlDetailAnalyse.java index c879f85a0..7428fc334 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/analyse/SqlDetailAnalyse.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/analyse/SqlDetailAnalyse.java @@ -5,6 +5,7 @@ import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.operators.relational.ItemsList; import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.select.Join; @@ -64,4 +65,7 @@ public interface SqlDetailAnalyse { * @return */ String splicingNewSql(String sql, SqlAnalyseInfo sqlAnalyseInfo, List> query); + + boolean preAnalyse(String sqlType); + } diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/SqlDetailAnalyseFactory.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/SqlDetailAnalyseFactory.java new file mode 100644 index 000000000..4df3b9016 --- /dev/null +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/SqlDetailAnalyseFactory.java @@ -0,0 +1,31 @@ +package com.codingapi.txlcn.tc.jdbc.sql.strategy; + +import com.codingapi.txlcn.tc.jdbc.sql.analyse.SqlDetailAnalyse; +import net.sf.jsqlparser.statement.Statement; + +import java.util.List; + +/** + * @author Gz. + * @description: + * @date 2020-09-02 22:51:37 + */ + +public class SqlDetailAnalyseFactory { + + private List analyseHandlers; + + public SqlDetailAnalyseFactory(List analyseHandlers) { + this.analyseHandlers = analyseHandlers; + } + + public SqlDetailAnalyse getInvokeStrategy(String sqlType) { + for(SqlDetailAnalyse handler : analyseHandlers){ + if(handler.preAnalyse(sqlType)){ + return handler; + } + } + return null; + } + +} diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/SqlSqlAnalyseHandler.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/SqlSqlAnalyseHandler.java index 9d04f8c55..5cc96c9cd 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/SqlSqlAnalyseHandler.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/SqlSqlAnalyseHandler.java @@ -14,7 +14,7 @@ public interface SqlSqlAnalyseHandler { - String analyse(String sql, Connection connection, Statement stmt) throws JSQLParserException, SQLException; + String analyse(String sqlType,String sql, Connection connection, Statement stmt) throws JSQLParserException, SQLException; boolean preAnalyse(String sqlType,Statement stmt); diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/StrategyConfiguration.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/StrategyConfiguration.java index f06f417c5..2ad305ab2 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/StrategyConfiguration.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/StrategyConfiguration.java @@ -24,21 +24,26 @@ public AnalyseStrategryFactory analyseStrategryFactory(@Autowired(required = fal return new AnalyseStrategryFactory(analyseHandlers); } + @Bean + public SqlDetailAnalyseFactory sqlDetailStrategryFactory(@Autowired(required = false)List sqlDetailAnalyses){ + return new SqlDetailAnalyseFactory(sqlDetailAnalyses); + } + @Bean @ConditionalOnMissingBean - public SqlSqlAnalyseHandler mysqlInsertAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){ + public SqlSqlAnalyseHandler mysqlInsertAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyse){ return new MysqlInsertAnalyseStrategy(sqlDetailAnalyse); } @Bean @ConditionalOnMissingBean - public SqlSqlAnalyseHandler mysqlDeleteAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){ + public SqlSqlAnalyseHandler mysqlDeleteAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyse){ return new MysqlDeleteAnalyseStrategy(sqlDetailAnalyse); } @Bean @ConditionalOnMissingBean - public SqlSqlAnalyseHandler mysqlUpdateAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){ + public SqlSqlAnalyseHandler mysqlUpdateAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyse){ return new MysqlUpdateAnalyseStrategy(sqlDetailAnalyse); } diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/CheckTableContainsPkFilter.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/CheckTableContainsPkFilter.java index 26ede1100..d2a248bf0 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/CheckTableContainsPkFilter.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/CheckTableContainsPkFilter.java @@ -10,8 +10,8 @@ */ public class CheckTableContainsPkFilter implements SqlAnalysqFilter { @Override - public boolean doFilter(FilterFacaer filterFacaer) { - TableInfo tableInfo = filterFacaer.getTableList().getTable(filterFacaer.getTable().getName()); + public boolean doFilter(FilterFacade filterFacade) { + TableInfo tableInfo = filterFacade.getTableList().getTable(filterFacade.getTable().getName()); if(ListUtil.isNotEmpty(tableInfo.getPrimaryKeys())){ return true; } diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/CheckWhereContainsPkFilter.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/CheckWhereContainsPkFilter.java index 2706e8d72..b3eafd2c1 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/CheckWhereContainsPkFilter.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/CheckWhereContainsPkFilter.java @@ -9,8 +9,8 @@ */ public class CheckWhereContainsPkFilter implements SqlAnalysqFilter { @Override - public boolean doFilter(FilterFacaer filterFacaer) { - TableInfo tableInfo = filterFacaer.getTableList().getTable(filterFacaer.getTable().getName()); - return (filterFacaer.getDeleteStatement() == null ? filterFacaer.getUpdateStatement().getWhere() : filterFacaer.getDeleteStatement().getWhere()).toString().toUpperCase().contains(tableInfo.getPrimaryKeys().get(0).toUpperCase()); + public boolean doFilter(FilterFacade filterFacade) { + TableInfo tableInfo = filterFacade.getTableList().getTable(filterFacade.getTable().getName()); + return (filterFacade.getDeleteStatement() == null ? filterFacade.getUpdateStatement().getWhere() : filterFacade.getDeleteStatement().getWhere()).toString().toUpperCase().contains(tableInfo.getPrimaryKeys().get(0).toUpperCase()); } } diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/FilterFacaer.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/FilterFacade.java similarity index 95% rename from txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/FilterFacaer.java rename to txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/FilterFacade.java index 9de1ec514..153f90a3f 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/FilterFacaer.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/FilterFacade.java @@ -15,7 +15,7 @@ */ @Data @Builder -public class FilterFacaer { +public class FilterFacade { private TableList tableList; diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/ItemsListFilter.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/ItemsListFilter.java index d163adada..50743e246 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/ItemsListFilter.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/ItemsListFilter.java @@ -9,8 +9,8 @@ public class ItemsListFilter implements SqlAnalysqFilter { @Override - public boolean doFilter(FilterFacaer filterFacaer) { - if(null == filterFacaer.getItemsList()){ + public boolean doFilter(FilterFacade filterFacade) { + if(null == filterFacade.getItemsList()){ return false; } return true; diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/SqlAnalysqFilter.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/SqlAnalysqFilter.java index 754cf7261..5f7e04efa 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/SqlAnalysqFilter.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/SqlAnalysqFilter.java @@ -7,5 +7,5 @@ */ public interface SqlAnalysqFilter { - boolean doFilter(FilterFacaer filterFacaer); + boolean doFilter(FilterFacade filterFacade); } diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/SqlAnalysqFilterChain.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/SqlAnalysqFilterChain.java index 6678c71f7..d041005b0 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/SqlAnalysqFilterChain.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/SqlAnalysqFilterChain.java @@ -18,9 +18,9 @@ public SqlAnalysqFilterChain add(SqlAnalysqFilter filter){ } @Override - public boolean doFilter(FilterFacaer filterFacaer) { + public boolean doFilter(FilterFacade filterFacade) { for (SqlAnalysqFilter filter : filterList) { - if(!filter.doFilter(filterFacaer)){ + if(!filter.doFilter(filterFacade)){ return false; } } diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/WhereFilter.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/WhereFilter.java index 340a44879..47c8607d3 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/WhereFilter.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/chan/WhereFilter.java @@ -1,7 +1,5 @@ package com.codingapi.txlcn.tc.jdbc.sql.strategy.chan; -import net.sf.jsqlparser.statement.update.Update; - /** * @author Gz. * @description: @@ -9,8 +7,8 @@ */ public class WhereFilter implements SqlAnalysqFilter { @Override - public boolean doFilter(FilterFacaer filterFacaer) { - if( (filterFacaer.getDeleteStatement() == null ? filterFacaer.getUpdateStatement().getWhere() : filterFacaer.getDeleteStatement().getWhere()) == null){ + public boolean doFilter(FilterFacade filterFacade) { + if( (filterFacade.getDeleteStatement() == null ? filterFacade.getUpdateStatement().getWhere() : filterFacade.getDeleteStatement().getWhere()) == null){ return false; } return true; diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlDeleteAnalyseStrategy.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlDeleteAnalyseStrategy.java index ba424712f..29bc426b1 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlDeleteAnalyseStrategy.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlDeleteAnalyseStrategy.java @@ -4,6 +4,7 @@ import com.codingapi.txlcn.tc.jdbc.database.SqlAnalyseInfo; import com.codingapi.txlcn.tc.jdbc.database.TableList; import com.codingapi.txlcn.tc.jdbc.sql.analyse.SqlDetailAnalyse; +import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlDetailAnalyseFactory; import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlSqlAnalyseHandler; import com.codingapi.txlcn.tc.jdbc.sql.strategy.chan.*; import com.codingapi.txlcn.tc.utils.ListUtil; @@ -28,31 +29,32 @@ @Slf4j public class MysqlDeleteAnalyseStrategy implements SqlSqlAnalyseHandler { - private SqlDetailAnalyse sqlDetailAnalyse; + private SqlDetailAnalyseFactory sqlDetailAnalyseFactory; - public MysqlDeleteAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){ - this.sqlDetailAnalyse = sqlDetailAnalyse; + public MysqlDeleteAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyseFactory){ + this.sqlDetailAnalyseFactory = sqlDetailAnalyseFactory; } @Override - public String analyse(String sql, Connection connection, Statement stmt) throws SQLException, JSQLParserException { + public String analyse(String sqlType,String sql, Connection connection, Statement stmt) throws SQLException, JSQLParserException { String catalog = connection.getCatalog(); TableList tableList = DataBaseContext.getInstance().get(catalog); Delete statement = (Delete) stmt; Table table = statement.getTable(); - FilterFacaer filterFacaer = FilterFacaer.builder().tableList(tableList).table(table).deleteStatement(statement).build(); + FilterFacade filterFacade = FilterFacade.builder().tableList(tableList).table(table).deleteStatement(statement).build(); SqlAnalysqFilterChain filter = new SqlAnalysqFilterChain(); filter.add(new WhereFilter()).add(new CheckTableContainsPkFilter()).add(new CheckWhereContainsPkFilter()); - if(!filter.doFilter(filterFacaer)){ + if(!filter.doFilter(filterFacade)){ return sql; } - SqlAnalyseInfo sqlAnalyseInfo = sqlDetailAnalyse.sqlAnalyseSingleTable(tableList, table, statement.getWhere(),statement.getJoins()); + SqlDetailAnalyse invokeStrategy = sqlDetailAnalyseFactory.getInvokeStrategy(sqlType); + SqlAnalyseInfo sqlAnalyseInfo = invokeStrategy.sqlAnalyseSingleTable(tableList, table, statement.getWhere(),statement.getJoins()); QueryRunner queryRunner = new QueryRunner(); List> query = queryRunner.query(connection, sqlAnalyseInfo.getQuerySql(), new MapListHandler()); if(ListUtil.isEmpty(query)){ return sql; } - sql = sqlDetailAnalyse.splicingNewSql(sql, sqlAnalyseInfo, query); + sql = invokeStrategy.splicingNewSql(sql, sqlAnalyseInfo, query); log.info("newSql=[{}]",sql); return sql; } diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlInsertAnalyseStrategy.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlInsertAnalyseStrategy.java index cdb57447a..cc705abc1 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlInsertAnalyseStrategy.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlInsertAnalyseStrategy.java @@ -1,10 +1,10 @@ package com.codingapi.txlcn.tc.jdbc.sql.strategy.mysql; import com.codingapi.txlcn.tc.jdbc.database.DataBaseContext; -import com.codingapi.txlcn.tc.jdbc.database.SqlAnalyseHelper; import com.codingapi.txlcn.tc.jdbc.database.TableInfo; import com.codingapi.txlcn.tc.jdbc.database.TableList; import com.codingapi.txlcn.tc.jdbc.sql.analyse.SqlDetailAnalyse; +import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlDetailAnalyseFactory; import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlSqlAnalyseHandler; import com.codingapi.txlcn.tc.jdbc.sql.strategy.chan.*; import lombok.extern.slf4j.Slf4j; @@ -13,7 +13,6 @@ import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.insert.Insert; -import org.springframework.stereotype.Component; import java.sql.Connection; import java.sql.SQLException; @@ -27,14 +26,15 @@ @Slf4j public class MysqlInsertAnalyseStrategy implements SqlSqlAnalyseHandler { - private SqlDetailAnalyse sqlDetailAnalyse; + private SqlDetailAnalyseFactory sqlDetailAnalyseFactory; - public MysqlInsertAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){ - this.sqlDetailAnalyse = sqlDetailAnalyse; + public MysqlInsertAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyseFactory){ + this.sqlDetailAnalyseFactory = sqlDetailAnalyseFactory; } + @Override - public String analyse(String sql, Connection connection, Statement stmt) throws SQLException, JSQLParserException { + public String analyse(String sqlType, String sql, Connection connection, Statement stmt) throws SQLException, JSQLParserException { boolean defaultAutoCommit = connection.getAutoCommit(); connection.setAutoCommit(false); String catalog = connection.getCatalog(); @@ -43,10 +43,10 @@ public String analyse(String sql, Connection connection, Statement stmt) throws Table table = statement.getTable(); ItemsList itemsList = statement.getItemsList(); - FilterFacaer filterFacaer = FilterFacaer.builder().tableList(tableList).table(table).itemsList(itemsList).build(); + FilterFacade filterFacade = FilterFacade.builder().tableList(tableList).table(table).itemsList(itemsList).build(); SqlAnalysqFilterChain filter = new SqlAnalysqFilterChain(); filter.add(new CheckTableContainsPkFilter()).add(new ItemsListFilter()); - if(!filter.doFilter(filterFacaer)){ + if(!filter.doFilter(filterFacade)){ return sql; } @@ -61,9 +61,10 @@ public String analyse(String sql, Connection connection, Statement stmt) throws } } - if (sqlDetailAnalyse.multiInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql; + SqlDetailAnalyse invokeStrategy = sqlDetailAnalyseFactory.getInvokeStrategy(sqlType); + if (invokeStrategy.multiInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql; - if (sqlDetailAnalyse.singleInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql; + if (invokeStrategy.singleInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql; connection.rollback(); connection.setAutoCommit(defaultAutoCommit); diff --git a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlUpdateAnalyseStrategy.java b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlUpdateAnalyseStrategy.java index 0e0ee4d8a..01c02c2f6 100644 --- a/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlUpdateAnalyseStrategy.java +++ b/txlcn-tc/src/main/java/com/codingapi/txlcn/tc/jdbc/sql/strategy/mysql/MysqlUpdateAnalyseStrategy.java @@ -4,6 +4,7 @@ import com.codingapi.txlcn.tc.jdbc.database.SqlAnalyseInfo; import com.codingapi.txlcn.tc.jdbc.database.TableList; import com.codingapi.txlcn.tc.jdbc.sql.analyse.SqlDetailAnalyse; +import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlDetailAnalyseFactory; import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlSqlAnalyseHandler; import com.codingapi.txlcn.tc.jdbc.sql.strategy.chan.*; import com.codingapi.txlcn.tc.utils.ListUtil; @@ -29,32 +30,33 @@ @Slf4j public class MysqlUpdateAnalyseStrategy implements SqlSqlAnalyseHandler { - private SqlDetailAnalyse sqlDetailAnalyse; + private SqlDetailAnalyseFactory sqlDetailAnalyseFactory; - public MysqlUpdateAnalyseStrategy(SqlDetailAnalyse sqlDetailAnalyse){ - this.sqlDetailAnalyse = sqlDetailAnalyse; + public MysqlUpdateAnalyseStrategy(SqlDetailAnalyseFactory sqlDetailAnalyseFactory){ + this.sqlDetailAnalyseFactory = sqlDetailAnalyseFactory; } @Override - public String analyse(String sql, Connection connection , Statement stmt) throws SQLException, JSQLParserException { + public String analyse(String sqlType,String sql, Connection connection , Statement stmt) throws SQLException, JSQLParserException { String catalog = connection.getCatalog(); TableList tableList = DataBaseContext.getInstance().get(catalog); Update statement = (Update) stmt; Table table = statement.getTable(); - FilterFacaer filterFacaer = FilterFacaer.builder().tableList(tableList).table(table).updateStatement(statement).build(); + FilterFacade filterFacade = FilterFacade.builder().tableList(tableList).table(table).updateStatement(statement).build(); SqlAnalysqFilterChain filter = new SqlAnalysqFilterChain(); filter.add(new WhereFilter()).add(new CheckTableContainsPkFilter()).add(new CheckWhereContainsPkFilter()); - if(!filter.doFilter(filterFacaer)){ + if(!filter.doFilter(filterFacade)){ return sql; } //TODO now() 之类的函数有待分析 - SqlAnalyseInfo sqlAnalyseInfo = sqlDetailAnalyse.sqlAnalyseSingleTable(tableList, table, statement.getWhere(),statement.getStartJoins()); + SqlDetailAnalyse invokeStrategy = sqlDetailAnalyseFactory.getInvokeStrategy(sqlType); + SqlAnalyseInfo sqlAnalyseInfo = invokeStrategy.sqlAnalyseSingleTable(tableList, table, statement.getWhere(),statement.getStartJoins()); QueryRunner queryRunner = new QueryRunner(); List> query = queryRunner.query(connection, sqlAnalyseInfo.getQuerySql(), new MapListHandler()); if(ListUtil.isEmpty(query)){ return sql; } - sql = sqlDetailAnalyse.splicingNewSql(sql, sqlAnalyseInfo, query); + sql = invokeStrategy.splicingNewSql(sql, sqlAnalyseInfo, query); log.info("newSql=[{}]",sql); return sql; } diff --git a/txlcn-tc/src/test/java/com/codingapi/txlcn/tc/jdbc/sql/MysqlSqlAnalyseTest.java b/txlcn-tc/src/test/java/com/codingapi/txlcn/tc/jdbc/sql/MysqlSqlAnalyseTest.java index 9eec28a5e..31bf5d646 100644 --- a/txlcn-tc/src/test/java/com/codingapi/txlcn/tc/jdbc/sql/MysqlSqlAnalyseTest.java +++ b/txlcn-tc/src/test/java/com/codingapi/txlcn/tc/jdbc/sql/MysqlSqlAnalyseTest.java @@ -6,6 +6,8 @@ import com.codingapi.txlcn.tc.jdbc.database.TableInfo; import com.codingapi.txlcn.tc.jdbc.database.TableList; import com.codingapi.txlcn.tc.jdbc.sql.analyse.MysqlSqlDetailAnalyse; +import com.codingapi.txlcn.tc.jdbc.sql.analyse.SqlDetailAnalyse; +import com.codingapi.txlcn.tc.jdbc.sql.strategy.SqlDetailAnalyseFactory; import com.codingapi.txlcn.tc.jdbc.sql.strategy.mysql.MysqlInsertAnalyseStrategy; import com.codingapi.txlcn.tc.jdbc.sql.strategy.mysql.MysqlDeleteAnalyseStrategy; import com.codingapi.txlcn.tc.jdbc.sql.strategy.mysql.MysqlUpdateAnalyseStrategy; @@ -27,6 +29,8 @@ import java.io.StringReader; import java.sql.Connection; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -43,7 +47,12 @@ public class MysqlSqlAnalyseTest { private DataSource dataSource; + private static final String sqlType = "mysql"; + private static List analyseHandlers = new ArrayList<>(); + { + analyseHandlers.add(new MysqlSqlDetailAnalyse()); + } @Test @@ -76,12 +85,13 @@ public void mysqlAnalyse() throws SQLException, JSQLParserException { DataBaseContext.getInstance().push(catalog, JdbcAnalyseUtils.analyse(connection)); CCJSqlParserManager parser = new CCJSqlParserManager(); Statement stmt = parser.parse(new StringReader(sql)); + if (stmt instanceof Update) { - MysqlUpdateAnalyseStrategy mysqlInsertAnalyseStrategy = new MysqlUpdateAnalyseStrategy(new MysqlSqlDetailAnalyse()); - mysqlInsertAnalyseStrategy.analyse(sql, connection, stmt); + MysqlUpdateAnalyseStrategy mysqlInsertAnalyseStrategy = new MysqlUpdateAnalyseStrategy(new SqlDetailAnalyseFactory(analyseHandlers)); + mysqlInsertAnalyseStrategy.analyse(sqlType,sql, connection, stmt); } else if (stmt instanceof Delete) { - MysqlDeleteAnalyseStrategy mysqlInsertAnalyseStrategy = new MysqlDeleteAnalyseStrategy(new MysqlSqlDetailAnalyse()); - mysqlInsertAnalyseStrategy.analyse(sql, connection, stmt); + MysqlDeleteAnalyseStrategy mysqlInsertAnalyseStrategy = new MysqlDeleteAnalyseStrategy(new SqlDetailAnalyseFactory(analyseHandlers)); + mysqlInsertAnalyseStrategy.analyse(sqlType,sql, connection, stmt); } } @@ -96,8 +106,8 @@ public void mysqlAnalyseInsert() throws SQLException, JSQLParserException { CCJSqlParserManager parser = new CCJSqlParserManager(); Statement stmt = parser.parse(new StringReader(sql)); if (stmt instanceof Insert) { - MysqlInsertAnalyseStrategy mysqlInsertAnalyseStrategy = new MysqlInsertAnalyseStrategy(new MysqlSqlDetailAnalyse()); - String s = mysqlInsertAnalyseStrategy.analyse(sql, connection, stmt); + MysqlInsertAnalyseStrategy mysqlInsertAnalyseStrategy = new MysqlInsertAnalyseStrategy(new SqlDetailAnalyseFactory(analyseHandlers)); + String s = mysqlInsertAnalyseStrategy.analyse(sqlType,sql, connection, stmt); System.out.println(s); } }