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