1. 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的更多相关文章

  1. 记录一次bug解决过程:mybatis中$和#的使用

    一.总结 mybatis中使用sqlMap进行sql查询时,经常需要动态传递参数.动态SQL是mybatis的强大特性之一,也是它优于其他ORM框架的一个重要原因.mybatis在对sql语句进行预编 ...

  2. 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 ...

  3. 欢迎进入MyKTV点歌系统展示

    一个项目,一分收获:一个项目,一些资源.Ktv项目也是一样的,所以我想分享我的收获,让你们获得你需要的资源. 一. 那MyKTV点歌系统具体的功能有哪些呢?我们就来看看吧! 1.MyKTV前台功能: ...

  4. mybatis的分页插件使用方法

    1.下载所需要的jar包,如果使用maven可以在maven中添加依赖: 插件的实现原理: 如果你想使用本项目的jar包而不是直接引入类,你可以在这里下载各个版本的jar包(点击Download下的j ...

  5. Oracle java.sql.SQLException: 数字溢出

    六月 30, 2016 5:47:47 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinit ...

  6. UserMapper.selectByPrimaryKey-Inline 报错的解决办法

    报错原因,及解决办法: 实体类id属性上少加了@Id 然后mybatis不知道哪个是主键了 我写了个demo public interface UserMapper extends Mapper< ...

  7. JDBC基础教程

    本文实例讲述了JDBC基础知识与技巧.分享给大家供大家参考.具体分析如下: 1.什么是JDBC? 通俗来讲JDBC技术就是通过java程序来发送SQL语句到数据库,数据库收到SQL语句后执行,把结果返 ...

  8. MySQL创建用户权限结果Trigger失败

    说来惭愧,MySQL我已经在只将用于,非常赞赏阶段. 甚至一些比较深层次的管理,不熟悉如何,我们要加强啊! 最近.系统测试,使用MySQL数据库,你需要在表上创建触发器.该数据库是安装在机.但.在任何 ...

  9. JAVA实现DAO基本层CRUD操作

    随着shh2各种操作方便框架.越来越多JAVA WEB效率,可是,假设在不了解这些框架使用的场合的情况下,一拿到项目就盲目地选择这些框架进行系统架构的搭建,就有可能造成非常多不是必需的资源浪费. 在项 ...

  10. 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究

    原文:查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究 -理解性能疑点 1      引言 内容来自http://www.so ...

随机推荐

  1. OpenAI未至,Open-Sora再度升级!已支持生成16秒720p视频

    Open-Sora 在开源社区悄悄更新了!现在支持长达 16 秒的视频生成,分辨率最高可达 720p,并且可以处理任何宽高比的文本到图像.文本到视频.图像到视频.视频到视频和无限长视频的生成需求.我们 ...

  2. Oracle和达梦:获取更新随机时间sql

    需求 1.修改数据库中表的创建.更新时间,日期固定,时间随机(日期也可以随机): 2.拿到这些sql去数据库执行就行了. 前提 -- 生成8-12间的随机数(小数) SELECT DBMS_RANDO ...

  3. [ABC345D] Tiling 位运算の极致运用

    [ABC345D] Tiling 原题解地址:Editorial by Kiri8128 神写法. 将 \(H \times W\) 的网格展开为 \(H \times (W + 1)\) 的序列, ...

  4. Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目

    Servlet注解的使用,简化配置 以及,使用模板方法设计模式优化oa项目 每博一文案 有句谚语说:"一怒之下踢石头,只有痛着脚趾头." 比一件糟糕的事情更可拍的,是你用糟糕的态度 ...

  5. 3种方法实现图片瀑布流的效果(纯JS,Jquery,CSS)

    最近在慕课网上听如何实现瀑布流的效果:介绍了3种方法. 1.纯JS代码实现: HTML代码部分: <!DOCTYPE html> <html> <head> < ...

  6. fastposter v2.15.0 从繁琐到简单,简洁好用的海报生成器

    fastposter v2.15.0 从繁琐到简单,简洁好用的海报生成器 从繁琐到简单,简洁好用的海报生成器 我很高兴向大家推荐一款令人兴奋的工具--Fastposter海报生成器.作为一名开发者,我 ...

  7. 传统css布局方案(position,float,line-height等配合)

    一.display display 是 css 布局中很重要的一个属性,它定义了元素生成的显示框类型,常见的几个属性值有:block.inline.inline-block.inherit.none. ...

  8. C语言:如何打印星星

    //打印星星                  //k是两个上下部分都一样的空格      /*i        j               k                    k      ...

  9. QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇

      Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台.在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他 ...

  10. PHP 网络通信底层原理分析

    一.引言 我们日常的程序开发大多数都是以业务为主,很少会接触到底层逻辑.对于我们程序员来说,了解程序的底层运行逻辑,更有助于提升我们对程序的理解.我相信大多数的人,每天基本上都是完成业务需求.当然,完 ...