zoukankan      html  css  js  c++  java
  • MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL

    如果使用JDBC或者其他框架,很多时候需要你根据需求手动拼装SQL语句,这是一件非常麻烦的事情。MyBatis提供了对SQL语句动态的组装能力,而且他只有几个基本的元素,十分简单明了,即大量的判断都可以在MyBatis的映射XML文件里面配置,已达到我们需要大量代码才可以实现的功能

    动态SQL元素

    IF元素

      IF元素是我们最常用的判断语句,相当于Java中的IF语句。它常常与test属性联合使用。

        <select id="findOffice" parameterType="String" resultType="com.mrsaber.model.office">
            SELECT * FROM  ms_office WHERE 1=1
            <if test="ofName != null and ofName!=''">
                and of_name = #{ofName}
            </if>
        </select>
    

      这句话的意思是说,我们把参数ofName传递进入到映射器中,采取构造对ofName的查询。如果这个参数为空,就返回所有的office!通过MyBatis的条件语句我们可以节省许多拼接SQL的工作,把精力集中在XML的维护上。

    CHOOSE、WHEN、OTHERWISE元素

      IF元素是一种非此即彼的关系,很多时候我们所面的不是一张非此即彼的选择,会有第三种或者更多的选择,也即是说,我们需要类似于SWITCH...CASE....DEFAULT语句,而在映射器中CHOOSE、WHEN、OTHERWISE承担了这个功能。

        <select id="findOffice" parameterType="com.mrsaber.model.office" resultType="com.mrsaber.model.office">
            SELECT * FROM  ms_office
            WHERE 1=1
            <choose>
                <when test="ofName != null and ofName!=''">
                    AND of_name = #{ofName}
                </when>
                <when test="ofNo != null and ofNo!=''">
                    AND of_no = #{ofNo}
                </when>
                <otherwise>
                    AND of_addr IS NOT NULL
                </otherwise>
            </choose>
        </select>
    

      这样MyBatis就会根据参数的设置进行判断来动态组装SQL,以满足不同业务的要求。远比Hibernate和JDBC进行大量判断Java代码要清晰和明确的多。

    TRIM、WHERE、SET元素

    WHERE

      上面两组语句我们加入了一个条件“1=1”,如果没有加入这个条件就会变成一个错误语句,即WHERE AND.....

    即WHERE后面直接跟上了拼装语句的AND,是不合法的。

      但是我们可以用WHERE元素去处理SQL已达到不写该条件的效果。

        <select id="findOffice1" parameterType="String" resultType="com.mrsaber.model.office">
            SELECT * FROM  ms_office
            <where>
                <if test="ofName != null and ofName!=''">
                    and of_name = #{ofName}
                </if>
            </where>
        </select>
    

      现在,我们不用再语句中写WHERE 1=1 了,而是加入WHERE元素,系统会自动判断如果条件成立,才会加入WHERE这个SQL关键字到组装的SQL里面,否则不加入。

    TRIM

      有时我们需要去掉一些特殊的SQL语法,比如常见的and、or。而使用trim元素可以达到我们预期的效果。

        <select id="findOffice2" parameterType="String" resultType="com.mrsaber.model.office">
            SELECT * FROM  ms_office
            <trim prefix="WHERE" prefixOverrides="AND">
                <if test="ofName != null and ofName!=''">
                    AND of_name = #{ofName}
                </if>
            </trim>
        </select>
    

      tirm元素意味着我们要去掉一些特殊的字符串,prefix代表的是语句的前缀,而prefixOverrides代表的是你需要去掉的那种字符串,上面写法与WHERE是等效的

    SET

      我们需要更新一个对象时,如果我们发送所有的属性去更新一遍,对网络带宽消耗较大,性能最佳的办法是把主键和更新字段的值传递给SQL更新即可。例如office表中有一个主键和两个字段,如果一个个去更新需要写2条SQL,如果有1000个字段呢?显示是不方便的。在MyBatis中,我们常常可以使用set元素来完成这些功能。

      也即是说我们如果只更新一个对象的某几个字段时,可以使用SET元素来实现

        <update id="findOffice2" parameterType="com.mrsaber.model.office" >
            UPDATE ms_office
            <set>
                <if test="ofName != null and ofName!=''">
                    of_name = #{ofName}
                </if>
                <if test="ofAddr != null and ofAddr!=''">
                    of_addr = #{ofAddr}
                </if>
            </set>
            where  of_No = #{ofNo}
        </update>

    FOREACH

      显然foreach是一个循环语句,它的作用时遍历集合,它能够很好的支持数组、List、Set接口的集合,对此提供遍历的功能。

      在数据库中,数据字典是经常使用的内容,比如在用户表中,性别可以分为男、女或者未知,我们把性别作为一个字典,定义如下:

      1——男,2——女,0——未知

      实际工作中,用户可能查找非未知性别的用户,也可能查找性和未知性别的用户,或者男性和未知性别的用户等,具体的参数需要使用foreach元素去确定。

        <select id="findUser"  resultType="com.mrsaber.model.user">
            SELECT * FROM  ms_user WHERE user_sex IN
            <foreach collection="sexList" item="sex" index="index" open="(" separator="," close=")">
                #{sex}
            </foreach>
        </select>  

    说明:  

      collection配置的sexList是传递进来的参数名称,支持数组、List、Set接口的集合。

      item配置的是循环中当前的元素。

      index配置的是当期那元素在集合的位置下标。

      open和close配置的是以什么符号将这些集合元素包起来。

      separator是各个元素的间隔符。

  • 相关阅读:
    day7 面向对象 静态方法 类方法 属性方法 类的特殊成员方法 元类 反射 异常处理
    day6 面向对象 封装 继承 多态 类与实例在内存中的关系 经典类和新式类
    day5 time datetime random os sys shutil json pickle shelve xml configparser hashlib subprocess logging re正则 python计算器
    kafka常用操作命令
    linux基础
    django学习1——初识web应用程序
    mysql数据库(三)——pymysql模块
    mysql数据库(二)——表的查询
    mysql数据库(一)
    Python常用模块——re模块
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9770982.html
Copyright © 2011-2022 走看看