jDialects(https://git.oschina.net/drinkjava2/jdialects) 是一个收集了大多数已知数据库方言的Java小项目,通常可用来创建分页SQL和建表DDL语句,可根据不同的数据库方言生成不同的SQL。目前 jDialects支持75种数据库方言,包括Hibernate中没有的SQLLite和Access等。jDialects需要 Java7或以上版本支持。


jDialects起初是为了jSqlBox项目而开发的,但它本身是一个独立的项目(发布包只有90k大小且无其它第三方依赖),只要用到了
SQL,就可以利用它来创建对应数据库的分页SQL和DDL。例如使用了纯JDBC、JdbcTemplate、DbUtils等以操作原生SQL为基础
的持久层工具,并有跨数据库需求的场合(例如单元测试需要同时在H2内存数据库和实际数据库Oracle上跑),就可以利用这个工具来实现跨数据库的分
页。 或者,你象我一样,正在开发一个支持多种数据库的持久层工具,也可以考虑利用到jDialects。



jDialects项目的主体部分是由代码生成工具从Hibernate5.2.9版本中抽取而自动生成,这从一定程度上也保证了它的代码质量。代码生成工具见jDiagen(https://github.com/drinkjava2/jDiagen)项目。



如何在项目中引入jDialects?

下载 "jdialects-1.0.1.jar"并放入项目库目录,或在项目的pom.xml文件中加入:

  1. <dependency>
  2. <groupId>com.github.drinkjava2</groupId>
  3. <artifactId>jdialects</artifactId>
  4. <version>1.0.1</version>
  5. </dependency>

在程序中使用

1) 创建跨数据库的分页:

       Dialect d=Dialect.guessDialect(dataSource);  //根据数据源判断方言类型, 

       //Dialect d=Dialect.guessDialect(connection);  //或根据连接来判断方言类型 

       //Dialect d=Dialect.MySQL5Dialect;     //或手工指定数据库方言类型

       String result=d.paginate(3, 10, "select * from users where id=?");  //创建分页SQL 



   当方言为MySQL5Dialect, 结果为: "select * from users where id=? limit 20, 10" 

   当方言为Oracle8iDialect, 结果为: "select * from ( select row_.*, rownum
rownum_ from ( select * from users where id=? ) row_ ) where rownum_
<= 30 and rownum_ > 20" 

   当方言为Oracle12cDialect, 结果为: "select * from users where id=? offset 20 rows fetch next 10 rows only" 

   当方言为Sybase11Dialect, 抛出DialectExcepiton异常并提示: "Sybase11Dialect" does not support physical pagination 

   ...



2) 创建跨数据库的DDL:

  1. private static String ddlSQL(Dialect d) {
  2. return "create table " + d.check("BufferPool") + "("//
  3. + d.BIGINT("f1") //
  4. + ", " + d.BIT("f2", 5) //
  5. + ", " + d.BLOB("f3") //
  6. + ", " + d.BOOLEAN("f4") //
  7. + ", " + d.INTEGER("f5") //
  8. + ", " + d.VARCHAR("f6", 8000) //
  9. + ", " + d.NUMERIC("ACCESS_LOCK", 8,2) //
  10. + ")" + d.engine(" DEFAULT CHARSET=utf8");
  11. }
  12. public static void main(String[] args) {//运行在不同方言上
  13. System.out.println(ddlSQL(Dialect.MySQL57InnoDBDialect));
  14. System.out.println(ddlSQL(Dialect.SQLServer2012Dialect));
  15. System.out.println(ddlSQL(Dialect.Oracle10gDialect));
  16. }

本示例运行结果为:

   create table BufferPool(f1 bigint, f2 bit, f3 longblob, f4 bit,
f5 integer, f6 varchar(8000), ACCESS_LOCK decimal(8,2))engine=innoDB
DEFAULT CHARSET=utf8

   create table BufferPool(f1 bigint, f2 bit, f3 varbinary(MAX), f4 bit, f5 int, f6 varchar(MAX), ACCESS_LOCK numeric(8,2))

   create table BufferPool(f1 number(19,0), f2 number(1,0), f3 blob,
f4 number(1,0), f5 number(10,0), f6 long, ACCESS_LOCK number(8,2))



示例在运行时会有日志警告输出:
"BufferPool"和"ACCESS_LOCK"分别是DB2和Teradata的保留字,这意味着如果运行在DB2Dialect或
TeradataDialect数据库上将会有DialectException例外抛出。为保证可移植性,最好将有警告提示的字段改为其它名称。

如果想要跳过保留字检查(不推荐),也可按以下格式来书写DDL:

  1. ddl= "create table BufferPool("//
  2. + "f1 "+d.BIGINT() //
  3. + ",f2 " + d.BIT(5) //
  4. + ",f3 " + d.BLOB() //
  5. + ",f4 " + d.BOOLEAN() //
  6. + ",f5 " + d.INTEGER() //
  7. + ",f6 " + d.VARCHAR(8000) //
  8. + ",ACCESS_LOCK " + d.NUMERIC(8,2) //
  9. + ")" + d.engine();

jDialects支持的所有类型定义如下:

BOOLEAN

DOUBLE

FLOAT

INTEGER

LONG(=BIGINT)

SHORT(=SMALLINT)

BIGDECIMAL(=NUMERIC)

STRING(=VARCHAR)

DATE

TIME

TIMESTAMP

BIGINT

BINARY

BIT

BLOB

CHAR

CLOB

DECIMAL

LONGNVARCHAR

LONGVARBINARY

LONGVARCHAR

NCHAR

NCLOB

NUMERIC

NVARCHAR

REAL

SMALLINT

TINYINT

VARBINARY

VARCHAR



3) 关于SQL函数

jDialects暂不支持跨数据库的SQL函数,主要是因为SQL函数在不同的数据库里往往有两种情况,一种是命名和参数完全相同,一种是变化
非常大,
很多是专有函数,无论前者还是后者,都不太适合用通用的SQL函数来代表。针对这一点,jDialects代码生成工具将75种方言的函数对比写在
“DatabaseDialects.xls”这个文件中(还包含了各种方言的分页和类型定义),如果需要作数据库移植时可以作为速查手册。



以上即为jDialects全部文档,如有不清楚处可以查看项目源码及单元测试。最后强调一下,jDialects只是个文本变换工具,根据不同的方言对SQL进行不同的变换,它本身不是一个完整的持久化工具,必须配合其它持久化工具如JDBC/DbUtils等使用。



附录 - 以下为目前jDialects支持的75种数据库方言:

AccessDialect

Cache71Dialect

CobolDialect

CUBRIDDialect

DataDirectOracle9Dialect

DB2390Dialect

DB2400Dialect

DB2Dialect

DbfDialect

DerbyDialect

DerbyTenFiveDialect

DerbyTenSevenDialect

DerbyTenSixDialect

ExcelDialect

FirebirdDialect

FrontBaseDialect

H2Dialect

HANAColumnStoreDialect

HANARowStoreDialect

HSQLDialect

Informix10Dialect

InformixDialect

Ingres10Dialect

Ingres9Dialect

IngresDialect

InterbaseDialect

JDataStoreDialect

MariaDB53Dialect

MariaDBDialect

MckoiDialect

MimerSQLDialect

MySQL55Dialect

MySQL57Dialect

MySQL57InnoDBDialect

MySQL5Dialect

MySQL5InnoDBDialect

MySQLDialect

MySQLInnoDBDialect

MySQLMyISAMDialect

Oracle10gDialect

Oracle12cDialect

Oracle8iDialect

Oracle9Dialect

Oracle9iDialect

OracleDialect

ParadoxDialect

PointbaseDialect

PostgresPlusDialect

PostgreSQL81Dialect

PostgreSQL82Dialect

PostgreSQL91Dialect

PostgreSQL92Dialect

PostgreSQL93Dialect

PostgreSQL94Dialect

PostgreSQL95Dialect

PostgreSQL9Dialect

PostgreSQLDialect

ProgressDialect

RDMSOS2200Dialect

SAPDBDialect

SQLiteDialect

SQLServer2005Dialect

SQLServer2008Dialect

SQLServer2012Dialect

SQLServerDialect

Sybase11Dialect

SybaseAnywhereDialect

SybaseASE157Dialect

SybaseASE15Dialect

SybaseDialect

Teradata14Dialect

TeradataDialect

TextDialect

TimesTenDialect

XMLDialect

jDialects:一个从Hibernate抽取的支持70多种数据库方言的原生SQL分页工具的更多相关文章

  1. 5 -- Hibernate的基本用法 --4 4 数据库方言

    Hibernate底层依然使用SQL语句来执行数据库操作,虽然所有关系数据库都支持使用标准SQL语句,但所有数据库都对标准SQL进行了一些扩展,所以在语法细节上存在一些差异.因此,Hibernate需 ...

  2. Hibernate使用原生SQL语句进行无关联多表查询

    背景:有两个表:CpCg与CpGg需要进行多表查询 因为CpGg表设计到与另外的表也有联系,因此师兄没有关联此两个表,只是用字段进行逻辑关联,CpGg表的cp字段与CpCg表的id字段逻辑关联

  3. Gora是一个类似Hibernate的ORM框架

    Gora是一个类似Hibernate的ORM框架,但是不只是支持关系数据库,更重要支持NoSQL之类大数据的存储. 支持NoSQL之类大数据的存储 Apache Gora是一个开源的ORM(Objec ...

  4. 一个国外网盘pCloud——支持离线下载

    给大家分享一个国外网盘<支持离线下载> https://my.pcloud.com/#page=register&invite=HiegZ8aBrt7

  5. polaris: 一个用go实现的支持restful的web框架

    介绍 polaris是一个用go实现的支持restful的web框架,主要参考tornado进行设计. 虽然在go里面搭建一个http server非常的简单,这里强烈推荐gorilla,但并没有很好 ...

  6. 一个简单的Web服务器-支持Servlet请求

    上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servle ...

  7. java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 使用过程 和servlet差不多

    java nio 写一个完整的http服务器  支持文件上传   chunk传输    gzip 压缩      也仿照着 netty处理了NIO的空轮询BUG        本项目并不复杂 代码不多 ...

  8. KTL 一个支持C++14编辑公式的K线技术工具平台 - 第五版,支持sqlite3,全新sqlite3zz语法超简单使用sqlite3; 添加方差等统计函数。

    K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...

  9. Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持

    在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适 ...

随机推荐

  1. ionic的安装

    一.学习一样新的框架的步骤: 1.先找到人家的网站, 一个个点过来看看 2.我们前端的框架,分css与js 3.先学css 再学js 4.要学会复制黏贴代码, 实际演练代码的效果 二.ionic环境安 ...

  2. 使用Three.js网页引擎创建酷炫的3D效果的标签墙

    使用Three.js引擎(这是开源的webgl三维引擎,gitgub)进行一个简单应用. 做一个酷炫的3d效果的标签墙(已经放在我的博客首页,大屏幕可见), 去我的博客首页看看实际效果 www.son ...

  3. Codevs2776 寻找代表元

    2776 寻找代表元 时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold    题目描述 Description 广州二中苏元实验学校一共有n个社团,分别用1到n编号 ...

  4. 网络AFNetworking 3.1

    下面的类已从AFNetworking 3.0中废弃: AFURLConnectionOperation AFHTTPRequestOperation AFHTTPRequestOperationMan ...

  5. SEO-站外优化规范

    站外优化规范 新站 前期(提高网站曝光率<信息发布平台>) 一. 分类目录信息发布 二. 黄页网信息发布 三. 友链平台信息发布 四. 各大论坛引蜘蛛区信息发布 五. 网址提交 六. 社区 ...

  6. Unity中溶解shader的总结

    在实际的游戏工程中,经常美术和策划会提出溶解的表现要求.比如子弹在飞行的时候,弹道不断的消融:角色受到大型炮弹的攻击,在击飞的时候不断的消融等等诸如此类的表现.一般的消融都是结合粒子系统来实现,通过给 ...

  7. yii2.0使用之缓存

    1.片段缓存(针对于视图中的某部分进行缓存): <?php 设置有效时间 $time=15; 缓存依赖,存入文件.当文件内容发生改变是才会刷新新内容 $dependecy=[ 'class'=& ...

  8. lsusb命令

    运行 yum install libusb usbutils

  9. 一个基于php+mysql的外卖订餐网站(带源码)

    订饭组 一个基于php+mysql的外卖订餐网站,包括前端和后台.源码地址 源码演示地址:http://dingfanzu.com 商家后台系统:http://dingfanzu.com/admin ...

  10. 学习Jammendo代码的心路历程(二)ViewFlipper数据的填充

    打开Jammendo进入到首页之后,会看到这样一个界面.可以看到下左效果,我们可以看到,他是上部分的ViewFlipper模块和下半部分的listview模块构成的,今天就简单的说一下Jammendo ...