文档章节

详解在Hibernate中配置数据库方言的作用和好处以及各种数据库的方言连接

思维80
 思维80
发布于 2015/05/24 15:10
字数 1357
阅读 32
收藏 0

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

举例来说,我们在MySQL数据库里进行分页查询,只需使用limit关键字就可以了;而标准SQL并不支持limit关键字,例如Oracle则需要使用行内视图的方式来进行分页。同样的应用程序,当我们在不同数据库之间迁移时,底层数据库的访问细节会发生改变,而Hibernate也为这种改变做好了准备,现在我们需要做的是:告诉Hibernate应用程序的底层即将使用哪种数据库——这就是数据库方言。

一旦我们为Hibernate设置了合适的数据库方言,Hibernate将可以自动应付底层数据库访问所存在的细节差异。

不同数据库所应使用的方言如表5.1所示。

表 不同数据库及其对应方言

关系数据库

方 言

DB2

org.hibernate.dialect.DB2Dialect

DB2 AS/400

org.hibernate.dialect.DB2400Dialect

DB2 OS390

org.hibernate.dialect.DB2390Dialect

PostgreSQL

org.hibernate.dialect.PostgreSQLDialect

MySQL

org.hibernate.dialect.MySQLDialect

MySQL with InnoDB

org.hibernate.dialect.MySQLInnoDBDialect

MySQL with MyISAM

org.hibernate.dialect.MySQLMyISAMDialect

Oracle(any version)

org.hibernate.dialect.OracleDialect

Oracle 9i

org.hibernate.dialect.Oracle9iDialect

Oracle 10g

org.hibernate.dialect.Oracle10gDialect


 

Sybase

org.hibernate.dialect.SybaseDialect

Sybase Anywhere

org.hibernate.dialect.SybaseAnywhereDialect

Microsoft SQL Server

org.hibernate.dialect.SQLServerDialect

SAP DB

org.hibernate.dialect.SAPDBDialect

Informix

org.hibernate.dialect.InformixDialect

HypersonicSQL

org.hibernate.dialect.HSQLDialect

Ingres

org.hibernate.dialect.IngresDialect

Progress

org.hibernate.dialect.ProgressDialect

Mckoi SQL

org.hibernate.dialect.MckoiDialect

Interbase

org.hibernate.dialect.InterbaseDialect

Pointbase

org.hibernate.dialect.PointbaseDialect

FrontBase

org.hibernate.dialect.FrontbaseDialect

Firebird

org.hibernate.dialect.FirebirdDialect

如果一个 系统 可能运行于多种数据库,或者同时使用多种数据库,那么,使用Hibernate将会给你带来很多的方便,想信很多接触Hibernate的人都会体会到。Hibernate底层是通过dialect包来对各种数据库的差异进行抽象的。Dialect类中实现每种数据库相同的东西,而不同数据库对应会有该类的一个扩展实现,最终通过DialectFactory来决定创建哪一个类。通常我们都会指定hibernate.dialect属性,那直接创建该属性对应的类。如果我们没有指定该属性,那么由Hibernate自己决定选择合适的方言。在DialectFactory中初始化各种数据库对应的方言的Map,以数据库产品名为key,以方言的包装对象为value。Hibernate自动选择方言时,会通过JDBC的DatabaseMetadata取得数据库的产品名称,根据名称取得对应的方言。DialectFactory中对该Map的初始化的部分代码如下:
  1. // TODO : this is the stuff it'd be nice to move to a properties file or some other easily user-editable place
  2. private static final Map MAPPERS = new HashMap();
  3. static {
  4. // detectors...
  5. MAPPERS.put( "HSQL Database Engine", new VersionInsensitiveMapper( "org.hibernate.dialect.HSQLDialect" ) );
  6. MAPPERS.put( "H2", new VersionInsensitiveMapper( "org.hibernate.dialect.H2Dialect" ) );
  7. MAPPERS.put( "MySQL", new VersionInsensitiveMapper( "org.hibernate.dialect.MySQLDialect" ) );
  8. MAPPERS.put( "PostgreSQL", new VersionInsensitiveMapper( "org.hibernate.dialect.PostgreSQLDialect" ) );
  9. MAPPERS.put( "Apache Derby", new VersionInsensitiveMapper( "org.hibernate.dialect.DerbyDialect" ) );
  10. <SPAN>...</SPAN> 原本上,这种自动选择的方式,会给我们带来方便,只可惜,从以上的代码的注释中可以知道,目前这一部分的初始化是通过硬编码的,只有在以后的版本才会移动到配置文件或其他容易用户编译的地方,否则,我们可以非常容易的添加我们的配置供Hibernate进行自动选择。而经常我们所使用的数据库驱动程序所取到的数据库产品名称会跟以上硬编码的不同,所以最终我们还是得自己配置数据库方言。

    由于我们的系统中用到了好几个数据源,经常也是对应不同类型的数据库,并且数据源都是由容器提供的,在首次部署时经常因为数据库类型变了而忘了修改对应的数据库方言,而出了问题,这给实施人员带来了很多的不便。不过目前除了对各种数据库提供与以上硬编码相同的数据库产品名称的驱动程序外,我们就只能自己动手了

  11. Hibernate对各数据库的连接方言

  12. <session-factory>
    <property name="connection.driver_class">net.sourceforge.jtds.JDBC.Driver</property>
    <property name="connection.url">jdbc:jtds:sqlserver://ALEX:1134/News</property>
    <!--for Oracle 9
    <property name="dialect">org.Hibernate.dialect.Oracle9Dialect</property>
    -->
    <!--for MySQL
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    -->
    <!--for Ms SQL Server-->
    <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="connection.username">sa</property>
    <property name="connection.password">sa</property>
    <property name="show_sql">true</property>
    </session-factory>
    
    ?
    
    
    <!--MySql 驱动程序 eg. mysql-connector-java-5.0.4-bin.jar-->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    
    <!-- JDBC URL -->
    <property name="connection.url">jdbc:mysql://localhost/dbname?characterEncoding=gb2312</property>
    
    <!-- 数据库用户名-->
    <property name="connection.username">root</property>
    
    <!-- 数据库密码-->
    <property name="connection.password">root</property>
    
    
    <!--Sql Server 驱动程序 eg. jtds-1.2.jar-->
    <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
    
    <!-- JDBC URL -->
    <property name="connection.url">jdbc:jtds:sqlserver://localhost:1433;DatabaseName=dbname</property>
    
    <!-- 数据库用户名-->
    <property name="connection.username">sa</property>
    
    <!-- 数据库密码-->
    <property name="connection.password"></property>
    
    
    
    <!--Oracle 驱动程序 ojdbc14.jar-->
    <property name="dialect">org.hibernate.dialect.OracleDialect</property>
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    
    <!-- JDBC URL -->
    <property name="connection.url">jdbc:oracle:thin:@localhost:1521:dbname</property>
    
    <!-- 数据库用户名-->
    <property name="connection.username">test</property>
    
    <!-- 数据库密码-->
    <property name="connection.password">test</property>
    
    
    
    如果出现如下错误,则可能是Hibernate SQL方言 (hibernate.dialect)设置不正确。
    Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'last_insert_id' 不是可以识别的 函数名。
    
    ?
    
    
    RDBMS 方言 
    DB2 org.hibernate.dialect.DB2Dialect 
    DB2 AS/400 org.hibernate.dialect.DB2400Dialect 
    DB2 OS390 org.hibernate.dialect.DB2390Dialect 
    PostgreSQL org.hibernate.dialect.PostgreSQLDialect 
    MySQL org.hibernate.dialect.MySQLDialect 
    MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect 
    MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect 
    Oracle (any version) org.hibernate.dialect.OracleDialect 
    Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect 
    Sybase org.hibernate.dialect.SybaseDialect 
    Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect 
    Microsoft SQL Server org.hibernate.dialect.SQLServerDialect 
    SAP DB org.hibernate.dialect.SAPDBDialect 
    Informix org.hibernate.dialect.InformixDialect 
    HypersonicSQL org.hibernate.dialect.HSQLDialect 
    Ingres org.hibernate.dialect.IngresDialect 
    Progress org.hibernate.dialect.ProgressDialect 
    Mckoi SQL org.hibernate.dialect.MckoiDialect 
    Interbase org.hibernate.dialect.InterbaseDialect 
    Pointbase org.hibernate.dialect.PointbaseDialect 
    FrontBase org.hibernate.dialect.FrontbaseDialect 
    Firebird org.hibernate.dialect.FirebirdDialect

本文转载自:http://blog.csdn.net/u012151556/article/details/45775339

思维80
粉丝 8
博文 111
码字总数 42366
作品 0
西安
程序员
私信 提问
Hibernate5.x Eclipse搭建

今天写一个简单的hibernate框架搭建流程 首先准备好我们的jar包,这里附上一个jar包链接 hibernate下载 下载完jar后新建一个简单的java工程,结构如下 接下来编写我们的hibernate的配置文件 ...

gabriel丶
2018/03/07
0
0
当Grails GORM遇上PostGIS

由于近期项目性质的缘故,我们用到了PostGIS。又因为我们后端用到的工具比较特殊且在国内相对少见,故有必要写一下。 先说说我们的工具: grails grails postgresql extensions插件 知道Gra...

胡键
2018/12/14
0
0
Hibernate properties详解

Hibernate properties Hibernate配置属性 属性名 用途 hibernate.dialect ;一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 full.classname.of.Dialect hi...

7788
2014/04/02
123
0
Hibernate与各数据库连接配置

Hibernate的使用,方便了持久层的封装,通过配置文件的修改,就可以跟不同的数据库进行连接,十分方便,下面我将网络上各种数据库连接的配置信息整理,便于后期的使用。 RDBMS 方言 DB2 org....

YuanyuanL
2015/08/03
70
0
利用Hibernate Tools生成与数据库表对应的带注解实体类

主要分三个阶段。1.连接数据源;2.创建Hibernate配置文件;3.生成实体类。 一、连接数据源 1.在Eclipse的菜单栏,选择"Window"->"Show View"->"Other"->"Date Source Exploer"-"OK",将会显示......

巨轮
2016/01/15
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
4
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
8
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
901
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部