背景
iBatis2.x框架已经不再维护,被谷歌托管后,将iBatis3.x改名为MyBatis3,而MyBatis提供了更加丰富的功能。
对于一些早期搭建开发仍在使用的项目来说,将iBatis升级到MyBatis显得十分有必要,可以极大地提供工作效率,降低繁琐但重要的持久层开发成本。
具体升级步骤
注:一般而言,需要框架升级的当前项目应用都是正在投产使用,重新开发底层sql映射文件工作量庞大且风险高,因此在原有的基础上进行升级即可。
这里推荐一个将iBatis 2.x sqlmap文件转换为MyBatis 3.x xml mapper文件的转换工具,Github地址:https://github.com/mybatis/ibatis2mybatis
一、 添加mybatis的jar依赖
在项目应用的pom.xml文件中,添加如下配置:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- 与spring集成使用时添加 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
与此同时,删除ibatis相关jar包:ibatis-sqlmap-x.x.x.jar、spring-orm-x.x.x.jar
二、 添加mybatis的相关配置文件
1.主配置文件sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc_mysql.properties" />
<!-- 定义类型名 -->
<typeAliases>
<package name="org.xxx.com.dal.dataobject" />
</typeAliases>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="sqlMap/xxx-mapper.xml" />
</mappers>
</configuration>
注:在主配置文件中,属性properties、运行时行为settings(可扩增)、类型转换器typeHandlers、别名typeAliases、插件plugins(不优先考虑)、环境属性environments等可按需添加
详见官网链接:https://mybatis.org/mybatis-3/zh/configuration.html
2.接口映射文件xxxMapper.xml
使用新的DTD:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
mapper.xml中注意点:
1)namespace为DAO接口的类全路径
2)statement的id、parameterType、resultType尽量与mapper.java中方法名、输入参数类型、输出参数类型一致
3)根元素从sqlMap变成mapper
4)class属性通常变更为type
5)parameterClass属性通常变更为parameterType
6)resultClass属性通常变更为resultType、resultMap
7)mybatis不支持bigint unsigned(–> bigint)、int(–>integer)、datatime(–>timestamp)、text(–>clob)等类型
8)mybatis使用占位符#{}、拼接符${},不再支持#字段名#,否则提示sql语法错误
9)groupBy、nullValue、isNotEmpty等属性已经被废弃。
3.数据源配置更新
spring上下文更新配置如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 加载db.properties文件中的内容,db.properties文件中key命名要有一定的特殊规则 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 配置数据源 ,dbcp -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="30" />
<property name="maxIdle" value="5" />
</bean>
<!-- 从整合包里找,org.mybatis:mybatis-spring:1.3.2 -->
<!-- sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml" />
</bean>
<!-- mapper扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->
<property name="basePackage" value="com.iot.learnssm.firstssm.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- <property name="sqlSessionFactory" ref="sqlSessionFactory" />
会导致数据源配置不管用,数据库连接不上。且spring 4弃用
-->
</bean>
参考学习链接:https://blog.csdn.net/h3243212/article/details/50837878
三、 DAO接口代码更新
尽量不改动原工程结构,根据项目实际情况升级。
若原ibatis系统使用SqlMapClinetDaoSupport的getSqlMapClientTemplate()方法进行CRUD,则升级使用SqlMapClinetDaoSupport的getSqlSession()方法进行CRUD操作。其中queryForObject() --> selectOne(),queryForList() --> selectList()。
四、使用代码生成器
使用代码生成器可自动生成对应的实体类、Mapper接口和Mapper.xml映射文件,避免新建每张表都手动编写这些代码,可节省更多时间去开发核心或业务应用层代码。当然,若是需要用到联合查询和存储过程等,还是需要手动调整。
对于新增的表,将不再采用原来的编写DAO接口及实现类的方式,通过引入生成器mybatisGenerator,使用Mapper代理开发的方式,只编写Mapper接口(原DAO接口)即可。
采用Maven插件方式的生成步骤:
1.在mybatisGenerator路径下的generatorConfig.xml中添加新增表的
<table tableName="app_user_config" domainObjectName="AppUserConfig"></table>
2.在IDEA的Maven Projects中找到数据访问层路径下的mybatis-generator,双击命令mybatis-generator:generate,待控制台出现BUILD SUCCESS字样即表示生成成功。
3.在spring配置文件中,添加mapper接口bean定义
4.在sqlMapConfig.xml文件中添加Mapper映射文件配置
<mapper resource="sqlMap/AppUserConfigMapper.xml" />
五、mybatis源码下载及构建
git clone https://github.com/mybatis/mybatis-3.git
cd mybatis-3
mvn -version3.5.3
jdk8
mvn clean install -Dmaven.test.skip=true