采用Hibernate框架的研发平台如何能够真正兼容Oracle和sqlServer数据库

  都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的“容易”,是相对的。

  想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用了Hibernate框架就能实现的。

  下面记录一下我做这件事情的过程和一些感悟。

  当我接到该任务时,我先大致的理了一下思路:

  要完成迁移,总体上有2大块工作要做,分别是:数据库层面的迁移  和  平台底层代码的改造

  一、数据库层面的迁移过程:

  1、通过sqlServer Studio2008 工具将数据从Oracle导入到SqlServer数据库

  从SSMS2008开始才支持此功能,具体操作步骤(右键点击数据库-选择导入-点下一步-选择 Oracle Provider for OLE DB 数据源-点击属性-填写数据源,格式为 IP:端口/实例名),后面的步骤根据向导一步步的操作即可。需要注意的是在 选择源表和源视图的步骤中:

  (1)、要把【目标】列中的默认前缀去掉,这样导入的表才会默认关联到dbo下,否则你每次查询表都要带上schema前缀,导致你之前的应用程序中的sql无法执行,因为你之前写的那些sql肯定不会带这种前缀。

  (2)、先勾选你要导入的源,然后双击每一行记录,在弹出的对话框中检查是否所有的类型都正确绑定好了,我在检查的时候就遇到了oracle中是varchar2类型的,在该对话框显示的表结构中变成了130,只能手动的去将所有130改成varchar类型(sqlserver里没有varchar2类型)。还有原来是clob类型的,现在变成了varchar,要手动改成text类型(因为clob类型的字段比较少,所以可以通过在oracle中执行“select * from user_tab_columns c where c.data_type=‘CLOB‘;”来查看哪些表中用到了CLOB类型的字段)。

  2、增加to_date、to_char、to_number、concat等常用的函数

说明:我在编写to_date函数的时候,只提供了一种格式“yyyy-mm-dd HH:mi:ss”,这是因为在sqlserver中是没有和to_date函数的类似的函数的,只能使用convert函数实现,但是convert函数不支持传入格式化字符串,只能传入格式字符对应的整型数字,而120对应的正是之前提到的“yyyy-mm-dd HH:mi:ss”格式;另外此次是迁移到Sqlserver2005,该版本是没有内嵌concat函数的,根据官方文档的说法,是从sqlServer2012开始才有concat函数的,所以这里我要自己编写一个concat函数。

------------------------------------------------------------------concat函数
USE [skyplatform]
GO
/****** Object:  UserDefinedFunction [dbo].[concat]    Script Date: 03/10/2015 17:11:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[concat]
(
@param1 varchar(500),
@param2 varchar(500)
)
returns varchar(1000)
as
begin
DECLARE @returntext varchar(1000)
    if (@param1 is null)
    SELECT @returntext= @param2;
    else if (@param2 is null)
     SELECT @returntext= @param1;
    else
     SELECT @returntext= @param1 + @param2;
   return @returntext;
end

--------------------------------------------------------------------to_char函数
USE [skyplatform]
GO
/****** Object:  UserDefinedFunction [dbo].[to_char]    Script Date: 03/10/2015 17:12:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[to_char]
(
@param1 datetime,
@param2 varchar(20)
)
returns varchar(20)
as
begin

return convert(varchar(20),@param1,120)

end

--------------------------------------------------------------------to_date函数
USE [skyplatform]
GO
/****** Object:  UserDefinedFunction [dbo].[to_date]    Script Date: 03/10/2015 17:12:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[to_date]
(
@param1 varchar(20),
@param2 varchar(20)
)
returns datetime
as
begin

return convert(datetime,@param1,120)--120 means that yyyy-mm-dd hh:mi:ss(24h)

end
--------------------------------------------------------------------to_number函数
USE [skyplatform]
GO
/****** Object:  UserDefinedFunction [dbo].[to_number]    Script Date: 03/10/2015 17:13:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[to_number]
(
@param1 varchar
)
returns numeric
as
begin

return convert(numeric,@param1)

end

  二、平台底层代码的改造

  1、引入SqlServer的jar包:sqljdbc4-4.0.jar

<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>

  2、修改db.properties中关于数据库连接信息的配置

jdbc.dialect=org.hibernate.dialect.SQLServerDialect
jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.url=jdbc:sqlserver://xx.xx.xx.xx:1433;DatabaseName=xxx
jdbc.default_schema=dbo
jdbc.username=xxx
jdbc.password=xxx

  3、修改平台中使用的一些非sql标准的语法

  在使用delete insert update这些dml语句的时候,切记不要使用别名,因为在oracle和sqlserver中,这些dml语句使用别名的语法是不一样的。

  4、各实体类主键策略的改造

  最好都使用string类型的主键,但是因为之前的代码中都用的sequence做主键策略,现在改成string类型工作量势必很大,所以决定使用table策略来兼容各种数据库。

  5、dao层对sql的处理

  由于sqlserver中调用自定义标量值函数,必须在函数名前加上dbo.的前缀,但是这样写势必会导致不能兼容其它的关系型数据库,所以只能从dao实现层,对sql进行统一的处理,处理规则就是:如果当前数据库是sqlserver,并且sql中出现了concat、to_date、to_char、to_number等函数,就为这些函数名加上dbo.的前缀。

  以上做完,基本就可以让平台在sqlserver数据库上跑了,同时也可以通过改配置文件切换到Oracle数据库。

  以上的做法可能并不是最优的方式,如果有更好的方案,希望各位大牛能给予指点。

时间: 2024-11-08 10:18:00

采用Hibernate框架的研发平台如何能够真正兼容Oracle和sqlServer数据库的相关文章

SNF平台从sql server兼容oracle的处理方式和开发方式

前几天有这样一个需求,就是让SNF平台BS版的基础程序全面支持Oracle数据库. 初一看这是一个很大的工程,因为大家都知道 Sql和Oracle的语法有很多的不一样,如 top .日期获取.类型之间.特殊的关键字如sqlserver中会用到 dbo..[]号都不行.自动增长.分页查询等.所以要兼容在设计时就应该做处理. 那在SNF快速开发平台设计时就考虑了这个问题,所以我们花了3天的时间从没有Oracle数据库 现搭环境,现创建表空间.现创建表结构导数据,创建序列,甚至把原来用的C#连接ora

Hibernate框架基础

Hibernate框架基础 Hibernate框架 ORM概念 O, Object 对象 R, Realtion 关系 (关系型数据库: MySQL, Oracle-) M,Mapping 映射 ORM, 对象关系映射! ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象? 想做到上面2点,必须要有映射! 总结: Hibernate与ORM的关系? Hibernate是ORM的实现! Hibernate HelloWorld案例 搭建一个H

8、Hibernate框架(ORM详解、主文件配置、映射文件配置)

开发回顾: SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate, 基于持久层的框架(数据访问层使用)! Spring, 创建对象处理对象的依赖关系以及框架整合! Dao代码,如何编写? - 操作XML数据 - 使用Jdbc技术 原始的jdbc操作, Connection/Statement/ResultSet 自定义一个持久层框架, 封装了dao的通用方法 DbUtils组件, 轻量级的dao的组件: Hibernate技术 [hibernate最终执行的也是

SSH框架第一天——hibernate框架

什么是框架? 是软件的半成品,它已经完成了部分功能. 什么是hibernate? hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. (简单的说,hibernate框架通过映射(xml配置文件)来关联javabean和数据库,程序员可以操作对象来操作数据库了.) 三大框架在javaweb中的位置: Hibernate在开发中的位置: 注      意:hibernate的底层依然还

一步步学习Hibernate框架(四):采用jpa实现一对多关联映射(二)

上篇博客已经采用jpa注解来实现了一对多关联映射,将这种关联映射以外键的形式处理,现在来看看怎么以第三张表的形式处理.采用jpa注解来映射数据库要使用的jar包见上篇博客: 一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一) 现在看第二种方式:以第三张表的关系来体现 Group.java package com.tgb.zhudan; import java.util.List; import javax.persistence.CascadeType; import j

Hibernate框架(一)——总体介绍

作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编写重复的JDBC代码,不再反复的测试我们的SQL语句写的如何.这里这需要我们简单配置,调用框架给我们提供的方法,就可以完成对数据增删改查的,那么Hibernate到底是个什么样的框架呢?如何使用呢?先看一个关于Hibernate框架的知识体系图:  这篇博客,我们来总结一下,Hibernate宏观的认识和,

Hibernate框架简介(二)基本使用增、删、改、查

一.Hibernate框架简介 Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具 1.1.理解持久化 瞬时状态:在程序运行的时候,有些程序数据是保存在内存中,当程序退出后,这些数据就不复存在了,所以称这些数据的状态为瞬时状态 持久状态:在使用一此软件的时候,有些数据,在程序退出后,还以文件等形式保存在硬盘或者数据库中,称这些数据的状态是持久状态 持久化:持久化就是将程序中的数据在瞬时状态和持久状态之间

hibernate框架总结

hibernate的pom.xml专门用于存放各种jar包下面是简单的几种 <dependencies>     <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-core</artifactId>           <version>4.2.21.Final</version> 

Hibernate框架

SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate,    基于持久层的框架(数据访问层使用)! Spring,   创建对象处理对象的依赖关系以及框架整合! Dao代码,如何编写? 1.操作XML数据 2 使用Jdbc技术 原始的jdbc操作, Connection/Statement/ResultSet 自定义一个持久层框架, 封装了dao的通用方法 DbUtils组件, 轻量级的dao的组件: Hibernate技术  [hibernate最终执行的也是