提交 1c5bf1e3 编写于 作者: G Gz

#501 使用接口解耦分析插入方法

上级 335f3bba
package com.codingapi.txlcn.tc.jdbc.sql.analyse;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.insert.Insert;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapListHandler;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
public class MysqlAnalyse implements SqlAnalyse{
@Override
public boolean singleInsertAnalyse(String sql, Connection connection, Insert statement, ItemsList itemsList, String pk, int pkIndex) throws SQLException {
if (itemsList instanceof ExpressionList) {
ExpressionList expressionList = (ExpressionList) itemsList;
if(pkIndex > -1){
String defaultValue = expressionList.getExpressions().get(pkIndex).toString();
if(!"NULL".equals(defaultValue.toUpperCase())){
return true;
}
expressionList.getExpressions().remove(pkIndex);
statement.getColumns().remove(pkIndex);
}
QueryRunner queryRunner = new QueryRunner();
List<Map<String, Object>> insert = queryRunner.insert(connection, sql, new MapListHandler());
statement.getColumns().add(new Column(pk));
expressionList.getExpressions().add(new StringValue(insert.toString()));
}
return false;
}
@Override
public boolean multiInsertAnalyse(String sql, Connection connection, Insert statement, ItemsList itemsList, String pk, int pkIndex) throws SQLException {
if (itemsList instanceof MultiExpressionList) {
MultiExpressionList multiExpressionList = (MultiExpressionList) itemsList;
if(pkIndex > -1){
for (ExpressionList expressionList : multiExpressionList.getExprList()) {
String defaultValue = expressionList.getExpressions().get(pkIndex).toString();
if(!"NULL".equals(defaultValue.toUpperCase())){
return true;
}
expressionList.getExpressions().remove(pkIndex);
statement.getColumns().remove(pkIndex);
}
}
QueryRunner queryRunner = new QueryRunner();
List<Map<String, Object>> insert = queryRunner.insert(connection, sql, new MapListHandler());
statement.getColumns().add(new Column(pk));
for (int i = 0; i < multiExpressionList.getExprList().size(); i++) {
multiExpressionList.getExprList().get(i).getExpressions().add(new StringValue(insert.get(i).get("GENERATED_KEY").toString()));
}
}
return false;
}
}
package com.codingapi.txlcn.tc.jdbc.sql.analyse;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.statement.insert.Insert;
import java.sql.Connection;
import java.sql.SQLException;
public interface SqlAnalyse {
/**
* 单表插入分析
* @param sql
* @param connection
* @param statement
* @param itemsList
* @param pk
* @param pkIndex
* @return
* @throws SQLException
*/
boolean singleInsertAnalyse(String sql, Connection connection, Insert statement, ItemsList itemsList, String pk, int pkIndex) throws SQLException;
/**
* 多表插入分析
* @param sql
* @param connection
* @param statement
* @param itemsList
* @param pk
* @param pkIndex
* @return
* @throws SQLException
*/
boolean multiInsertAnalyse(String sql, Connection connection, Insert statement, ItemsList itemsList, String pk, int pkIndex) throws SQLException;
}
......@@ -4,6 +4,7 @@ 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.MysqlAnalyse;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.StringValue;
......@@ -30,6 +31,8 @@ import java.util.Map;
public class MysqlInsertAnalyseStrategy implements SqlSqlAnalyseHandler {
private MysqlAnalyse mysqlAnalyse;
@Override
public String mysqlAnalyseStrategy(String sql, Connection connection,Statement stmt) throws SQLException, JSQLParserException {
boolean defaultAutoCommit = connection.getAutoCommit();
......@@ -57,9 +60,9 @@ public class MysqlInsertAnalyseStrategy implements SqlSqlAnalyseHandler {
}
}
if (multiInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql;
if (mysqlAnalyse.multiInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql;
if (singleInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql;
if (mysqlAnalyse.singleInsertAnalyse(sql, connection, statement, itemsList, pk, pkIndex)) return sql;
connection.rollback();
connection.setAutoCommit(defaultAutoCommit);
......@@ -67,50 +70,6 @@ public class MysqlInsertAnalyseStrategy implements SqlSqlAnalyseHandler {
return statement.toString();
}
private boolean singleInsertAnalyse(String sql, Connection connection, Insert statement, ItemsList itemsList, String pk, int pkIndex) throws SQLException {
if (itemsList instanceof ExpressionList) {
ExpressionList expressionList = (ExpressionList) itemsList;
if(pkIndex > -1){
String defaultValue = expressionList.getExpressions().get(pkIndex).toString();
if(!"NULL".equals(defaultValue.toUpperCase())){
return true;
}
expressionList.getExpressions().remove(pkIndex);
statement.getColumns().remove(pkIndex);
}
QueryRunner queryRunner = new QueryRunner();
List<Map<String, Object>> insert = queryRunner.insert(connection, sql, new MapListHandler());
statement.getColumns().add(new Column(pk));
expressionList.getExpressions().add(new StringValue(insert.toString()));
}
return false;
}
private boolean multiInsertAnalyse(String sql, Connection connection, Insert statement, ItemsList itemsList, String pk, int pkIndex) throws SQLException {
if (itemsList instanceof MultiExpressionList) {
MultiExpressionList multiExpressionList = (MultiExpressionList) itemsList;
if(pkIndex > -1){
for (ExpressionList expressionList : multiExpressionList.getExprList()) {
String defaultValue = expressionList.getExpressions().get(pkIndex).toString();
if(!"NULL".equals(defaultValue.toUpperCase())){
return true;
}
expressionList.getExpressions().remove(pkIndex);
statement.getColumns().remove(pkIndex);
}
}
QueryRunner queryRunner = new QueryRunner();
List<Map<String, Object>> insert = queryRunner.insert(connection, sql, new MapListHandler());
statement.getColumns().add(new Column(pk));
for (int i = 0; i < multiExpressionList.getExprList().size(); i++) {
multiExpressionList.getExprList().get(i).getExpressions().add(new StringValue(insert.get(i).get("GENERATED_KEY").toString()));
}
}
return false;
}
@Override
public void afterPropertiesSet() {
AnalyseStrategryFactory.register(MysqlAnalyseEnum.INSERT.name(), this);
......
......@@ -30,10 +30,6 @@ public class MysqlSqlDeleteAnalyseStrategy implements SqlSqlAnalyseHandler {
@Override
public String mysqlAnalyseStrategy(String sql, Connection connection,Statement stmt) throws SQLException, JSQLParserException {
String catalog = connection.getCatalog();
/**
* todo JdbcAnalyseUtils.analyse(connection) 不能在此使用
* JdbcAnalyseUtils.analyse(connection) 是系统启动的时候获取数据的,而非在执行sql的时候做数据处理 {@link com.codingapi.txlcn.tc.aspect.TxDataSourceInterceptor#invoke(MethodInvocation)}
*/
TableList tableList = DataBaseContext.getInstance().get(catalog);
Delete statement = (Delete) stmt;
Table table = statement.getTable();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册