最近完成了一個(IBatis.Net+MVC)項目的數據庫+代碼遷移工做,可把我折騰得~~~web
IBatis.Net是一個ORM框架,具體介紹能夠問度娘。我以前沒用ORM框架使用經驗,因此這一路我不是走來的,而是爬出一個坑又掉入另一個坑~~~sql
項目原來用的是Sqlserver2008,如今要轉到Oracle,因此我先完成數據遷移,而後是代碼遷移。數據庫
數據庫遷移oracle
一、數據庫安裝與配置框架
略過。ide
二、表結構遷移sqlserver
1)用PowerDesigner建立一個PhysicalDataModel,DBMS選擇Sqlserver2008;測試
2)選擇DataBase->Connect… ,連上Sqlserver數據庫;ui
3)選擇DataBase->Update Model from DataBase…,獲取Sqlserver數據庫的表結構和視圖,不獲取約束關係等(會影響數據導入);spa
4)選擇DataBase->Change Current DBMS…,選擇new DBMS爲Oracle10gR2 ;
5)修改用戶,將原始dbo,修改爲咱們oracle的方案名(用戶名)。
90%的工做PowerDesigner已經爲我完成了,剩下來就是修改字段類型和長度工做了。
修改字段類型和長度的部分,主要包括:
1)將轉換後的NUMBER和INTEGER類型都改爲NUMBER(10)。sqlserver自增序列轉化後默認是NUMBER(6),這個確定是不夠的;
2)將轉化後的FLOAT類型改成NUMBER(12,2);
3)將VARCHAR2長度都增長1倍,如sqlserver中的varchar(50),在oracle中就設置爲varchar2(100)(注意:varchar(50)與varchar2(50)是有區別的)。
表字段類型和長度都修改完畢後,就是表的批量建立了。
三、數據導入
經過Sqlserver2008的DTS進行數據導入,數據導入失敗通常有如下幾種狀況:
1)目標表中字段類型長度不夠;
2)表之間存在約束關係,如先在子表中導入數據,而主表又沒數據。
DTS導入完畢後,沒有返回到上一步功能,除非導入出錯。這個太不人性化了,太不厚道了~~~
四、主要工做已經完成,剩下就是建立序列和存儲過程的事情了。數據庫這部分基本搞定。在類型字段長度上,我返工了1次-_-有100多張表,坑啊~~~
項目的代碼遷移
一、IBatis的配置文件修改
providers.config文件中加入
<provider name="oracleClient1.0" description="Oracle, Microsoft provider V1.0.5000.0" enabled="true" assemblyName="System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.OracleClient.OracleConnection" commandClass="System.Data.OracleClient.OracleCommand" parameterClass="System.Data.OracleClient.OracleParameter" parameterDbTypeClass="System.Data.OracleClient.OracleType" parameterDbTypeProperty="OracleType" dataAdapterClass="System.Data.OracleClient.OracleDataAdapter" commandBuilderClass="System.Data.OracleClient.OracleCommandBuilder" usePositionalParameters="false" useParameterPrefixInSql="true" useParameterPrefixInParameter="false" parameterPrefix=":" allowMARS="false" />
注意enable="true",並設置其他的provider節點 enable=「false」。
SqlMap.config文件中的鏈接字符串設置
<database> <provider name="oracleClient1.0" /> <dataSource name="ORCL" connectionString="Data Source=ORCL;user=用戶名;password=密碼"/> </database>
這個oracleClient1.0的鏈接字符串找了好久,開始一直覺得是USER ID=用戶名。
二、Oracle客戶端的安裝
開始一直覺得Oracle9i精簡版客戶端就能夠搞定,結果老提示:Unable to open connection to "Oracle, Microsoft provider V1.0.5000.0"。因而下載並安裝了oracle10gR2的客戶端,仍是不行。因而我在網上找了個ibatis.net+oracle的winform版demo,測試正常,能夠確認不是配置文件和鏈接字符串的問題了。可將代碼移植到web項目上就不行了,即便部署到IIS上並模擬32位運行(開發機是win7x64系統)也是出錯。32位模式運行的時候會提示要求更高的客戶端版本。難道是新安裝的客戶端的時候在環境變量中新增長的Path沒生效?因而抱抱試試看的心態,重啓了電腦,終於老天是眷顧程序猿的~~~搞定。
三、SQL語句代碼修改
1)dbType=Int 都換成dbType=Number
2)遇到<等會破壞XML文件格式的符號,將其放在<![CDATA[……]]>中
3)Oracle的自增序列
<insert id="Insert" parameterClass="Account"> <selectKey property="UserID" resultClass="int" type="pre"> SELECT SEQ_ACCOUNT_ID.NEXTVAL AS VALUE FROM DUAL </selectKey> INSERT INTO Account ( USERID ,Name , AccountNo , MobileNo , Password ) VALUES ( #UserID# ,#Name,dbType=VarChar# , #AccountNo,dbType=VarChar# , #MobileNo,dbType=VarChar# , #Password,dbType=VarChar# ) </insert>
注意:自增序列的值,上面代碼段中我用的是UserId,這個要與XML中向對應,我以前都用了ID,結果踩到坑了。
<resultMaps> <resultMap id="FullResultMap" class="Account"> <result property="UserID" column="UserID" dbType="Int"/>
4)select top的實現
<select id="XXXXXXXX" parameterClass="Hashtable" resultMap="NonLobResultMap"> SELECT * FROM ( SELECT rownum as rn ,ID , Title FROM Article WHERE (OwnerID = #OwnerID,dbType=Number#) ORDER BY CreateTime DESC ) tb <![CDATA[ where rn <= $ReturnCount$ ]]> </select>
5)分頁的實現
<select id="Search" parameterClass="Hashtable" resultMap="FullResultMap"> SELECT * From( SELECT rownum as RowNumber,Article.* FROM Article <include refid="SearchWhere"></include> <![CDATA[ order by ID DESC ) tb where RowNumber >=( ($PageIndex$ - 1) * $PageSize$ + 1) and RowNumber<=( $PageIndex$ * $PageSize$) ]]> </select>
6)like模糊查詢
<select id="XXX" parameterClass="Citys" resultMap="FullResultMap" extends="FindAll"> where (Namelike '%'|| #Name,dbType=VarChar#||'%') </select>
7)存儲過程返回遊標
<parameterMaps> <!-- 存儲過程參數 --> <parameterMap id="parm_sp_XXXXXX" class="Hashtable"> <parameter property="AAAAAA" column="IN_AAAAAA" direction="Input" /> <parameter property="BBBBBB" column="IN_BBBBBB" direction="Input" /> <parameter property="Result" column="OUT_REF_CUR" dbType="Cursor" direction="Output" /> </parameterMap> </parameterMaps> <statements> <!-- 存儲過程 --> <procedure id="GetXXXXXXXXXXXX" parameterMap="parm_sp_XXXXXX" resultMap="YYYYYYYYYYYYY"> proc_存儲過程名稱 </procedure>
</statements>
8)Oracle對字段取別名能夠用as,可是對錶就不能用as
9)select * ,而後增長其餘字段,就須要在*前面加上表名,如t.*
10)而後把一些SQL命令改爲Oracle的命令
11)SQL語句的腳本文件中,建議將存儲過程、參數、序列等都用大寫表示。
總結
初次接觸Ibatis.Net,經過代碼生成器爲咱們完成大部分工程,開發上確實很方便,在後期作數據庫遷移的時候,工做量比傳統的工廠模式或IOC少不少,修改的時候直接在對應的XML上修改,很是直觀方便。