• 将ibatis迁移到mybatis3的过程记录


    ibatis迁移到mybatis3的过程记录

    场景:有些以前的老项目是使用ibatis开发的,现在有转换成mybatis3的需求。

    环境准备:需要安装Ant以下是本人的安装版本,具体怎么安装不再赘述,就是下载解压配环境变量,和maven等安装过程类似,可百度。

    工具:ibatis2mybatis 地址:https://github.com/mybatis/ibatis2mybatis

    注意下载最新的版本。不要下载release版本,最新版本功能多一点

    该工具可以帮你将ibatis 2.x sqlmap文件转换为myBatis 3.x mapper文件,该工具是使用了Ant构建任务进行XSTL转换和一些语法文字替换

    该工具下载下来使用非常简单,把你要转换的所有sqlmap文件放到source文件夹,然后在当前目录直接运行ant命令即可,转换成功的mapper文件放在了destination文件夹下。

    当然,还需要进行一些个性化配置。

    比如根据自己的需要在build.xml文件中配置转换类型;

            <!-- replace #id:NUMERIC# to #id,jdbcType=NUMERIC# etc. -->

            <replace dir="destination" includes="*.xml" token=":NUMERIC#" value=",jdbcType=NUMERIC#" encoding="UTF8"/>

            <replace dir="destination" includes="*.xml" token=":TIMESTAMP#" value=",jdbcType=TIMESTAMP#" encoding="UTF8"/>

            <replace dir="destination" includes="*.xml" token=":VARCHAR#" value=",jdbcType=VARCHAR#" encoding="UTF8"/>

            <replace dir="destination" includes="*.xml" token=":BLOB#" value=",jdbcType=BLOB#" encoding="UTF8"/>

            <replace dir="destination" includes="*.xml" token=":TIME#" value=",jdbcType=TIMESTAMP#" encoding="UTF8"/>

            <replace dir="destination" includes="*.xml" token=":FLOAT#" value=",jdbcType=FLOAT#" encoding="UTF8"/>

            <replace dir="destination" includes="*.xml" token=":INTEGER#" value=",jdbcType=INTEGER#" encoding="UTF8"/>

            <replace dir="destination" includes="*.xml" token=":CLOB#" value=",jdbcType=CLOB#" encoding="UTF8"/>

            <replace dir="destination" includes="*.xml" token=":DECIMAL#" value=",jdbcType=DECIMAL#" encoding="UTF8"/>

            <replace dir="destination" includes="*.xml" token=":VARCHAR2#" value=",jdbcType=VARCHAR#" encoding="UTF8"/>

            <!-- add any needed jdbc type here (for example :CLOB#, :FLOAT#, :REAL#, :BIT#, :INTEGER#, :DECIMAL#, :DATE#, :TIME#, .... )

            <replace dir="destination" includes="*.xml" token=":???#" value=",jdbcType=???#" encoding="UTF8"/>

    还有需要在migrate.xstl文件中做一些个性化配置,具体可以查阅XSLT相关语法。

    比如针对dynamic做一些处理,当前面有where 1=1 和没有where 1=1 存在时转换方法是不一样的。

    <xsl:template match="dynamic">

        <xsl:choose>

            <xsl:when test="contains(@prepend, 'where')">

                <xsl:element name="where">    

                    <xsl:apply-templates/>

                </xsl:element>

            </xsl:when>

            <xsl:otherwise >

                <xsl:apply-templates/>

            </xsl:otherwise>

        </xsl:choose>

    </xsl:template>

    还有针对isNotEqual的处理要自己补充:

    <xsl:template match="isNotEqual">

        <xsl:element name="if">

            <xsl:attribute name="test">

                <xsl:value-of select="@property" /><xsl:text> != '</xsl:text> <xsl:value-of select="@compareValue" /><xsl:text>'.toString()</xsl:text>

            </xsl:attribute>

            <xsl:value-of select="@prepend" />

            <xsl:apply-templates/>

        </xsl:element>

    </xsl:template>

    当出现如下情况时isEmpty isNotEmpty分为两种情况,一种是多参数时的转换,一种是只有一个默认参数时的转换,一个参数时的情况如下

    需要配置如下代码:

    <xsl:template match="isNotEmpty">

        <xsl:element name="if">

            <xsl:attribute name="test">

                <xsl:if test="substring-before(@property, '.')">

                    <xsl:value-of select="substring-before(@property, '.')" /><xsl:text> != null and </xsl:text>

                </xsl:if>

            <xsl:choose>

                <xsl:when test="not(@property)">

                 <xsl:text>_parameter</xsl:text>

                </xsl:when>

                <xsl:otherwise >

                 <xsl:value-of select="@property" />    

                </xsl:otherwise>

             </xsl:choose>

            <xsl:text> != null and </xsl:text>

            <xsl:choose>

                <xsl:when test="not(@property)">

                 <xsl:text>_parameter</xsl:text>

                </xsl:when>

                <xsl:otherwise >

                 <xsl:value-of select="@property" />    

                </xsl:otherwise>

             </xsl:choose>

            <xsl:text> != ''</xsl:text>

        </xsl:attribute>

            <xsl:value-of select="@prepend" />

            <xsl:apply-templates/>

        </xsl:element>

    </xsl:template>

    <xsl:template match="isEmpty">

        <xsl:element name="if">

            <xsl:attribute name="test">

                <xsl:if test="substring-before(@property, '.')">

                    <xsl:value-of select="substring-before(@property, '.')" /><xsl:text> != null and </xsl:text>

                </xsl:if>

                <xsl:choose>

                <xsl:when test="not(@property)">

                 <xsl:text>_parameter</xsl:text>

                </xsl:when>

                <xsl:otherwise >

                 <xsl:value-of select="@property" />    

                </xsl:otherwise>

             </xsl:choose>

                <xsl:text> == null or </xsl:text>

                <xsl:choose>

                <xsl:when test="not(@property)">

                 <xsl:text>_parameter</xsl:text>

                </xsl:when>

                <xsl:otherwise >

                 <xsl:value-of select="@property" />    

                </xsl:otherwise>

             </xsl:choose>

                <xsl:text> == ''</xsl:text>

            </xsl:attribute>

            <xsl:value-of select="@prepend" />

            <xsl:apply-templates/>

        </xsl:element>

    </xsl:template>

    Xstl中关于是否是null的判断语法格式如下:

    <xsl:if test=" USERNAME ">

    USERNAME is not null

    </xsl:if>

    <xsl:if test="not(USERNAME)">

    USERNAME is null

    </xsl:if>

    <xsl:if test="USERNAME =''">

    USERNAME is empty string

    </xsl:if>

    <xsl:if test="USERNAME!=''">

    USERNAME is not empty string

    </xsl:if>

    另外遇到mybatis中传参数的几个小问题:

    1 MyBatis 判断条件为等于的时候,常量需要加 .toString() 来转换,因为mybatis会把' '解析为Char,而传入的是String类型,java是强类型语言,所以不等。

    以下8,2,3,4,5均可以,6 直接报语法错误,unitId == '1' jcbh == '7' unitId=1 jcbh=7 时也不会执行,9也不会执行。

         <if test='tblx != null and tblx== "8" '>

                    AND tblx = #{tblx,jdbcType=VARCHAR}

                </if>    

    <if test="unitId!=null and unitId == '1' ">

                    AND unit_id=#{unitId,jdbcType=INTEGER}

                </if>

    <if test="jctbisreturn!=null and jctbisreturn == '2'.toString()" >

                    AND jctbisreturn=#{jctbisreturn,jdbcType=INTEGER}

                </if>

                <if test="userId!=null and userId == 3 ">

                    AND user_id=#{userId,jdbcType=INTEGER}

                </if>

                <if test="townCode!=null and townCode!='4'.toString()">

                    AND town_code=#{townCode,jdbcType=VARCHAR}

                </if>

                <if test="xzqdm!=null and xzqdm=='5'.toString()">

                    AND xzqdm=#{xzqdm,jdbcType=VARCHAR}

         </if>

         <if test="xmc!=null and xmc==6.toString()">

                    AND xmc=#{xmc,jdbcType=VARCHAR}

                </if>

    <if test="jcbh != null and jcbh == '7' ">

                    AND jcbh = #{jcbh,jdbcType=VARCHAR},

                </if>

        <if test="townCode!=null and townCode!='9'">

                    AND town_code=#{townCode,jdbcType=VARCHAR}

                </if>

    另外:

    <if test="townCode!=null and townCode==''">

                    AND town_code=#{townCode,jdbcType=VARCHAR}

    </if>

    <if test="townCode!=null and townCode==''.toString()">

                    AND town_code=#{townCode,jdbcType=VARCHAR}

                </if>

    当输入 String townCode="" 上面的两个语句都可以执行,当为空字符串时可以不用''.toString(),可以简写为''即可

    2 MyBatis在使用单个参数进行if条件判断的时候,如果直接使用参数本身,则会报出:There is no getter for property named ... 的异常,比如

        <select id="testStringParam2" resultMap="BaseResultMap">

            SELECT

            *

            FROM j_jctb

            <where>

                <if test="tblx!= null and tblx!= ''">

                    AND tblx = #{value,jdbcType=VARCHAR}

                </if>

            </where>

        </select>

    正确的方法是应该用"_parameter"来代替需要判断的参数:

        <select id="testStringParam2" resultMap="BaseResultMap">

            SELECT

            *

            FROM j_jctb

            <where>

                <if test="_parameter != null and _parameter != ''">

                    AND tblx = #{value,jdbcType=VARCHAR}

                </if>

            </where>

        </select>

    当然,还有一种方法就是在Mapper接口中给定参数名,如:

    JJctb testStringParam2(String tblx) throws Exception ;

    改为:

    JJctb testStringParam2(@Param("tblx") String tblx) throws Exception ;

    中途遇到关于mybatis传递多个实体参数的问题,可采用如下写法:以@Param绑定,以对象名.(点)对象属性名的方式调用就可以了。

        abstract JJctb testStringParam3(

    @Param("jctb") JJctb jctb ,

    @Param("yuser") YUser yuser,

    @Param("tblx") String tblx) throws Exception ;

        <select id="testStringParam3" resultMap="BaseResultMap">

            SELECT

            *

            FROM j_jctb

            <where>

             <if test="jctb.jcbh != null and jctb.jcbh != ''">

                    AND jcbh = #{jctb.jcbh,jdbcType=VARCHAR}

                </if>

                <if test="yuser.username != null and yuser.username != ''">

                    AND username = #{yuser.username,jdbcType=VARCHAR}

                </if>

                <if test="tblx != null and tblx != ''">

                    AND tblx = #{tblx,jdbcType=VARCHAR}

                </if>

                

            </where>

        </select>

    参考博文:http://blog.csdn.net/lanxuezaipiao/article/details/52902074

    http://blog.csdn.net/shenzhenNBA/article/details/46673327

  • 相关阅读:
    Swift 泛型和闭包结合使用
    Swift中避免在多个文件中重复import相同的第三方包
    iOS AVAudioPlayer播放音频时声音太小
    python中装饰器的原理以及实现,
    python-网易云简单爬虫
    python模拟SQL语句操作文件
    python学习第二天-基本数据类型常用方法
    python学习第一天-语法学习
    iOS 出现错误reason: image not found的解决方案
    Swift as as!和as?的区别
  • 原文地址:https://www.cnblogs.com/mengjinluohua/p/8572260.html
Copyright © 2020-2023  润新知