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

(0)

相关推荐

  • 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

  • Ruby on Rails迁移时的一些注意事项

    把 schema.rb 保存在版本管控之下.     使用 rake db:scheme:load 取代 rake db:migrate 来初始化空的数据库.     使用 rake db:test:prepare 来更新测试数据库的 schema. 避免在表里设置缺省数据.使用模型层来取代. def amount self[:amount] or 0 end 然而 self[:attr_name] 的使用被视为相当常见的,你也可以考虑使用更罗嗦的(争议地可读性更高的) read_attribu

  • 数据从MySQL迁移到Oracle 需要注意什么

    将数据从MySQL迁移到Oracle的注意事项,有如下几点 1.自动增长的数据类型处理 MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值.ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段. CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE; INSERT 语句插入这个字段值为:

  • Mysql数据库安装完成后需要进行的6个后续操作

    在服务器上安装好mysql之后,一般都需要做下面几件事情: 1. 启动mysql server 2. 设置root用户和添加一些访问用户 3. 设置用户权限 4. 配置非本地连接访问 5. 备份数据或者迁移数据 6. 一些注意事项(不断更新) 一.启动mysql server 通常情况下,我们使用的启动命令是: 复制代码 代码如下: service mysqld start 常见的一个问题就是抛:Timeout error occurred trying to start MySQL Daemo

  • mybatis-plus如何配置自定义数据类型TypeHandle

    目录 如何配置自定义数据类型TypeHandle 1.背景 2.举例 3.TypeHandle配置 自定义TypeHandler的使用笔记 类型转换器还可以通过注解配置java类型和jdbc类型 如何配置自定义数据类型TypeHandle 1.背景 mybatis-plus在mybatis的基础的上,做了全面增强功能,极大的提高了我们的开发效率.有时候我们使用的实体字段类型,与数据库创建的字段类型无法对应上,这时候就需要配之自定义的类型处理类,来处理代码和数据库之间的数据流转. 2.举例 我们有

  • 关于MySQL数据迁移--data目录直接替换注意事项的详解

    近日更换服务器,要做数据库迁移,将数据库内的数据从服务器A迁移到服务器B.由于数据量较大,直接做dump耗时太长,故而采用如下方式处理:首先,在服务器B上安装了与服务器A同版本的MySQL,停止MySQL服务,将安装后的data目录删除:然后,服务器A锁住全部表,从服务器A将整个data目录和数据文件直到拷贝到服务器B上,修改服务器B上MySQL的my.cnf文件中的datadir指向新的data目录.最后,启动服务器B上的MySQL服务.结果启动失败,报出 "无法启动MySQL服务"

  • mysql迁移至8.0时的注意事项(小结)

    密码模式 PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] mysql8 之后,默认的密码模式改为 caching_sha2_password,新的模式需要新的驱动,至少现在 pdo / navicat 还没给出,所以我们还是得切换成老的 mysql_native_password 模式. `mysql_native_passwo

  • 如何把sqlserver数据迁移到mysql数据库及需要注意事项

    在项目开发中,有时由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据迁移到MySQL.下面是小编日常整理的一种sqlserver数据库迁移的方法. 一.SQL Server中常用数据类型与MySQL不同的地方 二.将SQL Server数据迁移到MySQL需要注意的一些问题 1.唯一索引的不同,sql server的唯一索引的字段只能允许存在一个null值,而mysql,一直oracle中唯一索引对应的字段都允许存在多个n

  • Xen虚拟机的详细迁移步骤详解

    对于安装使用xen虚拟机大家已是很熟悉的操作了,但有些对于xen migrate的操作有的还不太熟悉.想要了解的朋友可以参考一下. 一.迁移的准备工作 在进行迁移之前,有一些准备工作要做,主要是目的主机和源主机及其网络方面.下面分别加以介绍. 首先,在源主机和目的主机方面,两者必须都运行有Xen和xend守护进程.必须确保目的主机具有足够的磁盘空间.内存容量和资源,以供迁移后的domain运行之用.此外,源主机和目的主机还必须具有相同的体系结构和虚拟化扩展,例如,如果源主机使用的是具有虚拟化扩展

  • 将Django使用的数据库从MySQL迁移到PostgreSQL的教程

    我们已对 Django1.6 app完成了数据库从mysql到PostgreSQL的迁移,如果你的环境很干净,这个过程就会很简单,只要允许syncdb 或者 migrate创建表,truncating表中的数据,然后运行dumpdata 和loaddatamanagement命令就完成了. 第一步,在你的PostgreSQL数据库中创建一个空的实例: CREATE DATABASE dbname OWNER rolename; 第二步,在你的Django中给创建的数据库加上配置 在setting

随机推荐