`
drinkjava2
  • 浏览: 41886 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

阅读更多
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内存数据库和实际数据库MySql上跑),就可以利用这个工具来实现跨数据库的分页。 或者,你象我一样,正在开发一个支持多种数据库的持久层工具,也可以考虑利用上jDialects。

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

如何在项目中引入jDialects?
下载 "jdialects-1.0.1.jar"并放入项目库目录,或在项目的pom.xml文件中加入:
    <dependency>  
        <groupId>com.github.drinkjava2</groupId>  
        <artifactId>jdialects</artifactId>  
        <version>1.0.1</version>  
    </dependency>

在程序中使用
1) 创建跨数据库的分页:
       Dialect d=guessDialect(dataSource);  //根据数据源判断方言类型, 
       //Dialect d=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:
    private static String ddlSQL(Dialect d) {
        return "create table " + d.check("BufferPool") + "("//
                + d.BIGINT("f1") //
                + ", " + d.BIT("f2", 5) //
                + ", " + d.BLOB("f3") //
                + ", " + d.BOOLEAN("f4") //
                + ", " + d.INTEGER("f5") //
                + ", " + d.VARCHAR("f6", 8000) //
                + ", " + d.NUMERIC("ACCESS_LOCK", 8,2) // 
                + ")" + d.engine(" DEFAULT CHARSET=utf8");
    }
    public static void main(String[] args) {//运行在不同方言上
        System.out.println(ddlSQL(Dialect.MySQL57InnoDBDialect));
        System.out.println(ddlSQL(Dialect.SQLServer2012Dialect));
        System.out.println(ddlSQL(Dialect.Oracle10gDialect));   
    } 


本示例运行结果为:
   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:
       ddl= "create table BufferPool("//
                + "f1 "+d.BIGINT() //
                + ",f2 " + d.BIT(5) //
                + ",f3 " + d.BLOB() //
                + ",f4 " + d.BOOLEAN() //
                + ",f5 " + d.INTEGER() //
                + ",f6 " + d.VARCHAR(8000) //
                + ",ACCESS_LOCK " + d.NUMERIC(8,2) // 
                + ")" + 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
分享到:
评论

相关推荐

    hibernate中所有数据库方言

    在探讨Hibernate中所有数据库方言之前,我们先简要回顾一下Hibernate框架本身。Hibernate是一个开源的对象关系映射(ORM)框架,用于Java应用与各种关系型数据库进行交互。它提供了强大的功能,如对象持久化、查询...

    Hibernate不同数据库的连接及SQL方言

    下面是Hibernate支持的不同数据库的SQL方言: * DB2:org.hibernate.dialect.DB2Dialect * DB2 AS/400:org.hibernate.dialect.DB2400Dialect * DB2 OS390:org.hibernate.dialect.DB2390Dialect * PostgreSQL:org...

    hibernate执行原生sql语句

    Hibernate 提供了多种方式来执行原生 SQL 语句,其中之一是使用 `Session.createSQLQuery()` 方法,该方法返回一个 `SQLQuery` 对象,该对象提供了执行原生 SQL 语句的方法。 例如,我们可以使用以下代码来执行一个...

    jdialects一个通用数据库方言工具

    jDialects支持多达80多种数据库方言的DDL创建、实体源码生成、分页、函数变换、类型变换及主要的JPA注解解析功能。它通常与JDBC工具组合使用,也可以作为其它Dao工具(如jSqlBox)的一个组成部分。

    hibernate 执行原生sql的几种方式

    在Java的持久化框架Hibernate中,执行原生SQL(Native SQL)是常见需求,尤其是在处理特定数据库特性或者优化性能时。本篇文章将详细介绍在Hibernate中执行原生SQL的几种方式,以及它们各自的适用场景和优缺点。 1....

    达梦数据库hibernate方言包

    达梦数据库各版本的hibernate方言包,包含版本 DmDialect-for-hibernate2.0、DmDialect-for-hibernate2.1、DmDialect-for-hibernate3.0、DmDialect-for-hibernate3.1、DmDialect-for-hibernate3.6、DmDialect-for-...

    达梦 Hibernate 方言 2.0 至 4.0

    从2.0到4.0的版本升级,不仅代表了Hibernate框架自身的进步,也反映了达梦数据库方言在适应性、性能和功能上的不断优化。 在Hibernate 2.0至4.0的过程中,方言的改进主要体现在以下几个方面: 1. **SQL兼容性**:...

    Hibernate 分页示例 SQLServer 数据库

    一个基于Hibernate 和 SQLServer 数据库的分页示例,所有文件和数据库备份都在,只是速度不怎么快,如果加上自动生成下拉框,速度就更慢了,单表、10008条测试数据,如果哪位大侠改进了查询速度望告之:vni2007@163....

    达梦Hibernate方言2.0至4.0

    这里我们关注的是“达梦Hibernate方言2.0至4.0”,这是一个专为达梦数据库系统(DM)设计的Hibernate方言支持,涵盖了Hibernate框架的多个版本。Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发人员...

    关于Hibernate分页类和jdbc的sql分页完美融合

    在给定的"SuperHibernateEntityDao.java"文件中,可能包含了一个自定义的DAO基类,该类扩展了Hibernate的通用DAO操作,并可能实现了JDBC SQL分页的方法。这样的类通常会有一个用于执行分页查询的方法,比如`...

    达梦数据库java驱动包、hibernate方言包

    * 达梦8 hibernate方言包对应版本说明 /*************************************** jar包在dialect目录下: 1. DmDialect-for-hibernate2.0.jar 对应 Jdk1.4及以上, hibernate2.0 环境 2. DmDialect-for-hibernate2.1...

    瀚高数据库hibernate方言 hgdb-hibernate-dialect

    Hibernate是一个流行的对象关系映射(ORM)工具,它允许开发者使用面向对象的Java代码来操作数据库,而无需编写SQL语句。方言(Dialect)是Hibernate中的一个关键组件,它定义了如何与特定的数据库管理系统(DBMS)进行...

    spring+hibernate,自己封装了原生sql的处理,模仿mybatis使用

    而Hibernate则是一个对象关系映射(ORM)框架,它简化了数据库操作,允许开发者通过Java对象来操作数据库,减少了对SQL的直接使用。 标题中的"spring+hibernate"表明这是一个将两者结合使用的项目。Spring和...

    达梦数据库7.6最新的驱动包及hibernate方言包

    Hibernate是一个流行的对象关系映射(ORM)框架,它简化了Java应用对数据库的操作。在Hibernate中,方言(Dialect)是关键组件之一,它定义了特定数据库的SQL语法和特性。达梦数据库的方言包使得Hibernate能理解并...

    Hibernate中的查询:HQL、Criteria、原生SQl

    在Java世界中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层数据管理。本篇文章将深入探讨Hibernate中的三种主要查询方式:HQL(Hibernate Query ...

    数据库方言大全.txt

    ### 数据库方言大全 #### 概述 在关系型数据库管理系统(RDBMS)领域,不同的数据库产品有着各自独特的语法和特性。为了更好地理解和利用这些系统,了解它们之间的差异至关重要。本文将详细介绍几种常见的数据库...

    Hibernate 多数据库支持解决方案

    Hibernate是一个强大的Java持久化框架,它允许开发者将对象模型与关系数据库进行映射,从而简化了数据库操作。在处理多数据库支持时,Hibernate提供了一些策略和技巧来确保应用程序能够在不同类型的数据库之间灵活...

    Hibernate不同数据库的连接及SQL方言.pdf

    SQL方言是Hibernate为特定数据库系统提供的一个抽象层,它确保Hibernate生成的SQL语句能与目标数据库兼容。在配置Hibernate时,我们需要指定正确的方言类,这样Hibernate才能生成正确格式的SQL语句进行执行。例如,...

    hibernate分页查询 数据库连接

    Hibernate支持多种连接池实现,如C3P0、Apache DBCP、HikariCP等。配置连接池通常在Hibernate的配置文件(如`hibernate.cfg.xml`)中完成。 在实际开发中,为了提高性能和响应速度,还可以考虑使用缓存机制,如一级...

    达梦数据库7最新版驱动Dm7JdbcDriver18及hibernate5.0方言包

    接下来是`DmDialect-for-hibernate5.0-1.8.0_65-b17.jar`,这是为Hibernate ORM框架定制的达梦数据库方言。Hibernate是一个流行的Java持久层框架,它允许开发人员使用面向对象的方式来操作数据库,自动将Java对象...

Global site tag (gtag.js) - Google Analytics