日暮途远

日暮途远,涸辙难行;东隅已逝,桑榆非晚

ibatis迁移mybatis详细方案(含脚本和注意事项)

ibatis已成过去式,官方早已不再维护,使用ibatis的老应用迁移到mybatis很有必要,且好用的服务层框架springboot集成了mybatis,支持维护良好,更加说明了迁移到mybatis的重要性,下面详细说明整个迁移流程

1.使用 ibatis到mybatis的map文件转换工具

转换工具:ibatis2mybatis
可以帮你将ibatis 2.x sqlmap文件转换为myBatis 3.x mapper文件,该工具是使用了Ant构建任务进行XSTL转换和一些语法文字替换
该工具下载下来使用非常简单,把你要转换的所有sqlmap文件放到source文件夹,然后在当前目录直接运行ant命令即可,转换成功的mapper文件放在了destination文件夹下。不过遗憾的是,ant命令并不总是运行成功,跟你的sqlmap文件有关,比如我当时转换时报错如下:

看到unknown protocol: classpath错误时发现是我的sqlmap DTD文件找不到,我的sqlmap一开始是这样的:

其中DTDs直接引用的jar包里的文件,工具无法识别就会报错,只能将其去掉,然后就转换成功了

2. 自己写脚本修复转换后mapper文件里的错误

不要以为一个工具就完事了,它只是试图在复杂的工作开始之前提供一个良好的起点,减少一点转换成本
转换后的mapper文件可能仍有一堆无法转换的部分或者转换错误,以我的应用为例,当时转换完成后有下面几个问题:

无法识别ibatis中jdbcType的类型

很多sqlmap文件写了resultMap,而且还加了jdbcType,比如:

转换工具保持原样,而mybatis的jdbcType已经换了类型关键词,不再是BIGINT啊这些,最好方法就是去掉,一个文件就有这么多的字段要改,20个文件岂不是要手动改几百次,当然用脚本了:

注意:mybatis有两种字段映射的方式:select别名和resultmap方式,详细可看:mybatis – MyBatis 3 | Mapper XML 文件

需要迁移<typeAlias>元素

转换后的mapper文件去掉了无法转换的<typeAlias>元素,因为mybatis里<typeAlias> 必须从<sqlMap>元素移动到 <configuration><typeAliases>...</typeAliases></configuration>这个里面,需要手动加个mybatis-config.xml文件:

个别动态标签需要手动加上

虽然上面工具能转换大部分动态sql比如<isNotNull><iterate>,但像<isNotEmpty>这样的动态sql是不支持的,需要手动转换

检查一下具体的sql语句有没有转换错误

该工具还是比较强大的,可以将你的动态sql转换成功,比如<isNotNull.*?property=\"(.*?)\"></isNotNull>改为:<if test="$1 != null"></if><iterate>标签改为<foreach>标签,但免不了可能存在连接符丢失的情况,比如我有一条sql转换后少了一个and

3. sql DAO类的改动

ibatis使用spring封装好的SqlMapClientTemplate进行DAO类的增删改查,我们只需要继承SpringFramework中提供的SqlMapClientDaoSupport类即可

然后通过getSqlMapClientTemplate()即可进行select/insert/update/delete操作

而mybatis采用的是SqlSessionTemplate进行操作,上面的类就要改成:

想想如果有20个文件(大工程远不止),每个文件都要如此改,和完全重写工作量差不多,有两种方案可改善:

采用适配器模式

很简单,就是写个适配原来ibatis的DAO操作,接口如下:下面代码由@执宿提供

在适配器的实现类中调用SqlSession的相关方法:

直接脚本批量改

适配器方式在大多数情况下都是优选方案,值得推荐,但免不了仍到处到是ibatis的影子,强迫症患者可能不想忍,要改就改彻底了,绝不留下ibatis的影子,那怎么办尼?只能手动写脚本批量改了,熟悉脚本的人很快就能写好,每个人都需要根据自己代码情况进行定制脚本,比如我的如下:

还有一些微调的部分,不适合用脚本,比如mybatis的insert方法已经不再返回新的id了,而是需要我们调用成功后直接从对象参数里获取,这里可能需要手动调整下

4. 数据源配置变更

上面说了ibatis使用的是SqlMapClientTemplate对象,dataSource配置如下:

而mybatis使用的是SqlSessionTemplate,数据源需要改动配置:

参考文档

点赞

发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">