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的注意事项,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
- hdu----(4545)魔法串(LCS)
- Oracle压缩黑科技(二)—压缩数据的修改
- 在Pivotal Web Service上发布Spring Boot应用
- hdu---(1325)Is It A Tree?(并查集)
- spark2 sql编程样例:sql操作
- hdu----(1599)最大子矩阵(几何/dp)
- Go语言简单的TCP编程
- hdu---(1054)Strategic Game(最小覆盖边)
- Swagger Starter 1.4.0发布:新增swagger功能开源与全局参数的配置。
- Go语言语法汇总
- 整理的一些模版LCS(连续和非连续)
- 以太坊开发实战(第1部分:智能合约)
- spark2 sql读取数据源编程学习样例2:函数实现详解
- hdu---(4310)Hero(贪心算法)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 题目 1159: [偶数求和]
- 回溯法求组合问题
- P1567 统计天数
- P1089 津津的储蓄计划(模拟训练)
- 二分练习 --D - Trailing Zeroes (III)
- HDU 5806
- B - They Are Everywhere CodeForces - 701C
- 尺取练习 -A - A - Stages (水题压压惊)
- 填坑-回溯-预习 之 二分-尺取大总结
- 深入浅出理解动态规划(一) | 交叠子问题
- 深入浅出理解动态规划(二) | 最优子结构
- 用x种方式求第n项斐波那契数,99%的人只会第一种
- 面试官:手撕十大排序算法,你会几种?
- 如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据?
- Java开发岗面试题--基础篇(一)