在数据库审计中,常常用到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:\n"+fs);
}
}
上面是一个很简单的一个SQL:
select b,a from c where a='' and b='ddd' and a in ('','','')
对此我们使用相应的提取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:\n"+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语句必须是正确的,这样才能保证提取模板的时候不会报错;
 

开源项目Druid的提取SQL模板的更多相关文章

  1. 阿里开源项目 druid 相关资料汇总

    项目发起人访谈:http://www.iteye.com/magazines/90 github主页:https://github.com/alibaba/druid druid 项目,我想我能用很短 ...

  2. 阿里巴巴的开源项目Druid(关于数据库连接)

    1 配置 和dbcp类似,druid的常用配置项如下 配置 缺省值 说明 name   配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来.如果没有配置,将会生成一个名字,格 ...

  3. Druid——阿里巴巴的开源项目(关于数据库连接、监控)

    相关文章 0.Druid首页——jdbc连接池,监控组件 1.阿里巴巴的开源项目Druid(关于数据库连接) 2.ITeye谈Druid 3.DBCP(DataBase connection pool ...

  4. [ionic开源项目教程] - 第13讲 Service层优化,提取公用Service,以及生活和农业两大模块的实现

    关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 这一讲主要实现生活和农业两大模块的实现,在这个过程中,对service层提取出一个公用的BaseService. 这一讲分为 ...

  5. [ionic开源项目教程] - 第12讲 医疗模块的实现以及Service层loadMore和doRefresh的提取封装

    关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 这一讲主要实现tab2[医疗]模块,[医疗]模块跟tab1[健康]模块类似. [ionic开源项目教程] - 第12讲 医疗 ...

  6. 关键词提取自动摘要相关开源项目,自动化seo

    关键词提取自动摘要相关开源项目 GitHub - hankcs/HanLP: 自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 自动摘要 短语提取 拼音 简繁转换https:/ ...

  7. .NET Core/.NET5/.NET6 开源项目汇总13:模板引擎

    系列目录     [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...

  8. 利用开源项目 FFMpegSharp 实现音视频提取、转码、抓图等操作

    开源项目地址:https://github.com/vladjerca/FFMpegSharp 首先需要在 web.config 或 app.config 中配置 <appSettings> ...

  9. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

随机推荐

  1. JSP和El表达式和JSTL标签库使用

    核心标签库: <%@ page language="java" import="java.util.*" pageEncoding="utf-8 ...

  2. Jersey实现Restful服务

    jersey 是基于Java的一个轻量级RESTful风格的Web Services框架.以下我基于IDEA实现Restful完整Demo. 1.创建maven-web工程,后面就是正常的maven工 ...

  3. 如何开发自己的搜索帝国之ES图形化Kibana安装与使用

    在如何开发自己的搜索帝国之Elasticsearch中已经介绍安装好了ES,下面就Kibana对ES的查询监控作介绍,就是常提到的大数据日志处理组件ELK里的K. 什么是Kibana?现引用园友的一段 ...

  4. 基于.NET CORE微服务框架 -Api网关服务管理

    1.前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装2 ...

  5. Apache Kafka系列(二) 命令行工具(CLI)

    Apache Kafka命令行工具(Command Line Interface,CLI),下文简称CLI. 1. 启动Kafka 启动Kafka需要两步: 1.1. 启动ZooKeeper [roo ...

  6. 第7章 DNS & bind从基础到深入

    本文目录: 7.1 DNS必懂基础 7.1.1 域的分类 7.1.2 主机名.域名.FQDN 7.1.3 域的分层授权 7.1.4 DNS解析流程 7.2 DNS术语 7.2.1 递归查询和迭代查询 ...

  7. SVN 、Git、Github的使用

    1.1 SVN 总结以及使用建议 每一次保存历史记录实际上就是一次提交 什么时候去保存历史记录? 完成了一个具体的功能模块 代码运行没有bug 当天工作结束提交一次 没有 bug 的前提下去提交一次 ...

  8. 关于DB2版本、补丁升级和回退的总结[转载]

    首先介绍几个概念 RELEASE的升级就是版本升级,例如9.1→9.5→9.7→10.1,可以跳版本升级,例如9.1→10.1 FIX PACK简称FP,就是打补丁,例如9.7.1→9.7.2,每个版 ...

  9. %appdata%目录下配置文件修改

    %appdata%目录下配置文件修改 1.假设%appdata%\leez Program目录下有Cache子目录和配置文件Config.ini内容为: [Version] Version=1.0.0 ...

  10. 【javascript】详解javascript闭包 — 大家准备好瓜子,我要开始讲故事啦~~

    前言: 在这篇文章里,我将对那些在各种有关闭包的资料中频繁出现,但却又千篇一律,且暧昧模糊得让人难以理解的表述,做一次自己的解读.或者说是对“红宝书”的<函数表达式/闭包>的那一章节所写的 ...