ibatis迁移到mybatis3的注意事项
docupgrade3
这一页提供了一些当你从ibatis迁移到mybatis3时非常有用的信息。不能保证100%的完整。
这个项目现在的地址是 github
转换工具
在下载区有一个可用的工具,可以帮你将ibatis 2.x sqlmap文件转换为mybatis 3.x xml mapper文件。
从这里获取
该工具是一个封装在ant任务围绕xstl转换和一些文字替换,并试图在复杂的工作开始之前提供一个良好的起点。
新的dtds
新的sqlmapconfig.xml dtd:
<!doctype configuration public "-//mybatis.org//dtd config 3.0//en" "http://mybatis.org/dtd/mybatis-3-config.dtd">
新的sqlmap (*.map.xml) dtd:
<!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
configuration配置
配置根节点从 <sqlmapconfig> 变成 <configuration>
settings配置
在配置的根节点:
<settings x="y" foo="bar"/>
现在是:
<settings> <setting name="x" value="y"/> <setting name="foo" value="bar"/> </settings>
然后
<settings usestatementnamespaces="true"/>
这个配置可以删除掉,因为使用命名空间已经是一个强制的特性。
<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>
变成:
<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=... />
变成:
<mappers> <mapper resource=... /> </mappers>
mapping
根元素从 <sqlmap> 变成 <mapper>
parameterclass属性必须改成parametertype
resultclass属性必须改成resulttype
class属性必须改成type
columnindex不在<result> 标签中使用
groupby属性已经被废弃。下面是一个 2.x sqlmap的groupby 例子:
<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>
新的:
<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> 标签指定.
<resultmap ...> <result property="client" resultmap="client.clientrm"/> ... </resultmap>
需要改成:
<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
inline parameters内联参数 #value#
需要改成:
#{value} jdbctype changes jdbctype变化 jdbctype="oraclecursor"
需要改成:
jdbctype="cursor"
还有
jdbctype="number"
需要改成:
jdbctype="numeric" stored procedures存储过程 <procedure> 存储过程的标签已经不存在了,需要使用 <select>, <insert> 或 <update>标签。 <procedure id="getvalues" parametermap="getvaluespm"> { ? = call pkgexample.getvalues(p_id => ?) } </procedure>
需要改成:
<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缓存
<cachemodel id="mycache" type="lru"> <flushinterval hours="24"/> <property name="size" value="100" /> </cachemodel>
需要改为:
<cache flushinterval="86400000" eviction="lru"/>
注意:你可以忽略eviction="lru",因为他是默认值。.
<flushonexecute> 标签被flushcache属性所替代。缓存默认会被所有的查询语句使用。
dynamic sql动态sql
在我的项目中最常用的的动态sql是isnotnull. 下面是替换正则表达式的示例:
正则表达式:
<isnotnull.*?property=\"(.*?)\"> </isnotnull>
需要改为:
<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的注意事项,希望对大家有所帮助