DocUpgrade3
這一頁提供了一些當你從ibatis遷移到mybatis3時非常有用的信息。不能保證100%的完整。
這個項目現在的地址是 Github https://github.com/mybatis/ibatis2mybatis
轉換工具
在下載區有一個可用的工具,可以幫你將iBATIS 2.x sqlmap文件轉換為MyBatis 3.x xml mapper文件。
從這里獲取 http://mybatis.googlecode.com/files/ibatis2mybatis.zip
該工具是一個封裝在Ant任務圍繞XSTL轉換和一些文字替換,并試圖在復雜的工作開始之前提供一個良好的起點。
新的DTDs
新的sqlMapConfig.xml DTD:
1
|
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > |
新的sqlMap (*.map.xml) DTD:
1
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > |
Configuration配置
配置根節點從 <sqlMapConfig> 變成 <configuration>
Settings配置
在配置的根節點:
1
|
<settings x= "y" foo= "bar" /> |
現在是:
1
2
3
4
|
<settings> <setting name= "x" value= "y" /> <setting name= "foo" value= "bar" /> </settings> |
然后
1
|
<settings useStatementNamespaces= "true" /> |
這個配置可以刪除掉,因為使用命名空間已經是一個強制的特性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<typeAlias>別名 <typeAlias> 必須從 <sqlMap> 元素移動到 <configuration><typeAliases>這里</typeAliases></configuration> <configuration> <settings> ... </settings> <typeAliases> <typeAlias ... /> </typeAliases> </configuration> <transactionManager> 和<dataSource> <transactionManager type= "JDBC" commitRequired= "false" > <dataSource type= "your.package.CustomDataSourceFactory" /> </transactionManager> |
變成:
1
2
3
4
5
6
7
8
9
10
11
12
|
<environments default = "env" > <environment id= "env" > <transactionManager type= "JDBC" > <property name= "commitRequired" value= "false" /> </transactionManager> <dataSource type= "your.package.CustomDataSourceFactory" /> </environment> </environments> <sqlMap> <sqlMap resource=... /> <sqlMap resource=... /> <sqlMap resource=... /> |
變成:
1
2
3
|
<mappers> <mapper resource=... /> </mappers> |
Mapping
根元素從 <sqlMap> 變成 <mapper>
parameterClass屬性必須改成parameterType
resultClass屬性必須改成resultType
class屬性必須改成type
columnIndex不在<result> 標簽中使用
groupBy屬性已經被廢棄。下面是一個 2.x sqlMap的groupBy 例子:
1
2
3
4
5
6
|
<resultMap id= "productRM" class = "product" groupBy= "id" > <result property= "id" column= "product_id" /> <result property= "name" column= "product_name" /> <result property= "category" column= "product_category" /> <result property= "subProducts" resultMap= "Products.subProductsRM" /> </resultMap> |
新的:
1
2
3
4
5
6
|
<resultMap id= "productRM" type= "product" > <id property= "id" column= "product " /> <result property= "name " column= "product_name " /> <result property= "category " column= "product_category " /> <collection property= "subProducts" resultMap= "Products.subProductsRM" /> </resultMap> |
Nested resultMaps嵌套的resultMaps
現在需要使用<association> 標簽指定.
1
2
3
4
|
<resultMap ...> <result property= "client" resultMap= "Client.clientRM" /> ... </resultMap> |
需要改成:
1
2
3
4
|
<resultMap ...> <association property= "client" resultMap= "Client.clientRM" /> ... </resultMap> |
<parameterMap>
雖然這個標簽被廢棄了,但是他仍然可以在iBatis 2中使用。但是對3.0.3以上版本當使用type="map"時有一個bug,并不指定 javaType 參數。這將導致:
There is no getter for property named '...' in 'interface java.util.Map'
這將會在MyBatis 3.0.4中解決,對3.0.3版本或更早的版本解決的方法是顯示的指定javaType
1
2
|
Inline parameters內聯參數 #value# |
需要改成:
1
2
3
|
#{value} jdbcType changes jdbcType變化 jdbcType= "ORACLECURSOR" |
需要改成:
jdbcType="CURSOR"
還有
jdbcType="NUMBER"
需要改成:
1
2
3
4
5
6
|
jdbcType= "NUMERIC" Stored procedures存儲過程 <procedure> 存儲過程的標簽已經不存在了,需要使用 < select >, <insert> 或 <update>標簽。 <procedure id = "getValues" parameterMap= "getValuesPM" > { ? = call pkgExample.getValues(p_id => ?) } < /procedure > |
需要改成:
1
2
3
|
< select id = "getValues" parameterMap= "getValuesPM" statementType= "CALLABLE" > { ? = call pkgExample.getValues(p_id => ?)} < /select > |
如果你調用一個insert的帶返回值的存儲過程,你可以使用<select>標簽代替<insert>,但是你需要設置specifyuseCache="false" 和flushCache="true",你還必須做一個強制提交(事務)。
對返回數據集的存儲過程,當使用嵌套的resultMap時,這兒有一個bug (例如:出參resultMap包含一個<association> 標簽). 只要問題沒有解決,你必須自己將resultMap定義好,或者嵌套的內容不會被填充。
Caching緩存
1
2
3
4
|
<cacheModel id = "myCache" type = "LRU" > <flushInterval hours= "24" /> <property name= "size" value= "100" /> < /cacheModel > |
需要改為:
1
|
<cache flushInterval= "86400000" eviction= "LRU" /> |
注意:你可以忽略eviction="LRU",因為他是默認值。.
<flushOnExecute> 標簽被flushCache屬性所替代。緩存默認會被所有的查詢語句使用。
Dynamic SQL動態SQL
在我的項目中最常用的的動態SQL是isNotNull. 下面是替換正則表達式的示例:
正則表達式:
1
2
|
<isNotNull.*?property=\"(.*?)\"> </isNotNull> |
需要改為:
1
2
|
< if test = "$1 != null" > < /if > |
isEqual最常用,你可以使用類似的<if> 標簽替代.
SqlMapClient
這個類已經不存在了,使用SqlSessionFactory替代 (詳細內容看Mybatis文檔).
Custom type handler
用 TypeHandler 替換接口 TypeHandlerCallback。它具有稍有不同,但方法類似。
Custom data source factory
舊的接口:
com.ibatis.sqlmap.engine.datasource.DataSourceFactory
新的接口:
org.apache.ibatis.datasource.DataSourceFactory
替換下面的方法
public void initialize(Map properties)
為:
public void setProperties(Properties props)
總結
以上所述是小編給大家介紹的ibatis遷移到mybatis3的注意事項,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://blog.sina.com.cn/s/blog_9c6852670102wxfq.html