zoukankan      html  css  js  c++  java
  • 开源项目Druid的提取SQL模板

    在数据库审计中,常常用到SQL模板,这样提取一次模板,下一次就不用对相同的模板的SQL进行相关操作。对此Druid提供相应的工具类进行SQL模板提取:
     
    package com.lhm;
    import com.alibaba.druid.sql.SQLUtils;
    import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils;
    import com.alibaba.druid.util.JdbcConstants;
    
    /**
      * @author :haimli
      * @email : 912547587@qq.com
      * @datetime:2017年9月12日下午7:26:27
      */
    public class SQLFormat {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //给定需要格式化的SQL语句
            //String sql = "select id,name from lhm where id=1 and name='lihaiming' and 1=3";
            //String sql = "select a,b from c where a='33' and b='ddd'";
            String sql = "select b,a from c where a='33' and b='ddd' and a in ('33','332','334')";
            
            //指定数据库类型
            String dbtype = JdbcConstants.MYSQL;
            String fs = ParameterizedOutputVisitorUtils.parameterize(sql, dbtype);
            
            System.out.println("fs:
    "+fs);
        }
    }
    上面是一个很简单的一个SQL:
    select b,a from c where a='33' and b='ddd' and a in ('33','332','334')
    对此我们使用相应的提取SQL模板的工具提取模板:
     
    SELECT b, a
    FROM c
    WHERE a = ?
    AND b = ?
    AND a IN (?)
    使用比较复杂的SQL语句:
    String sql = "select rownum,organ_level4,organ_name4,user_no,user_name,pzl_num,xf_ccn from (select t.organ_level4,t.organ_name4,t.user_no,t.user_name,sum(t.pzl_num) pzl_num,sum(t.xf_ccn) xf_ccn from rt_smtj_tb t,sm_user_organ_tb a,sm_organ_tb b where 2>1 and a.organ_no=b.organ_no and b.organ_no=t.organ_level4 and b.organ_level=4 and a.user_no='#DEAL_USERNO#' group by t.organ_level4,t.organ_name4,t.user_no,t.user_name order by sum(t.pzl_num) desc,user_no)";
    //String sql = "select id,name from lhm where id=1 and name='lihaiming' and 1=3";
    //String sql = "select a,b from c where a='33' and b='ddd'";
    //String sql = "select b,a from c where a='33' and b='ddd' and a in ('33','332','334')";
     
    //指定数据库类型
    String dbtype = JdbcConstants.MYSQL;
    String fs = ParameterizedOutputVisitorUtils.parameterize(sql, dbtype);
     
    System.out.println("fs:
    "+fs);
    再使用比较复杂的SQL语句:
    select rownum,
    organ_level4,
    organ_name4,
    user_no,
    user_name,
    pzl_num,
    xf_ccn
    from (select t.organ_level4,
    t.organ_name4,
    t.user_no,
    t.user_name,
    sum(t.pzl_num) pzl_num,
    sum(t.xf_ccn) xf_ccn
    from rt_smtj_tb t, sm_user_organ_tb a, sm_organ_tb b
    where 2 > 1
    and a.organ_no = b.organ_no
    and b.organ_no = t.organ_level4
    and b.organ_level = 4
    and a.user_no = '#DEAL_USERNO#'
    group by t.organ_level4, t.organ_name4, t.user_no, t.user_name
    order by sum(t.pzl_num) desc, user_no)
     
    提取SQL模板:
    SELECT rownum, organ_level4, organ_name4, user_no, user_name
    , pzl_num, xf_ccn
    FROM (
    SELECT t.organ_level4, t.organ_name4, t.user_no, t.user_name
    , SUM(t.pzl_num) AS pzl_num, SUM(t.xf_ccn) AS xf_ccn
    FROM rt_smtj_tb t, sm_user_organ_tb a, sm_organ_tb b
    WHERE ? > ?
    AND a.organ_no = b.organ_no
    AND b.organ_no = t.organ_level4
    AND b.organ_level = ?
    AND a.user_no = ?
    GROUP BY t.organ_level4, t.organ_name4, t.user_no, t.user_name
    ORDER BY SUM(t.pzl_num) DESC, user_no
    )
     
    注意事项:提取模板的时候SQL语句必须是正确的,这样才能保证提取模板的时候不会报错;
     
  • 相关阅读:
    Spark记录-SparkSQL远程操作MySQL和ORACLE
    Spark记录-Spark on Yarn框架
    Linux记录-重启后磁盘丢失问题解决方案
    Spark记录-阿里巴巴开源工具DataX数据同步工具使用
    Spark记录-SparkSql官方文档中文翻译(部分转载)
    Spark记录-SparkSQL一些操作
    Spark记录-Spark-Shell客户端操作读取Hive数据
    Spark记录-SparkSQL相关学习
    Spark记录-Scala程序例子(函数/List/match/option/泛型/隐式转换)
    CM记录-升级Spark版本到2.x(转载)
  • 原文地址:https://www.cnblogs.com/lihaiming93/p/7519315.html
Copyright © 2011-2022 走看看