sqlUtil
package com.cmbchina.monitor.utils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLParserUtils;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.cmbchina.monitor.dao.mapper.ApiConfigMapper;
import com.cmbchina.monitor.dao.mapper.CopybookFieldMapper;
import com.cmbchina.monitor.entity.configs.ApiConfigs;
import com.cmbchina.monitor.entity.configs.CopybookFieldConfig;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.alibaba.druid.sql.SQLUtils.toSQLString;
public class SqlCheckUtil {
public static void main(String[] args) {
String str = "UPDATE COXDBO.COPYBOOK_FIELD_CONFIG_A SET FILLER = 0 WHERE COPYBOOK = 'CPS102' AND COLUMN_NAME='CM_EMPTY_UACCT_FLAG';".toUpperCase();
// sqlFormat(str);
System.out.println(mergeContinuetyBlank(str));
System.out.println(getUpdateTableName(str));
// System.out.println(str.indexOf("WHERE"));
// System.out.println(str.substring(str.indexOf("WHERE")));
System.out.println(sqlToBack(str, null, null));
System.out.println(getUpdateWhere(str));
}
/**
* 格式化显示sql语句
*
* @param sql
* @return
*/
public static String sqlFormat(String sql) {
if (sql == null || "".equals(sql.trim()))
return "";
List<SQLStatement> statementList = null;
SQLStatementParser parser = null;
try {
parser = SQLParserUtils.createSQLStatementParser(sql, "mysql");
statementList = parser.parseStatementList();
} catch (ParserException e) {
System.out.println("SQL转换中发生了错误:" + e.getMessage());
throw e;
}
return toSQLString(statementList, "mysql");
}
/**
* 检查sql语法是否正确
*
* @param sql
* @return
*/
public static Boolean checkSql(String sql) {
if (sql == null || "".equals(sql.trim()))
return false;
List<SQLStatement> statementList = null;
SQLStatementParser parser = null;
try {
parser = SQLParserUtils.createSQLStatementParser(sql, "oracle");
statementList = parser.parseStatementList();
} catch (ParserException e) {
return false;
}
return true;
}
public static String sqlToBack(String sql, CopybookFieldMapper copybookFieldMapper, ApiConfigMapper apiConfigMapper) {
if (StringUtils.isEmpty(sql))
return "";
//合并连续空格
sql = mergeContinuetyBlank(sql).toUpperCase();
//判断时更新还是插入操作
if (sql.contains("INSERT INTO")) {
//获取表名
String tableName = getInsertTableName(sql);
//判断时api表还是field表
if (tableName.contains("API")) {
//获取API_ID
String apiId = getInsertColumnValue(sql, "API_ID");
//生成回退语句
String backSql = "DELETE FROM COXDBO.BILL_QUERY_API_CONFIG WHERE API_ID=" + apiId;
//TODO 插入历史记录
return backSql;
} else {
//获取插入primaryKey
String copybook = getInsertColumnValue(sql, "COPYBOOK");
String fieldNo = getInsertColumnValue(sql, "FIELD_NO");
//生成回退语句
String backSql = "DELETE FROM " + tableName + " WHERE COPYBOOK=" + copybook + " AND FIELD_NO=" + fieldNo + "";
//TODO 插入历史记录
return backSql;
}
} else {
//获取表名
String tableName = getUpdateTableName(sql);
//确定回退表信息
if (tableName.contains("API")) {
//获取where过滤条件
Map<String, Object> whereMap = getUpdateWhere(sql);
//获取更新前的值
List<ApiConfigs> api_id = apiConfigMapper.query(1, 2, whereMap.get("API_ID").toString());
ApiConfigs apiConfigs = null;
if (api_id != null)
apiConfigs = api_id.get(0);
//生成回退语句
String backSql = getApiInsertBack(apiConfigs);
//TODO 存入配置历史
} else {
//获取where过滤条件
Map<String, Object> whereMap = getUpdateWhere(sql);
CopybookFieldConfig copybookFieldConfig = new CopybookFieldConfig();
copybookFieldConfig.setCopybook(whereMap.get("COPYBOOK") == null ? null : whereMap.get("COPYBOOK").toString());
copybookFieldConfig.setCobolName(whereMap.get("COLUMN_NAME") == null ? null : whereMap.get("COLUMN_NAME").toString());
copybookFieldConfig.setFieldNo(whereMap.get("FIELD_NO") == null ? null : Long.parseLong(whereMap.get("FIELD_NO").toString()));
//获取更新前的值
List<CopybookFieldConfig> copybookFieldConfigs = copybookFieldMapper.copybookFieldConfigQuery(copybookFieldConfig);
CopybookFieldConfig copybookFieldConfig1 = copybookFieldConfigs.get(0);
//拼接回退语句--只会更新filler字段
StringBuilder backSql = new StringBuilder("UPDATE "+ tableName +" ");
if (copybookFieldConfig1.getFiller() == null) {
backSql.append(" SET FILLER= NULL");
}else {
backSql.append(" SET FILLER= '" + copybookFieldConfig1.getFiller() + "'");
}
backSql.append(" WHERE COPYBOOK='"+ copybookFieldConfig1.getCopybook() +"' ");
backSql.append(" AND COLUMN_NAME='"+ copybookFieldConfig1.getColumnName() +"' ");
backSql.append(" AND FIELD_NO="+ copybookFieldConfig1.getFieldNo() +" ");
//TODO 存入配置历史
}
}
return null;
}
private static String getApiInsertBack(ApiConfigs apiConfigs) {
StringBuilder backSql = new StringBuilder("UPDATE COXDBO.QUERY_API_CONFIG " +
"SET STATUS='1', COX_TPS=1000, CTG_TPS=50, \"TYPE\"='1', URL='/accountinfo/CORE4A06', PERCENTAGE=0, SWITCH_TAIL=NULL " +
"WHERE API_ID='CORE4A06'");
if (apiConfigs.getStatus() != null)
backSql.append("STATUS='" + apiConfigs.getStatus() + "', ");
if (apiConfigs.getType() != null)
backSql.append("TYPE='" + apiConfigs.getType() + "', ");
if (apiConfigs.getUrl() != null)
backSql.append("URL='" + apiConfigs.getUrl() + "', ");
if (apiConfigs.getSwitchTail() != null)
backSql.append("SWITCH_TAIL='" + apiConfigs.getSwitchTail() + "', ");
if (apiConfigs.getCoxTps() != null)
backSql.append("COX_TPS=" + apiConfigs.getCoxTps() + ", ");
if (apiConfigs.getCoxTps() != null)
backSql.append("CTG_TPS=" + apiConfigs.getCtgTps() + ", ");
if (apiConfigs.getCoxTps() != null)
backSql.append("PERCENTAGE=" + apiConfigs.getPercentage() + ", ");
backSql = new StringBuilder(backSql.substring(0, backSql.length() - 2));
backSql.append(" WHERE API_ID='" + apiConfigs + "'");
return backSql.toString();
}
private static Map<String, Object> getUpdateWhere(String sql) {
if (StringUtils.isEmpty(sql))
return null;
sql = sql.replace(";", "").toUpperCase();
String where = sql.substring(sql.indexOf("WHERE") + 5);
String[] ands = where.split("AND");
Map<String, Object> conditionMap = new HashMap<>();
for (String and : ands) {
and = and.replaceAll(" ", "");
String[] split = and.split("=");
conditionMap.put(split[0], split[1]);
}
return conditionMap;
}
/**
* 将字符串中多个连续的空格合并为一个
*
* @param str
* @return
*/
public static String mergeContinuetyBlank(String str) {
if (StringUtils.isEmpty(str))
return "";
String s = str.replaceAll("\n", " ").replaceAll(" {2,}", " ").replaceAll("\r", "").replaceAll("\t", "").replaceAll(";", "");
//若第一位为空格,则将第一位移除
if (s.charAt(0) == ' ') {
s = s.substring(1, s.length());
}
return s;
}
/**
* 获取插入操作表名
*
* @param sql
* @return
*/
public static String getInsertTableName(String sql) {
if (StringUtils.isEmpty(sql))
return "";
String[] s = sql.split(" ");
return s[2];
}
/**
* 获取更新操作表名
*
* @param sql
* @return
*/
public static String getUpdateTableName(String sql) {
if (StringUtils.isEmpty(sql))
return "";
String[] s = sql.split(" ");
return s[1];
}
/**
* 获取Api表主键值
*
* @param sql
* @return
*/
public static String getInsertColumnValue(String sql, String columnName) {
sql = sql.toUpperCase();
String firstBraket = sql.substring(sql.indexOf('(') + 1, sql.indexOf(')'));
String firstBraketSql = firstBraket.replaceAll(" ", "");
String subSql = sql.substring(sql.indexOf(')') + 1);
String secondBraket = subSql.substring(subSql.indexOf('(') + 1, subSql.indexOf(')'));
String secondBraketSql = secondBraket.replaceAll(" ", "");
String[] nameSplit = firstBraketSql.split(",");
String[] valueSplit = secondBraketSql.split(",");
for (int i = 0; i < nameSplit.length; i++) {
if (columnName.equals(nameSplit[i]))
return valueSplit[i];
}
return "";
}
}
sqlUtil的更多相关文章
- 记录一次bug解决过程:mybatis中$和#的使用
一.总结 mybatis中使用sqlMap进行sql查询时,经常需要动态传递参数.动态SQL是mybatis的强大特性之一,也是它优于其他ORM框架的一个重要原因.mybatis在对sql语句进行预编 ...
- Error invoking SqlProvider method (com.github.abel533.mapper.MapperProvider.dynamicSQL). Cause: java.lang.InstantiationException: com.github.abel533.mapper.MapperProvider
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.apache.i ...
- 欢迎进入MyKTV点歌系统展示
一个项目,一分收获:一个项目,一些资源.Ktv项目也是一样的,所以我想分享我的收获,让你们获得你需要的资源. 一. 那MyKTV点歌系统具体的功能有哪些呢?我们就来看看吧! 1.MyKTV前台功能: ...
- mybatis的分页插件使用方法
1.下载所需要的jar包,如果使用maven可以在maven中添加依赖: 插件的实现原理: 如果你想使用本项目的jar包而不是直接引入类,你可以在这里下载各个版本的jar包(点击Download下的j ...
- Oracle java.sql.SQLException: 数字溢出
六月 30, 2016 5:47:47 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinit ...
- UserMapper.selectByPrimaryKey-Inline 报错的解决办法
报错原因,及解决办法: 实体类id属性上少加了@Id 然后mybatis不知道哪个是主键了 我写了个demo public interface UserMapper extends Mapper< ...
- JDBC基础教程
本文实例讲述了JDBC基础知识与技巧.分享给大家供大家参考.具体分析如下: 1.什么是JDBC? 通俗来讲JDBC技术就是通过java程序来发送SQL语句到数据库,数据库收到SQL语句后执行,把结果返 ...
- MySQL创建用户权限结果Trigger失败
说来惭愧,MySQL我已经在只将用于,非常赞赏阶段. 甚至一些比较深层次的管理,不熟悉如何,我们要加强啊! 最近.系统测试,使用MySQL数据库,你需要在表上创建触发器.该数据库是安装在机.但.在任何 ...
- JAVA实现DAO基本层CRUD操作
随着shh2各种操作方便框架.越来越多JAVA WEB效率,可是,假设在不了解这些框架使用的场合的情况下,一拿到项目就盲目地选择这些框架进行系统架构的搭建,就有可能造成非常多不是必需的资源浪费. 在项 ...
- 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究
原文:查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究 -理解性能疑点 1 引言 内容来自http://www.so ...
随机推荐
- [Go] Golang defer 与 MySQL 连接关闭的陷阱 (database is closed)
在 golang 某些 orm 中,你经常会看到这种用法: func main() { db, err := gorm.Open("sqlite3", "test.db& ...
- dotnet 7 已知问题 WPF 的 TreeView 开启虚拟化之后只显示首项
本文记录 WPF 在 dotnet 7 的一个已知问题,此问题当前已修复,只需更新 SDK 或运行时即可.使用 TreeView 在开启虚拟化之后只显示首项,其他项不显示.本文将告诉大家此问题的原因和 ...
- Dijkstra迪杰斯特拉求最短路和最短路的条数和各个点权值的最大值
作为一个城市的紧急救援队队长,你会得到一张你所在国家的特殊地图. 该地图显示了由一些道路连接的几个分散的城市. 地图上标出了每个城市的救援队伍数量以及任意两个城市之间每条道路的长度. 当其他城市接到紧 ...
- VMware Workstation Pro各版本下载链接汇总(特全!!!)
VMware Workstation Pro各版本下载链接汇总 (10.11.12.14.15.16官网全版本) 整理不易,点赞关注一下吧 工具软件:VMware Workstation Pro 1. ...
- [Oracle故障处理]ORA-30012: undo tablespace 'UNDOTBS1' does not exist
场景:用RMAN在异机上恢复数据. 错误信息如下: ORA-01092: ORACLE instance terminated. Disconnection forced ORA-30012: und ...
- 以对象的方式访问html中的标签,比正则表达式更好用的方式获取html中的内容,linq方式直接获取所有的链接,更加先进的c#版本爬虫开源库
这是我本人自己写的一个开源库,现已经发布到nuget,可以直接在vs的nuget包管理中搜索到,或者可以到nuget官网下载:https://www.nuget.org/packages/ZmjCon ...
- Surge DHCP设置
关于DNS配置 对于中国用户,推荐的 DNS 配置如下: 如果经常使用的网络没有 DNS 劫持问题:配置为使用系统 DNS 配置并追加 223.5.5.5 和 114.114.114.114 作为冗余 ...
- shell 去掉逗号_shell替换和去掉换行符
用shell处理文件的时候我们常常需要去掉或者加上换行符,name问题就来了怎么才能快速的替换呢? 我们有这样一个文件[root@hxy working]# cat 1 GD200A16C013493 ...
- webstorm上的Element提示插件
https://zhuanlan.zhihu.com/p/34735529 首先说明下,这个插件是用idea开发的,在idea上同样适用.有兴趣的朋友可以直接git下来开发自己的小插件. 插件基于的w ...
- Xcode多进程调试:WKWebView
由于WKWebView使用的是多线程架构,渲染模块和网络模块都各自在一个单独的进程里面,因此,如果需要设置渲染模块或者网络模块里面的断点,需要做一些特殊处理. 举个例子,假设在Xcode里面设置了渲染 ...