欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ibatis迁移到mybatis3的注意事项

程序员文章站 2024-04-01 21:57:40
docupgrade3  这一页提供了一些当你从ibatis迁移到mybatis3时非常有用的信息。不能保证100%的完整。 这个项目现在的地址是 ...

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的注意事项,希望对大家有所帮助