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(看issue
    30
    )  (例如:出参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> 标签替代.

Java code

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)

原文地址:https://code.google.com/p/mybatis/wiki/DocUpgrade3

时间: 2024-12-09 06:09:08

ibatis迁移到mybatis3的相关文章

从ibatis2到mybatis3

首先,我们先看差别 然后,我们做一个demo. 开发环境: OS:Windows IDE: Eclipse IDE for Java Developers 1. sql CREATE TABLE persons ( id int NOT NULL AUTO_INCREMENT , name varchar (50) , PRIMARY KEY (id))AUTO_INCREMENT=1; 2. java project (1) Create new Java Project (2) Add ne

Mybatis与Ibatis比较

随着开发团队转投GoogleCode旗下,ibatis3.x正式更名为Mybatis 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在Hibernate.JPA 这样的一站式对象 / 关系映射(O/R Mapping)解决方案盛行之前,iBaits基本是持久层框架的不二选择.即使在持久层框架层出不穷的今天,iBatis 凭借着易学易用.轻巧灵活等特点,也仍然拥有一席之地.尤其对于擅长 SQL的开发人员来说,iBatis 对 SQL 和存储过程的直接支持能

优秀的持久层框架Mybatis,连接数据库快人一步

我们之前学习了JDBC和连接池之后,攻城狮们对编程的效率仍然不是很满意.于是乎!有了今天更加优秀的内容,那就是Mybatis框架.它的出现解决了jdbc中的一些问题,提升了代码的鲁棒性.我们一起来看一下吧~ Mybatis介绍 Mybatis是在2010年由阿帕奇下的开源项目ibatis迁移到谷歌codde后,更改为mybatis. 这是一个十分好用的持久层的框架,我们能过通过这种框架实现对jdbc操作的数据库进行封装,我们只需要关心我们数据库SQL本身就可以了,不用麻烦的去注册驱动,连接数据库

MyBatis3.4.0以上的分页插件错误:Could not find method on interface org.apache.ibatis.executor.statement.StatementHandler named prepare. Cause: java.lang.NoSuchMethodException: org.apache.ibatis.executor.stateme

错误: Could not find method on interface org.apache.ibatis.executor.statement.StatementHandler named prepare. Cause: java.lang.NoSuchMethodException: org.apache.ibatis.executor.statement.StatementHandler.prepare(java.sql.Connection)] with root cause 问题

【转】IBatis.Net项目数据库SqlServer迁移至Oracle

转自:http://www.2cto.com/database/201312/265514.html 最近完成了一个(IBatis.Net+MVC)项目的数据库+代码迁移工作,可把我折腾得~~~ IBatis.Net是一个ORM框架,具体介绍可以问度娘.我之前没用ORM框架使用经验,所以这一路我不是走来的,而是爬出一个坑又掉入另外一个坑~~~ 项目原来用的是Sqlserver2008,现在要转到Oracle,所以我先完成数据迁移,然后是代码迁移. 数据库迁移 1.数据库安装与配置 略过. 2.表

mybatis3动态创建表,判断表是否存在,删除表

1.mybatis3动态创建表,判断表是否存在,删除表 mapper配置文件: <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/

SpringMVC4 + Spring + MyBatis3 【转】

本文使用最新版本(4.1.5)的springmvc+spring+mybatis,采用最间的配置方式来进行搭建. 1. web.xml 我们知道springmvc是基于Servlet: DispatcherServlet来处理分发请求的,所以我们需要先在web.xml文件中配置DispatcherServlet,而Spring的启动则是使用了监听器,所以需要配置spring的监听器: <?xml version="1.0" encoding="UTF-8"?&

mybatis3中@SelectProvider的使用技巧

mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/. mybatis3中增加了使用注解来配置Mapper的新特性,本篇文章主要介绍其中几个@Provider的使用方式,他们是:@SelectProvider.@UpdateProvider.@InsertProvider和@DeleteProvider. MyBatis 3 User Guide中的最后一章描述了注解的简单用法,但是对于这几个Provider的具体使用方式并

spring mvc +Mybatis3.1 整合的时候异常

在使用Mybatis3.10+spring3.10+mybatis-spring-1.0.0集成,使用spring 时发生例如以下错误: 严重: Servlet.service() for servlet SpringMVC threw exception java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction(Ljava/sql/Co