hibernate 兼容oracle mysql_采用Hibernate框架的研发平台如何能够真正兼容Oracle和sqlServer...

本文记录了使用Hibernate框架时,如何进行Oracle到SqlServer的数据库迁移及平台底层代码改造的过程。涉及数据库层面的迁移,包括数据导入、自定义函数创建,以及平台代码改造,如更改数据库配置、修正DML语法、主键策略调整和DAO层SQL处理,以实现对不同数据库的兼容。
摘要由CSDN通过智能技术生成

都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的容易,是相对的。 想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用了Hibernate框架就能实现的。 下面记录一下我做这件事情

都说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)returnsnumericas

begin

return convert(numeric,@param1)end

二、平台底层代码的改造

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

com.microsoft.sqlservergroupId>

sqljdbc4artifactId>

4.0version>

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数据库。

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

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值