• 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是各个元素的间隔符。

  • 相关阅读:
    日常记Bug
    Docker部署Django
    杂记:防火墙、企业微信登陆、RestFrameWork
    Python2和Python3的编码
    杂记:Django和static,Nginx配置路径,json_schema
    xlwt模块的使用
    企业微信登陆
    markdown八条基础语法
    webstorm 添加markdown支持
    【electron系列之二】复制图片
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9770982.html
Copyright © 2020-2023  润新知