天天看点

ibatis迁移到mybatis3

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:

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">      

*.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> 必须从 <sqlMap> 元素移动到 <configuration><typeAliases>这里</typeAliases></configuration>

<configuration>
    <settings>
    ...
    </settings>
    <typeAliases>
        <typeAlias ... />
    </typeAliases>
</configuration>      

 和

<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 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>      

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

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>      

specify

useCache="false"

 和

flushCache="true",你还必须做一个强制提交(事务)。

  • 对返回数据集的存储过程,当使用嵌套的resultMap时,这儿有一个bug(看​​ issue 30 ​​)  (例如:出参resultMap包含一个<association>

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

isNotNull. 下面是替换正则表达式的示例:

正则表达式:

<isNotNull.*?property=\"(.*?)\">
</isNotNull>      

需要改为:

<if test="$1 != null">
</if>      

isEqual最常用,你可以使用类似的<if>

Java code

SqlMapClient

  • 这个类已经不存在了,使用SqlSessionFactory替代

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)