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="&gt;" 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

MOQL—转换器(Translator)相关推荐

  1. 2020收官--Filter4Go

    终于在2021年到来之前完成了Filter4Go. Filter4Go是一款基于GO语言开发的,兼容SQL语言Where子句语法的数据过滤的工具(https://github.com/colorkni ...

  2. java开源网络服务器端组件_OpenNMS - 网络服务器端组件 - 组件类库 - JAVA开源项目 - 开源吧...

    相关开源项目 Jsmtpd:Jsmtpd是一个简洁的Email服务器,完全用Java开发.它基本的功能是可以利用SMTP协议来发送Email.Jsmtpd的其它功能是以插件模块的形式来实现,支持TLS ...

  3. rtp 多媒体流同步控制 实时传输协议 简介

    RTP(Real-time Transport Protocol)是由IETF开发的实时传输协议,可以在面向连接或无连接的下层协议上工作,通常和UDP协议一起使用.RTP的工作机理与RSVP不同,主要 ...

  4. ug中文字大小设置_UG与AutoCAD的数据转换,原来还有这么简单的方法

    一起探讨,一起学习,一起进步.大家的每一次点赞,每一次评论,每一次转发.都是我创作的动力,期待你的加入 一.转换的过程 在UG中进行数据转换的时候主要将UG ->Drafting中工程图的信息转 ...

  5. systemtap工具使用介绍

    简介 systemtap 是利用Kprobe 提供的API来实现动态地监控和跟踪运行中的Linux内核的工具,相比Kprobe,systemtap更加简单,提供给用户简单的命令行接口,以及编写内核指令 ...

  6. 网络流媒体协议之——RTP协议概述

    网络流媒体协议系列: 网络流媒体协议之--MPEG-DASH协议简述 网络流媒体协议之--HLS概述 网络流媒体协议之--UDP协议概述 今天来整理一下RTP. RTP(Real-time Trans ...

  7. LMAX Disruptor用户手册-4.0.0.RC2-最好的入门文章

    LMAX Disruptor 用户手册 原文链接 LMAX Disruptor是一个高性能线程通信库.它起源于LMAX对高并发,高性能,无锁算法的研究,如今已成长为Exchange基础架构的核心部分. ...

  8. 嵌入式 RTP协议详解以及其他相关协议

    RTP协议 1 RTP报文格式 2 基于RTP的带宽控制方法 1.接收端的控制策略 2.发送端的控制策略    RTP(Real-timeTransportProtocol)是由IETF开发的实时传输 ...

  9. RTP协议详解(荷载H264)

    目录 RTP的会话过程 RTP实际应用中的细节 用户网络带宽不同 用户是否被防火墙隔离 RTP结构解析 解析举例 RTP荷载H264码流 单个NAL单元包 分片单元(FU-A) 解析举例 RTP的会话 ...

最新文章

  1. CentOS中Mysql常用操作
  2. JAVA之门面模式概述
  3. python判断集合为空
  4. kamctl start
  5. php仿tp5实现模型,php手记之05-tp5模型操作数据库
  6. linux系统主机信任,Linux信任主机(SSH)
  7. matlab parfor不能用,matlab中parfor函数
  8. Fastreport.Net用户手册:报表对象
  9. 《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问
  10. html显示pcd,PCD5043 Datasheet(数据表) 10 Page - NXP Semiconductors
  11. MyBatis学习总结(25)——Mybatis Generator generatorConfig.xml配置文件详细说明
  12. linux查询rpm包详细信息
  13. 一款熊猫游戏java_狂热的熊猫_JAVA游戏免费版下载_7723手机游戏[www.7723.cn]
  14. 阿里云办公安全产品专家高传贵:零信任,让全球办公安全更简单
  15. 【EXLIBRIS】随笔记 002
  16. FRM 5.3业绩衡量比率
  17. vue脚手架结构目录文件
  18. excel怎么不显示图表上显示为0%的项?
  19. MySQL的基本用法
  20. 【flutter 起步走】Flutter 布局解决消消乐,谁说只会写写布局不能做游戏?

热门文章

  1. 自动驾驶算法-滤波器系列(四)——不同运动模型在KF/EKF中的应用
  2. (二十六)深度学习目标检测:Fast-RCNN
  3. 主机连接wifi,如何设置虚拟机上网方式
  4. python安装jupyterlab_JupyterLab的安装及使用
  5. kafka为什么用java重写,kafka怎么发布订阅 怎么在java中实现
  6. 威联通_万兆加持!威联通QNAP TS-932X,首次入手威联通NAS简单体验
  7. html中rem和em,CSS 中的 rem 和 em 的区别(1)
  8. 网页运行python脚本_python脚本和网页有何区别
  9. 什么作用计算机辅助工艺,什么是CAPP技术(计算机辅助工艺过程设计)
  10. Java Scheduler ScheduledExecutorService ScheduledThreadPoolExecutor示例