zoukankan      html  css  js  c++  java
  • Mybaties——动态sql

    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

    如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

    • if
    • choose (when, otherwise)
    • trim (where, set)
    • foreach

    理解:在sql层面执行逻辑代码

    1. if

      根据不同的条件(包括无条件)进行查询,大大降低了代码的冗余

          <select id="queryByIf" parameterType="map" resultType="userBean">
              SELECT * FROM user WHERE 1=1
              <if test="UId != null">
                  AND UId = #{UId}
              </if>
              <if test="UName != null">
                  AND UName = #{UName}
              </if>
          </select>
      

      注:(1).这里resultType写的是集合中的元素类型,并不是集合本身
      (2).test中的条件可以通过and连接

    2. chose,when,otherwise

      我们不想使用所有的条件,而只是想从多个条件中选择一个使用。

          <select id="queryByIf" parameterType="map" resultType="userBean">
              SELECT * FROM user WHERE
              <choose>
                  <when test="UId != null">
                      UId = #{UId}
                  </when>
                  <when test="UName != null">
                      UName = #{UName}
                  </when>
                  <otherwise>
                      1=1
                  </otherwise>
              </choose>
          </select>
      

      注:这个语句类似swith,choose->switch,when->case,otherwise->default

    3. trim、where、set

      where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

      set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。

      trim可以完成对两者的实现与优化

      where使用:

          <select id="queryByIf" parameterType="map" resultType="userBean">
              SELECT * FROM user
              <where>
                  <if test="UName != null">
                      AND UState = #{UState}
                  </if>
                  <choose>
                      <when test="UId != null">
                          AND UId = #{UId}
                      </when>
                      <otherwise>
                          AND 1=1
                      </otherwise>
                  </choose>
              </where>
          </select>
      

      注:这里的where写了之后,原句中的where就不用写了,在代码运行过程,where标签能够自动补上where,并且去除不需要的AND(不会补上)

      set使用:

          <update id="updateById" parameterType="map">
              UPDATE user
              <set>
                  <if test="UState != null">UState = #{UState},</if>
                  <choose>
                      <when test="UName != null">
                          UName = #{UName},
                      </when>
                      <when test="USet != null">
                          USet = #{USet},
                      </when>
                  </choose>
              </set>
              WHERE UId = #{UId}
          </update>
      

      注:这里的set写了之后,原句中的set也会自动补全,并且去除不需要的','(不会补上)

      trim的定义格式:

      实现where

      <trim prefix="WHERE" prefixOverrides="AND |OR ">
        ...
      </trim>
      

      实现set

      <trim prefix="SET" suffixOverrides=",">
        ...
      </trim>
      
    4. foreach使用

      动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)

          <select id="queryListByForeach" parameterType="map" resultType="userBean">
              SELECT * FROM user
              <where>
                  <foreach collection="USets" item="item" open="(" separator="OR" close=")">
                      USet = #{item}
                  </foreach>
              </where>
          </select>
      

      说明:主要解释一下foreach中的几个参数,这里collection是map中的一个集合,Uset为集合中的一个参数(名字随意),open定义了迭代开始所放置的字符串,separator定义的是迭代时的分隔符,close定义了迭代结束放置的字符串

    5. 补充:sql片段
      类似于前端组件的概念
      通过<sql id="">定义组件,通过<include refid="">引用组件
      注意:
      (1). 最好基于单表来定义SQL片段
      (2). 不要存在where标签

  • 相关阅读:
    bzoj4010 [HNOI2015]菜肴制作
    PHP--------TP中的ajax请求
    二维数组去重
    手机号138-0013-8000格式存储
    spring4-2-bean配置-1-依赖注入
    spring4-1-Spring的简单介绍
    Result Grouping / Field Collapsing-结果分组
    vim自动补全
    vim配置-程序员【转】
    服务端程序设计和实现总结 【转】
  • 原文地址:https://www.cnblogs.com/Arno-vc/p/13374164.html
Copyright © 2011-2022 走看看