- 浏览: 3424337 次
- 性别:
- 来自: 珠海
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
http://my.oschina.net/taaaa/blog/74657
让druid的SQLParser解析HQL语句,生成SELECT ......FROM.....WHERE ......的形式,闲话少说,直接上例子:
输出结果是:
InfoPublishs p, UserScores s
p.id = s.linkedId
AND p.userInfo.id = s.userInfo.id
AND s.classCode = 'InfoPublishs'
AND p.status = ?1
大家觉得怎么样呢?觉的有用就收着吧,没用就扔了。
上面例子有些问题, 不知道是版本还是什么原因,
下面这个例子, 如果真的要实用, 还得修改
让druid的SQLParser解析HQL语句,生成SELECT ......FROM.....WHERE ......的形式,闲话少说,直接上例子:
package com.alibaba.druid; import java.util.List; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLParserUtils; import com.alibaba.druid.sql.parser.SQLSelectParser; import com.alibaba.druid.sql.parser.SQLStatementParser; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; import com.alibaba.druid.util.JdbcUtils; public class ParseTest { public ParseTest() { // TODO Auto-generated constructor stub } public static void main(String[] args){ String sql ="select p, s.count as views, (select count(*) from Comments rc where rc.linkedId=p.id and rc.classcode='InfoPublishs') as commentNumber, (select count(*) from CollectIndexs rci where rci.toId=p.id and rci.classcode='InfoPublishs' and rci.type='favorite') as favorite FROM InfoPublishs p,UserScores s where p.id=s.linkedId and p.userInfo.id=s.userInfo.id and s.classCode='InfoPublishs' AND p.status=?1 ORDER BY p.createtime DESC"; StringBuffer select = new StringBuffer(); StringBuffer from = new StringBuffer(); StringBuffer where = new StringBuffer(); // parser得到AST SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, JdbcUtils.MYSQL); List stmtList = parser.parseStatementList(); // // 将AST通过visitor输出 SQLASTOutputVisitor visitor = SQLUtils.createFormatOutputVisitor(from, stmtList, JdbcUtils.MYSQL); SQLASTOutputVisitor whereVisitor = SQLUtils.createFormatOutputVisitor(where, stmtList, JdbcUtils.MYSQL); for (SQLStatement stmt : stmtList) { // stmt.accept(visitor); if(stmt instanceof SQLSelectStatement){ SQLSelectStatement sstmt = (SQLSelectStatement)stmt; SQLSelect sqlselect = sstmt.getSelect(); SQLSelectQueryBlock query = (SQLSelectQueryBlock)sqlselect.getQuery(); query.getFrom().accept(visitor); query.getWhere().accept(whereVisitor); } } System.out.println(from.toString()); System.out.println(select); System.out.println(where); } }
输出结果是:
InfoPublishs p, UserScores s
p.id = s.linkedId
AND p.userInfo.id = s.userInfo.id
AND s.classCode = 'InfoPublishs'
AND p.status = ?1
大家觉得怎么样呢?觉的有用就收着吧,没用就扔了。
上面例子有些问题, 不知道是版本还是什么原因,
下面这个例子, 如果真的要实用, 还得修改
public static void sqlDecomposition(String query,boolean isPrefix) throws InterruptedException { //Map<String,AnalysisPool> apMap=new HashMap<String,AnalysisPool>(); StringBuffer from=new StringBuffer(); SQLStatementParser parser=SQLParserUtils.createSQLStatementParser(query,JdbcUtils.HIVE); List<SQLStatement> stmtList=parser.parseStatementList(); SQLASTOutputVisitor visitor=SQLUtils.createFormatOutputVisitor(from,stmtList,JdbcUtils.HIVE); List<SQLSelectItem> sL=new ArrayList<SQLSelectItem>(); SQLStatement stmt=stmtList.iterator().next(); SQLSelectStatement sstmt=(SQLSelectStatement)stmt; SQLSelect sqlselect=sstmt.getSelect(); SQLSelectQueryBlock sqb=(SQLSelectQueryBlock)sqlselect.getQuery(); SQLTableSource fromx=sqb.getFrom(); fromx.accept(visitor); sL=sqb.getSelectList(); StringBuffer sb=new StringBuffer(); for ( SQLSelectItem sqi : sL) { if (sqi.getExpr() instanceof SQLCaseExpr) { sb.append(sqi.getAlias()).append(","); } else { sb.append(sqi.toString()).append(","); } } System.out.println("* ???? : " + sb.toString().substring(0, sb.toString().length() - 1)); //sourceAnalysis(fromx,apMap); }
发表评论
-
全局唯一ID设计方案
2016-06-28 09:42 1223在分布式系统中,经常需要使用全局唯一ID查找对应的数据。产生这 ... -
MYSQL中取当前周/月/季/年的第一天与最后一天
2016-06-27 17:34 2996http://my.oschina.net/zx0211/bl ... -
按周,按月,按日,按小时分组统计数据
2016-06-27 17:07 3279http://my.oschina.net/mjRao/blo ... -
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句区别
2016-06-27 16:27 1019http://my.oschina.net/MiniBu/bl ... -
分布式存储系统GlusterFS安装配置
2016-06-27 14:51 1032http://navyaijm.blog.51cto.com/ ... -
分布式查询 presto 入门安装使用
2016-06-24 15:44 2503http://my.oschina.net/chengxiao ... -
CitusDB logo基于 PostgreSQL 的集群数据库 CitusDB
2016-06-20 11:43 1082http://www.oschina.net/p/citusd ... -
跟我学习dubbo
2016-06-17 15:20 1069跟我学习dubbo-目录 http://bluereader. ... -
JavaMelody监控web服务器
2016-06-17 14:20 1180JavaMelody监控web服务器 http://my.os ... -
freemarker使用记录
2016-06-08 16:24 1309freeMarker语法 http://uule.iteye. ... -
freemarker判断是否为空
2016-06-08 16:03 2http://www.oschina.net/code/sni ... -
ehcache 分布式支持
2016-06-05 22:26 1099原文 http://my.oschina.net/glenxu ... -
MYSQL级联查询,包括向上向下的级联
2016-05-31 11:47 2235http://my.oschina.net/u/178116/ ... -
Intellij IDEA插件开发入门
2016-05-26 11:42 2883原文: http://blog.csdn.net/dc_726 ... -
阿里巴巴Druid数据源的配置与使用
2016-05-24 17:42 1546http://my.oschina.net/wjme/blog ... -
分布式任务调度组件 Uncode-Schedule
2016-05-13 14:47 2287http://www.oschina.net/p/uncode ... -
MySQL全文索引
2016-05-11 17:21 993MySQL全文索引Match Against与Like比较 h ... -
mysql中间件研究(Atlas,cobar,TDDL), 分库分表插件
2016-05-09 14:15 3445http://www.guokr.com/blog/47576 ... -
Druid使用起步—在javaWeb项目中配置监控
2016-05-06 11:41 3271Druid使用起步—在javaWeb项目中配置监控: http ... -
Fedora安装Redis
2016-05-04 08:56 1414管理工具: centos6.3下安装phpredisadmin ...
相关推荐
SqlParser是Druid中的一个核心组件,用于解析SQL语句。它基于词法分析和语法分析的原理,将SQL语句转换为抽象语法树(AST),从而方便对SQL进行深度处理。通过这个模块,开发者可以轻松获取SQL的结构信息,例如表名...
在`Druid`中,SQL解析器`DruidSQL Parser`是一个强大的工具,可以将SQL语句转换为抽象语法树(AST),方便进行SQL分析和优化。下面我们将深入探讨`DruidSQL Parser`的使用和相关知识点。 首先,`DruidSQL Parser`是...
Druid 是一个 JDBC 组件库,包括数据库连接池、SQL Parser 等组件,DruidDataSource 是好的数据库连接池。 显然,官方有意无意地强调了 DruidDataSource 是好的数据库连接池 -_- … Druid SQL 解析器 ...
"通过解析SQL语句获取表血缘关系项目"是一个针对数据库管理的实用技术,主要用于理解和跟踪数据的来源与流向,即血缘关系。血缘关系追踪在数据质量、合规性、审计和数据治理中扮演着关键角色。以下是关于这个主题的...
Druid 是阿里巴巴公司开源的一个数据库连接池,它的口号是:为监控而生的数据库连接池。...Druid 是一个 JDBC 组件库,包括数据库连接池、SQL Parser 等组件,DruidDataSource 是最好的数据库连接池。
其中,SQL解析器是Druid的一个重要模块,能够对SQL语句进行深度解析,生成抽象语法树(AST),便于我们获取SQL的结构信息。 要使用Druid进行SQL解析,首先需要在项目中引入Druid的相关依赖。如果你的项目是Maven...
这篇文尝试近距离地探究 Druid SQL 解析器如何工作。 Demo 代码 以这份代码为例 /** * * * @author beanlam * @date 2017年1月10日 下午11:06:26 * @version 1.0 * */ public class ParserMain { ...
sql Druid Sql解析理解及使用入门.pdf
该工具不需要连接数据库,您只需要将您的sql脚本粘贴到输入的textarea中,然后单击按钮,您将获得解析的结果! 例如,您输入: CREATE TABLE IF NOT EXISTS bill ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ...
druid sql 的描述文件,可快速上手
尽管Druid主要以数据库连接池闻名,但其SQL解析器性能优秀。Druid SQL Parser采用不同的实现方式,相比fdb parser和jsqlparser,它可能提供更好的性能和更丰富的功能。 为了比较这些解析器的性能,可以通过执行相同...
本文将深入探讨两个备选的Java语言开发的SQL解析器——jsqlparser和Druid SQL Parser,并进行性能对比。 一、fdb parser的问题 1. 源码修改难度大:fdb parser使用javacc作为解析器生成工具,对于非专业人士来说,...
该项目集成了MyBatis插件机制和Druid SQL解析功能,为数据变更的跟踪提供了一种高效且便捷的方式。 技术构成: - 主要编程语言:Java - 文件组成:共计42个文件,包括: - Java源文件:26个 - XML配置文件:7个 ...
MyBatis是一个轻量级的ORM(对象关系映射)框架,它可以将SQL语句与Java代码解耦,提高开发效率。而Druid是一个高性能、功能丰富的数据库连接池,它提供监控、扩展性以及更好的性能管理。 在MyBatis中集成Druid,...
本文使用Druid的连接池,然后配置Druid的相关属性,完成对Spring web工程的JDBC监控。...其实,我采用Druid替换其它连接池,最关键的一个理由是Druid有对SQL执行的监控统计功能。 druid 实现 SQL、URI 等监控
根据官方提供的数据,`druidparser`在处理SQL解析时的性能通常可以比`fdbparser`快5倍以上,在某些情况下甚至可以达到10倍以上的速度提升。对于长度较长的SQL查询,这种性能差距更为明显,最高可达40倍左右。 #####...
5. SqlParser:Druid的SQL解析模块,用于解析SQL语句并生成相应的AST(抽象语法树)。 四、Druid源码学习价值 1. 了解数据库连接池实现:通过阅读Druid源码,开发者可以深入理解数据库连接池的工作原理,这对于...
Druidparser提供了显著的性能提升,其解析速度比fdbparser快5至10倍,对于长SQL语句,提升更为显著,可达40倍左右。此外,Druidparser支持更多的SQL语法,包括插入时的唯一键更新、多列插入、带注释的创建表语句、...
本文使用Druid的连接池,然后配置Druid的相关属性,完成对Spring web工程的JDBC监控。...其实,我采用Druid替换其它连接池,最关键的一个理由是Druid有对SQL执行的监控统计功能。 druid 实现 SQL、URI 等监控
3. **智能感知并过滤SQL**:Druid可以通过SqlParser解析SQL语句,提供SQL黑名单功能,防止恶意或者错误的SQL被执行。 4. **扩展性强**:Druid支持多种数据源类型,并且可以通过Filter(过滤器)机制进行扩展,用户...