未验证 提交 bb57b812 编写于 作者: L lorne 提交者: GitHub

Merge pull request #547 from BigBlackSheep/dev6.0

#501 解耦前置判断
package com.codingapi.txlcn.tc.jdbc.sql.strategy.chan;
import com.codingapi.txlcn.tc.jdbc.database.TableInfo;
import com.codingapi.txlcn.tc.utils.ListUtil;
/**
* @author Gz.
* @description:
* @date 2020-09-21 23:35:45
*/
public class CheckTableContainsPkFilter implements SqlAnalysqFilter {
@Override
public boolean doFilter(FilterFacaer filterFacaer) {
TableInfo tableInfo = filterFacaer.getTableList().getTable(filterFacaer.getTable().getName());
if(ListUtil.isNotEmpty(tableInfo.getPrimaryKeys())){
return true;
}
return false;
}
}
package com.codingapi.txlcn.tc.jdbc.sql.strategy.chan;
import com.codingapi.txlcn.tc.jdbc.database.TableInfo;
/**
* @author Gz.
* @description:
* @date 2020-09-21 23:45:27
*/
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());
}
}
package com.codingapi.txlcn.tc.jdbc.sql.strategy.chan;
import com.codingapi.txlcn.tc.jdbc.database.TableList;
import lombok.Builder;
import lombok.Data;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.delete.Delete;
import net.sf.jsqlparser.statement.update.Update;
/**
* @author Gz.
* @description:
* @date 2020-09-21 23:35:06
*/
@Data
@Builder
public class FilterFacaer {
private TableList tableList;
private Update updateStatement;
private Delete deleteStatement;
private Table table;
private ItemsList itemsList;
}
package com.codingapi.txlcn.tc.jdbc.sql.strategy.chan;
/**
* @author Gz.
* @description:
* @date 2020-09-22 00:04:35
*/
public class ItemsListFilter implements SqlAnalysqFilter {
@Override
public boolean doFilter(FilterFacaer filterFacaer) {
if(null == filterFacaer.getItemsList()){
return false;
}
return true;
}
}
package com.codingapi.txlcn.tc.jdbc.sql.strategy.chan;
/**
* @author Gz.
* @description:
* @date 2020-09-21 23:34:12
*/
public interface SqlAnalysqFilter {
boolean doFilter(FilterFacaer filterFacaer);
}
package com.codingapi.txlcn.tc.jdbc.sql.strategy.chan;
import java.util.ArrayList;
import java.util.List;
/**
* @author Gz.
* @description:
* @date 2020-09-21 23:36:58
*/
public class SqlAnalysqFilterChain implements SqlAnalysqFilter {
List<SqlAnalysqFilter> filterList = new ArrayList<>();
public SqlAnalysqFilterChain add(SqlAnalysqFilter filter){
filterList.add(filter);
return this;
}
@Override
public boolean doFilter(FilterFacaer filterFacaer) {
for (SqlAnalysqFilter filter : filterList) {
if(!filter.doFilter(filterFacaer)){
return false;
}
}
return true;
}
}
package com.codingapi.txlcn.tc.jdbc.sql.strategy.chan;
import net.sf.jsqlparser.statement.update.Update;
/**
* @author Gz.
* @description:
* @date 2020-09-21 23:46:54
*/
public class WhereFilter implements SqlAnalysqFilter {
@Override
public boolean doFilter(FilterFacaer filterFacaer) {
if( (filterFacaer.getDeleteStatement() == null ? filterFacaer.getUpdateStatement().getWhere() : filterFacaer.getDeleteStatement().getWhere()) == null){
return false;
}
return true;
}
}
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.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.SqlSqlAnalyseHandler;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.chan.*;
import com.codingapi.txlcn.tc.utils.ListUtil;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
......@@ -40,10 +40,10 @@ public class MysqlDeleteAnalyseStrategy implements SqlSqlAnalyseHandler {
TableList tableList = DataBaseContext.getInstance().get(catalog);
Delete statement = (Delete) stmt;
Table table = statement.getTable();
if(!SqlAnalyseHelper.checkTableContainsPk(table, tableList)){
return sql;
}
if(SqlAnalyseHelper.checkWhereContainsPk(table, tableList,statement.getWhere().toString())){
FilterFacaer filterFacaer = FilterFacaer.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)){
return sql;
}
SqlAnalyseInfo sqlAnalyseInfo = sqlDetailAnalyse.sqlAnalyseSingleTable(tableList, table, statement.getWhere(),statement.getJoins());
......
......@@ -6,6 +6,7 @@ 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.SqlSqlAnalyseHandler;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.chan.*;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
......@@ -42,12 +43,13 @@ public class MysqlInsertAnalyseStrategy implements SqlSqlAnalyseHandler {
Table table = statement.getTable();
ItemsList itemsList = statement.getItemsList();
if(null == itemsList){
return sql;
}
if(!SqlAnalyseHelper.checkTableContainsPk(table, tableList)){
FilterFacaer filterFacaer = FilterFacaer.builder().tableList(tableList).table(table).itemsList(itemsList).build();
SqlAnalysqFilterChain filter = new SqlAnalysqFilterChain();
filter.add(new CheckTableContainsPkFilter()).add(new ItemsListFilter());
if(!filter.doFilter(filterFacaer)){
return sql;
}
TableInfo tableInfo = tableList.getTable(table.getName());
String pk = tableInfo.getPrimaryKeys().get(0);
......
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.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.SqlSqlAnalyseHandler;
import com.codingapi.txlcn.tc.jdbc.sql.strategy.chan.*;
import com.codingapi.txlcn.tc.utils.ListUtil;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
......@@ -41,10 +41,10 @@ public class MysqlUpdateAnalyseStrategy implements SqlSqlAnalyseHandler {
TableList tableList = DataBaseContext.getInstance().get(catalog);
Update statement = (Update) stmt;
Table table = statement.getTable();
if(!SqlAnalyseHelper.checkTableContainsPk(table, tableList)){
return sql;
}
if(SqlAnalyseHelper.checkWhereContainsPk(table, tableList,statement.getWhere().toString())){
FilterFacaer filterFacaer = FilterFacaer.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)){
return sql;
}
//TODO now() 之类的函数有待分析
......
......@@ -70,7 +70,7 @@ public class MysqlSqlAnalyseTest {
@Test
public void mysqlAnalyse() throws SQLException, JSQLParserException {
String sql = "DELETE t2,t3 FROM lcn_sql_parse_test2 t2 ,lcn_sql_parse_test3 t3 where t3.job = t2.dept_name AND t2.dept_name = 'test' and t3.name = 'a' ";
sql = "update lcn_sql_parse_test3 t3 ,lcn_sql_parse_test2 t2 set t3.age = 56 ,t2.dept_name = 'dev' where t3.job = t2.dept_name and t2.dept_name = 'test'";
sql = "update lcn_sql_parse_test3 t3 set t3.update_time = now()";
Connection connection = dataSource.getConnection();
String catalog = connection.getCatalog();
DataBaseContext.getInstance().push(catalog, JdbcAnalyseUtils.analyse(connection));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册