运用场景
表中有个字段存储着A表的sql语句,由于A表删除了某个字段导致以前存储的sql语句执行失败找不到该字段,对此我封装了一个工具类对不存在的SQl字段进行删除
/** * 使用说明 * 1.只支持简单的更新和插入单表操作 * 2.SQL关键字要求大写比如UPDATE 不能写为 update */
package com.yujie;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
/**
* 使用说明
* 1.只支持简单的单表操作
* 2.SQL关键字要求大写比如UPDATE 不能写为 update
*/
public class ConversionSQL{
public static void main(String[] args) {
String insert ="INSERT INTO menu( `parent_id`, `name`, `icon`, `link`, `help_id`, `help_code`) VALUES (400, '坐席当前状态管理', 'fa fa-building-o', '/ccUserCurrentStatus/', 813, 'MSHJZXGLZXDQZTGL')";
String update ="UPDATE `level` SET name=5, min_grade=4 WHERE `level`='A' AND max_grade2 = 1 AND name=5";
System.out.println("请输入要删除的字段名字:");
Scanner scanner = new Scanner(System.in);
String column = scanner.nextLine();
insertAndUpdate(insert,column);
insertAndUpdate(update,column);
}
public static String update(String sql,String column){
String prefix=sql.substring(0,sql.indexOf("SET")+3)+" ";
String[] arrays = sql.split("WHERE");
String[] s1 = arrays[0].substring(arrays[0].indexOf("SET")+3).split(",");;
String[] s2 = arrays[1].split(" ");
ArrayList<String> list1 = new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>();
list1.addAll(Arrays.asList(s1));
list2.addAll(Arrays.asList(s2));
for (int i = 0; i < list1.size(); i++) {
String result=list1.get(i).substring(0,list1.get(i).indexOf("=")).replaceAll(" ","");
if(column.equals(result)){
list1.remove(i);
break;
}
}
for (int i = 0; i < list2.size(); i++) {
String result=list2.get(i);
if(result.contains("=")){
result = result.substring(0,result.indexOf("="));
}
if(column.equals(result)){
list2.set(i," 1 = 1");
}
}
String newSql="";
for (int i = 0; i < list1.size() ; i++) {
newSql+=list1.get(i)+",";
}
newSql=newSql.substring(0,newSql.length()-1);
String newSql2="";
for (int i = 0; i < list2.size() ; i++) {
newSql2+=list2.get(i)+" ";
}
System.out.println("原数据");
System.out.println(sql);
System.out.println("替换");
System.out.println(prefix + newSql+ "WHERE" +newSql2);
return prefix + newSql+ "WHERE" +newSql2;
}
public static String insert(String sql,String column){
String prefix=sql.substring(0,sql.indexOf("("))+" ";
String sql2=sql.substring(sql.indexOf("("),sql.lastIndexOf(")")+1).replaceAll("\\(", "").replaceAll("\\)", "");
String[] values = sql2.split("VALUES");
String s1 = values[0];
String s2 = values[1];
String[] s3 = s1.split(",");
String[] s4 = s2.split(",");
List<String> list3 = new ArrayList<>();
List<String> list4 = new ArrayList<>();
list3.addAll(Arrays.asList(s3));
list4.addAll(Arrays.asList(s4));
int index=-1;
String field="`"+column+"`";
for (int i=0;i<list3.size();i++) {
String result = list3.get(i).replaceAll(" ","");
if(field.equals(result)){
index=i;
break;
}
}
list3.remove(index);
list4.remove(index);
String newSql1="( ";
for (int i = 0; i < list3.size(); i++) {
if(i != list3.size()-1){
newSql1+=list3.get(i)+",";
}else{
newSql1+=list3.get(i);
}
}
newSql1+=" )";
String newSql2="( ";
for (int i = 0; i < list4.size(); i++) {
if(i != list4.size()-1){
newSql2+=list4.get(i)+",";
}else{
newSql2+=list4.get(i);
}
}
newSql2+= ")";
System.out.println("原数据");
System.out.println(sql);
System.out.println("替换");
System.out.println(prefix + newSql1 + " VALUES " +newSql2 );
return prefix + newSql1 + " VALUES " +newSql2;
}
public static void insertAndUpdate(String sql,String column){
if(sql.startsWith("UPDATE")){
if (!sql.contains(column)){
throw new RuntimeException("更新操作失败!不存在的字段:"+column);
}
update(sql,column);
}
if(sql.startsWith("INSERT")){
if (!sql.contains(column)){
throw new RuntimeException("插入操作失败!不存在的字段:"+column);
}
insert(sql,column);
}
}
}
运行效果
请输入要删除的字段名字:
name
原数据
INSERT INTO menu( `parent_id`, `name`, `icon`, `link`, `help_id`, `help_code`) VALUES (400, '坐席当前状态管理', 'fa fa-building-o', '/ccUserCurrentStatus/', 813, 'MSHJZXGLZXDQZTGL')
替换
INSERT INTO menu ( `parent_id`, `icon`, `link`, `help_id`, `help_code` ) VALUES ( 400, 'fa fa-building-o', '/ccUserCurrentStatus/', 813, 'MSHJZXGLZXDQZTGL')
原数据
UPDATE `level` SET name=5, min_grade=4 WHERE `level`='A' AND max_grade2 = 1 AND name=5
替换
UPDATE `level` SET min_grade=4 WHERE `level`='A' AND max_grade2 = 1 AND 1 = 1