MOQL是一个面向内存对象设计的查询统计分析工具,其语法兼容SQL标准。其语法结构除支持如下:
select count(a.id) cnt, sum(a.num) sum, a.num%500 mod from BeanA a group by 3 having mod > 10 order by 1 |
的标准SQL书写格式外,还拥有xml结构的书写格式,如下:
<selector id="40daef74-ba85-465b-b051-9f41ad00a526"> <cache size="100"/> <columns> <column name="cnt" value="count(a.id)"/> <column name="sum" value="sum(a.num)"/> <column name="mod" value="a.num%500"/> </columns> <tables> <table name="a" value="BeanA"/> </tables> <groupby> <group column="3"/> </groupby> <having> <binary loperand="mod" operator=">" roperand="10"/> </having> <orderby> <order column="1" mode="ASC"/> </orderby> </selector> |
以上两种语法格式可以互换。当MOQL使用xml格式时,可以根据需要将xml格式的语法格式转换为不同的SQL方言。除MOQL语法外,还支持Oracle、SQL Server、DB2、MySQL、PostgreSQL等方言。
MOQL的xml语法格式可以看作是sql语句的语法树结构形式,他结构清晰,比较利于通过程序进行编写和修改。尤其方便前后台的交互。当一个应用系统需要提供比较完善且开放的查询功能时,可以通过编辑xml格式的查询语句,然后将其传送给后台;由后台根据数据库的类型转换为对应的sql方言,然后对数据库进行查询并最终返回结果集。这种模式可以在前端为用户提供灵活开放的查询功能,在后端屏蔽数据库的差异,方便迁移。
以下是一段演示代码,演示了从标准sql格式到xml格式的转换,以及xml格式到各方言的sql格式转换。
String sql ="select count(a.id) cnt, sum(a.num) sum, a.num%500 modfrom BeanA a group by 3 having mod > 10 orderby 1 limit 10,3"; try { String xml = MoqlUtils.translateMoql2Xml(sql); System.out.println(xml); sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.MOQL); System.out.println(sql); sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.ORACLE); System.out.println(sql); sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.SQLSERVER); System.out.println(sql); sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.MYSQL); System.out.println(sql); sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.POSTGRESQL); System.out.println(sql); sql = MoqlUtils.translateXml2Sql(xml, SqlDialectType.DB2); System.out.println(sql); } catch (MoqlException e) { // TODO Auto-generated catch block e.printStackTrace(); } |
输出如下:
<?xml version="1.0"encoding="UTF-8"?> <selectorsxmlns="http://www.moql.org/schema/moql"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.moql.org/schema/moqlselector-base.xsd"> <selector id="b6463fb5-298e-461f-8f60-e9da8f5da80f"> <cache size="100"/> … <limit offset="10"value="3"/> </selector> </selectors>
select cache(100,fifo) count(a.id),sum(a.num), a.num % 500 from BeanA a group by 3 having mod > 10 order by 1asc limit 10,3 select count(a.id), sum(a.num), a.num % 500from BeanA a where rownum <= 3 group by 3 having mod > 10 order by 1 asc select top 3 count(a.id), sum(a.num), a.num %500 from BeanA a group by 3 having mod > 10 order by 1 asc select count(a.id), sum(a.num), a.num % 500from BeanA a group by 3 having mod > 10 order by 1 asc limit 10,3 select count(a.id), sum(a.num), a.num % 500from BeanA a group by 3 having mod > 10 order by 1 asc limit 10,3 select count(a.id), sum(a.num), a.num % 500from BeanA a group by 3 having mod > 10 order by 1 asc fetch first 3 rowsonly |
从上面演示代码输出的xml格式我们可以发现其格式比较复杂,可以包含不止一个selector标签(注:每个selector标签代表了一个sql语句)。这与MOQL最初的设计初衷有关,不影响使用,可以不必关心。另外,需要注意的就是,当sql语句中存在聚集运算时,如:union、intersect等时,其xml结构的标签就不是selector了,而是setlector了,setlector下会包含两个selector标签,表示两个集合进行聚集运算。关于MOQL的xml语法结构的标签说明,如果有朋友感兴趣,留言或邮件我,我将再详细写篇文章进行介绍。
MOQL的相关路径如下:
项目地址:http://sourceforge.net/projects/moql/
代码路径:svn://svn.code.sf.net/p/moql/code/trunk
新项目地址:https://github.com/colorknight/moql