ibatis迁移到mybatis3的注意事项

 更新时间:2017年10月17日 10:05:40   作者:动力节点  
这篇文章主要介绍了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">

新的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的注意事项,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • IDEA2021.2永久激活码最新超详细(激活到2099)

    IDEA2021.2永久激活码最新超详细(激活到2099)

    这篇文章主要介绍了IDEA2021.2永久激活码,是idea2021版最新激活方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java反射与Fastjson的危险反序列化详解

    Java反射与Fastjson的危险反序列化详解

    在 Java 中,Computer.class是一个引用,它表示了 Computer 的字节码对象(Class对象),这个对象被广泛应用于反射、序列化等操作中,那么为什么 parseObject 需要这个引用呢,带着这个问题我们一起通过本文学习下吧
    2024-07-07
  • servlet重定向详解(八)

    servlet重定向详解(八)

    这篇文章主要为大家详细介绍了servlet重定向的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程

    Spring Boot中使用Server-Sent Events (SSE) 实

    Server-Sent Events (SSE) 是HTML5引入的一种轻量级的服务器向浏览器客户端单向推送实时数据的技术,本文主要介绍了Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Java使用DFA算法实现敏感词过滤的示例代码

    Java使用DFA算法实现敏感词过滤的示例代码

    很多项目中都会有一个敏感词管理模块,本文主要介绍了Java使用DFA算法实现敏感词过滤的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Java如何通过反射取实体类字段取值

    Java如何通过反射取实体类字段取值

    这篇文章主要介绍了Java如何通过反射取实体类字段取值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java 实战项目锤炼之小区物业管理系统的实现流程

    Java 实战项目锤炼之小区物业管理系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现一个小区物业管理系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java 超详细讲解hashCode方法

    Java 超详细讲解hashCode方法

    在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致
    2022-04-04
  • Java多线程之悲观锁与乐观锁

    Java多线程之悲观锁与乐观锁

    这篇文章主要为大家详细介绍了Java悲观锁与乐观锁,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • java比较器Comparable接口与Comaprator接口的深入分析

    java比较器Comparable接口与Comaprator接口的深入分析

    本篇文章是对java比较器Comparable接口与Comaprator接口进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论