国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

采用Hibernate框架的研發(fā)平臺如何能夠真正兼容Oracle和sqlServer數(shù)據(jù)庫

2019-11-14 23:13:45
字體:
供稿:網(wǎng)友
采用Hibernate框架的研發(fā)平臺如何能夠真正兼容Oracle和sqlServer數(shù)據(jù)庫

  都說Hibernate框架的使用可以很容易的讓你的研發(fā)平臺支持多種不同類型的數(shù)據(jù)庫,但實踐表明,這里的“容易”,是相對的。

  想讓研發(fā)平臺支持多種數(shù)據(jù)庫,并不是一件簡單的事,也可以這么說:并不是只要使用了Hibernate框架就能實現(xiàn)的。

  下面記錄一下我做這件事情的過程和一些感悟。

  當(dāng)我接到該任務(wù)時,我先大致的理了一下思路:

  要完成遷移,總體上有2大塊工作要做,分別是:數(shù)據(jù)庫層面的遷移 和 平臺底層代碼的改造

  一、數(shù)據(jù)庫層面的遷移過程:

  1、通過sqlServer Studio2008 工具將數(shù)據(jù)從Oracle導(dǎo)入到SqlServer數(shù)據(jù)庫

  從SSMS2008開始才支持此功能,具體操作步驟(右鍵點擊數(shù)據(jù)庫-選擇導(dǎo)入-點下一步-選擇 Oracle PRovider for OLE DB 數(shù)據(jù)源-點擊屬性-填寫數(shù)據(jù)源,格式為 ip:端口/實例名),后面的步驟根據(jù)向?qū)б徊讲降牟僮骷纯伞P枰⒁獾氖窃?選擇源表和源視圖的步驟中:

  (1)、要把【目標(biāo)】列中的默認(rèn)前綴去掉,這樣導(dǎo)入的表才會默認(rèn)關(guān)聯(lián)到dbo下,否則你每次查詢表都要帶上schema前綴,導(dǎo)致你之前的應(yīng)用程序中的sql無法執(zhí)行,因為你之前寫的那些sql肯定不會帶這種前綴。

  (2)、先勾選你要導(dǎo)入的源,然后雙擊每一行記錄,在彈出的對話框中檢查是否所有的類型都正確綁定好了,我在檢查的時候就遇到了oracle中是varchar2類型的,在該對話框顯示的表結(jié)構(gòu)中變成了130,只能手動的去將所有130改成varchar類型(sqlserver里沒有varchar2類型)。還有原來是clob類型的,現(xiàn)在變成了varchar,要手動改成text類型(因為clob類型的字段比較少,所以可以通過在oracle中執(zhí)行“select * from user_tab_columns c where c.data_type='CLOB';”來查看哪些表中用到了CLOB類型的字段)。

  2、增加to_date、to_char、to_number、concat等常用的函數(shù)

說明:我在編寫to_date函數(shù)的時候,只提供了一種格式“yyyy-mm-dd HH:mi:ss”,這是因為在sqlserver中是沒有和to_date函數(shù)的類似的函數(shù)的,只能使用convert函數(shù)實現(xiàn),但是convert函數(shù)不支持傳入格式化字符串,只能傳入格式字符對應(yīng)的整型數(shù)字,而120對應(yīng)的正是之前提到的“yyyy-mm-dd HH:mi:ss”格式;另外此次是遷移到Sqlserver2005,該版本是沒有內(nèi)嵌concat函數(shù)的,根據(jù)官方文檔的說法,是從sqlServer2012開始才有concat函數(shù)的,所以這里我要自己編寫一個concat函數(shù)。

------------------------------------------------------------------concat函數(shù)USE [skyplatform]GO/****** Object:  UserDefinedFunction [dbo].[concat]    Script Date: 03/10/2015 17:11:31 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [dbo].[concat](@param1 varchar(500),@param2 varchar(500))returns varchar(1000)asbeginDECLARE @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函數(shù)USE [skyplatform]GO/****** Object:  UserDefinedFunction [dbo].[to_char]    Script Date: 03/10/2015 17:12:09 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [dbo].[to_char](@param1 datetime,@param2 varchar(20))returns varchar(20)asbeginreturn convert(varchar(20),@param1,120)    end--------------------------------------------------------------------to_date函數(shù)USE [skyplatform]GO/****** Object:  UserDefinedFunction [dbo].[to_date]    Script Date: 03/10/2015 17:12:58 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [dbo].[to_date](@param1 varchar(20),@param2 varchar(20))returns datetimeasbeginreturn convert(datetime,@param1,120)--120 means that yyyy-mm-dd hh:mi:ss(24h)    end--------------------------------------------------------------------to_number函數(shù)USE [skyplatform]GO/****** Object:  UserDefinedFunction [dbo].[to_number]    Script Date: 03/10/2015 17:13:09 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [dbo].[to_number](@param1 varchar)returns numericasbeginreturn 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中關(guān)于數(shù)據(jù)庫連接信息的配置

jdbc.dialect=org.hibernate.dialect.SQLServerDialectjdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriverjdbc.url=jdbc:sqlserver://xx.xx.xx.xx:1433;DatabaseName=xxxjdbc.default_schema=dbojdbc.username=xxxjdbc.passWord=xxx

  3、修改平臺中使用的一些非sql標(biāo)準(zhǔn)的語法

  在使用delete insert update這些dml語句的時候,切記不要使用別名,因為在oracle和sqlserver中,這些dml語句使用別名的語法是不一樣的。

  4、各實體類主鍵策略的改造

  最好都使用string類型的主鍵,但是因為之前的代碼中都用的sequence做主鍵策略,現(xiàn)在改成string類型工作量勢必很大,所以決定使用table策略來兼容各種數(shù)據(jù)庫。

  5、dao層對sql的處理

  由于sqlserver中調(diào)用自定義標(biāo)量值函數(shù),必須在函數(shù)名前加上dbo.的前綴,但是這樣寫勢必會導(dǎo)致不能兼容其它的關(guān)系型數(shù)據(jù)庫,所以只能從dao實現(xiàn)層,對sql進(jìn)行統(tǒng)一的處理,處理規(guī)則就是:如果當(dāng)前數(shù)據(jù)庫是sqlserver,并且sql中出現(xiàn)了concat、to_date、to_char、to_number等函數(shù),就為這些函數(shù)名加上dbo.的前綴。

  以上做完,基本就可以讓平臺在sqlserver數(shù)據(jù)庫上跑了,同時也可以通過改配置文件切換到Oracle數(shù)據(jù)庫。

  以上的做法可能并不是最優(yōu)的方式,如果有更好的方案,希望各位大牛能給予指點。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 麦盖提县| 隆安县| 无棣县| 丰原市| 通城县| 黑河市| 香港| 原平市| 海晏县| 灵武市| 和田县| 中卫市| 大竹县| 托里县| 启东市| 浏阳市| 靖安县| 成安县| 宿迁市| 霍州市| 浠水县| 丘北县| 吉水县| 华阴市| 龙川县| 普格县| 左贡县| 龙泉市| 宽城| 梅河口市| 容城县| 荆门市| 虹口区| 兴安县| 化州市| 衡东县| 嵩明县| 南召县| 丰宁| 通江县| 墨脱县|