ibatis升级到mybatis总结

ibatis升级到mybatis,不是简单的升级包就OK了,为什么这么说呢?因为升级后,调用接口变了,配置文件的写法也变了,所以从某种程度来说,

mybatis不是ibatis的升级版,只是一个家族出来的,长得像而已,升级的工作量还是很大的。

下面我们就来实际升级一下,毕竟ibatis最终是要淘汰的,同时mybatis也给我们在日常开发中提高了工作效率。

升级流程如下:

1、移出项目中的ibatis相关包:

ibatis相关包其实只有一个包,即:ibatis-sqlmap-x.x.x.jar,各项目因版本而;如果项目同时使用了spring集成包spring-orm-x.x.x.jar,也一并移出。

2、引入mybatis相关包依赖到项目中:

mybatis相关包其实只有一个包,即:mybatis-x.x.x.jar,但我们一般是和spring一起集成使用mybatis的,这样能方便使用spring提供的事务管理特性,所以还需要引入mybatis-spring-x.x.x.jar

在maven的pom,xml引入配置如下

 <dependency>
  <groupId>org.mybatisgroupId>
  <artifactId>mybatisartifactId>
  <version>3.4.6version>
 dependency>
 <dependency>
  <groupId>org.mybatisgroupId>
  <artifactId>mybatis-springartifactId>
  <version>1.3.2version>
 dependency>

3、移出项目中的ibatis相关配置及文件(与spring集成为样例):

 <bean id="sqlMapClient" class="com.common.sqlmap.DynSqlMapClientFactoryBean">
  <property name="configLocations">
   <list>
    <value>classpath:common-sqlmap-config.xmlvalue>
    <value>classpath*:ibatis-sqlmap-config.xmlvalue>
   list>
  property>
  <property name="dynamicDataSource" ref="dataSource_dyn">
  property>
 bean>

同时移出common-sqlmap-config.xml和ibatis-sqlmap-config.xml

4、在项目中添加mybatis的相关配置及文件:

    id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <property name="mapperLocations" value="classpath*:mapper/**/*.xml" />
    
    class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <property name="basePackage" value="com.demo.dao" />
    

同时在项目资源根目录下添加mybatis-config.xml,新建mapper目录用于存放SQL映射文件

mybatis-config.xml样例


<configuration>
 <typeAliases>
  <typeAlias type="com.feidee.demo.entity.SyncLabel" alias="SyncLabel" />
 typeAliases>
configuration>

5、创建mybatis的SQL映射文件:

mybatis的SQL映射文件可以从原来ibatis的SQL映射文件拷贝过来,做如下升级修改:

1、 变为
2、sqlMap 变为 mapper
3、mapper标签命名空间namespace最好是全类名,这样方便扫描配置使用(通过MapperScannerConfigurer)
4、typeAlias标签在mybatis的已不支持,可放入公共配置文件的typeAliases标签中
5、resultMap标签中的属性变化 class 变为 type
6、jdbcType值在mybatis不支持LONG 变为 BIGINT,Boolean 变为 BOOLEAN
7、resultMap标签中result标签移出属性nullValue
8、insert select、update、delete标签中的属性 parameterClass 变为 parameterType,resultClass 变为 resultType
9、#appName:VARCHAR# 变为 #{appName,jdbcType=VARCHAR} ,自己领悟^=^
10、#appName# 变为 #{appName} ,自己领悟^=^
11、 变为 会自动处理所有条件的第一个and,即切掉
12、… 变为 and …, 要放在where标签里才能处理条件的第一个and
13、… 变为 and …,mybatis是基于OGNL表达试比较的
14、 userIds[] u s e r I d s [ ] 变为 ${item}

以上列举的只是涵盖大部分的修改,如有有未提及需要进一步完善总结。

不过,mybatis的官方文档还是需要再学习的,这是解决问题的根本,以下是学习链接

XML 映射配置文件 http://www.mybatis.org/mybatis-3/zh/configuration.html
Mapper XML 文件 http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
动态 SQL http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html

6、删除dao的实现类及配置

升级mybatis后是可以不需要dao的实现类的,使用MapperScannerConfigurer扫描加载(见步骤4中的配置),等价升级完dao在service中的使用后,删除dao实现类。

注意:dao接口中的方法不支持方法重载,等价升级完dao在service中的使用要注意dao的参数问题,如果接口是多参数,可以转换接口参数为map或对参数使用注解。

多参数接口方法使用注解样例如下:

import org.apache.ibatis.annotations.Param;
import com.backup_restore.entity.BackupLog;
import com.backup_restore.entity.RestoreLog;

public interface DataDao {
    void insertBackupLog(BackupLog log);
    int deleteBackupLog(@Param("bookId") long bookId, @Param("id") long id);
    void insertRestoreLog(RestoreLog log);
    int resetSyncLabel(long bookId);
}

以下给出升级前后的样例文件:

在ibatis中是这样的



<sqlMap namespace="SyncLabel">
 <typeAlias alias="syncLabelClass" type="com.demo.entity.SyncLabel" />
 <resultMap id="syncLabelResult" class="syncLabelClass">
     <result column="FID" jdbcType="INTEGER" property="id" nullValue="0" />
     <result column="FUserName" jdbcType="VARCHAR" property="userName" />
     <result column="FBookId" jdbcType="LONG" property="bookId" />
     <result column="FRestored" jdbcType="INTEGER" property="restored" />
     <result column="FLabel" jdbcType="VARCHAR" property="label" />
     <result column="FMirror" jdbcType="VARCHAR" property="mirror" />
     <result column="FSyncCount" jdbcType="INTEGER" property="syncCount" />
     <result column="FLastModifyTime" jdbcType="TIMESTAMP" property="lastModifyTime" />
 resultMap>

 <sql id="selectSyncLabelForm">
  
 sql>

 <insert id="addSyncLabel" parameterClass="syncLabelClass">
    
    <selectKey keyProperty="id" resultClass="int">
       SELECT LAST_INSERT_ID() as value 
    selectKey>
 insert>

 <select id="listSyncLabel" parameterClass="java.util.Map" resultMap="syncLabelResult">
  <include refid="selectSyncLabelForm"/>
  <dynamic prepend="WHERE">
   <isNotEmpty property="appName" prepend="AND">
    FAppName = #appName#
   isNotEmpty>
   <isNotEmpty property="udid" prepend="AND">
    FUDID = #udid#
   isNotEmpty>
   <isNotEmpty property="bookId" prepend="AND">
    FBookId = #bookId#
   isNotEmpty>
  dynamic>
 select>

 <select id="getSyncLabelByLabel" parameterClass="String" resultMap="syncLabelResult">
  <include refid="selectSyncLabelForm"/>
  where FLabel = #label# limit 0,1
 select>

 <update id="modifySyncLabel" parameterClass="syncLabelClass">
  update t_sync_label
  set FLabel = #label:VARCHAR#, FTimestamp = #timestamp:LONG#,
  FLastModifyTime = #lastModifyTime:TIMESTAMP#,
  FVersion = #version#,
  fmirror = #mirror#,
  FSyncCount = #syncCount#,
  FBookId = #bookId#, FRestored = #restored#
  where FID = #id:INTEGER#
 update>

 <update id="resetSyncLabel" parameterClass="java.util.Map">
  update t_sync_label set FLabel = "", FTimestamp = 0 ,fmirror = null
  <dynamic prepend="WHERE">
   <isNotEmpty property="appName" prepend="AND">
    FAppName = #appName#
   isNotEmpty>
   <isNotEmpty property="udid" prepend="AND">
    FUDID = #udid#
   isNotEmpty>
   <isNotEmpty property="bookId" prepend="AND">
    FBookId = #bookId#
   isNotEmpty>
  dynamic>
 update>

 <insert id="insertBookSyncCount" parameterClass="java.util.Map">
     insert into t_sync_book (FSyncCount, FSyncType, FTradingEntity, FCreateTime, FLastModifyTime)
     values (#syncCount#, #syncType#, #bookId#, now(), now())
 insert>

 <delete id="deleteLabel" parameterClass="java.lang.Long">
  DELETE FROM t_sync_label WHERE FID = #labelId#
 delete>
sqlMap>

在mybatis中是这样的



<mapper namespace="com.money.movedata.mapper.SyncLabelDao">
 <resultMap id="syncLabelResult" type="com.money.movedata.entity.SyncLabel">
     <result column="FID" jdbcType="INTEGER" property="id" />
     <result column="FUserName" jdbcType="VARCHAR" property="userName" />
     <result column="FBookId" jdbcType="BIGINT" property="bookId" />
     <result column="FRestored" jdbcType="INTEGER" property="restored" />
     <result column="FLabel" jdbcType="VARCHAR" property="label" />
     <result column="FMirror" jdbcType="VARCHAR" property="mirror" />
     <result column="FSyncCount" jdbcType="INTEGER" property="syncCount" />
     <result column="FLastModifyTime" jdbcType="TIMESTAMP" property="lastModifyTime" />
 resultMap>

 <sql id="selectSyncLabelForm">
  
 sql>

 
 <insert id="addSyncLabel" parameterType="SyncLabel">
     
     <selectKey keyProperty="id" resultType="int">
       SELECT LAST_INSERT_ID() as value 
     selectKey>
 insert>

 <select id="listSyncLabel" parameterType="java.util.Map" resultMap="syncLabelResult">
  <include refid="selectSyncLabelForm"/>
  <where>
   <if test="appName != null and appName != ''">
    FAppName = #{appName}
   if>
   <if test="udid != null and udid != ''">
    and FUDID = #{udid}
   if>
   <if test="bookId != null and bookId != ''">
    and FBookId = #{bookId}
   if>
  where>
 select>

 <select id="getSyncLabelByLabel" parameterType="String" resultMap="syncLabelResult">
  <include refid="selectSyncLabelForm"/>
  where FLabel = #{label} limit 0,1
 select>

 <update id="modifySyncLabel" parameterType="SyncLabel">
  update t_sync_label
  set FLabel = #{label,jdbcType=VARCHAR}, FTimestamp = #{timestamp,jdbcType=BIGINT},
  FLastModifyTime = #{lastModifyTime,jdbcType=TIMESTAMP},
  FVersion = #{version},
  fmirror = #{mirror},
  FSyncCount = #{syncCount},
  FBookId = #{bookId}, FRestored = #{restored}
  where FID = #{id,jdbcType=INTEGER}
 update>
 <update id="resetSyncLabel" parameterType="java.util.Map">
  update t_sync_label set FLabel = "", FTimestamp = 0 ,fmirror = null
  <where>
   <if test="appName != null and appName != ''">
    FAppName = #{appName}
   if>
   <if test="udid != null and udid != ''">
    and FUDID = #{udid}
   if>
   <if test="bookId != null and bookId != ''">
    and FBookId = #{bookId}
   if>
  where>
 update>

 <insert id="insertBookSyncCount" parameterType="java.util.Map">
     insert into t_sync_book (FSyncCount, FSyncType, 
     FTradingEntity, FCreateTime, FLastModifyTime)
     values (#{syncCount}, #{syncType}, #{bookId}, now(), now())
 insert>

 <delete id="deleteLabel" parameterType="java.lang.Long">
  DELETE FROM t_sync_label WHERE FID = #{labelId}
 delete>
mapper>

版权声明:本文为博主原创文章,转载本博文章须在文章明显处注明原文的链接和作者信息,便于读者找到原文的更新版

你可能感兴趣的:(Java,ibatis,mybatis)