MyBatis 之 動態SQL

MyBatis 提供使用 ognl 表達式動態生成 SQL的功能。sql

    1. if數組

    2. wherespa

        where 能夠自動處理掉第一個拼接條件裏的 andcode

<!-- 動態 sql 查詢用戶信息 -->
  <select id="findUserByDynamicSql" parameterType="user" resultType="user">
  	select * from users
  	<!-- where 能夠自動處理第一個 and -->
  	<where>
  	  <!-- 注意:要作不爲null 和 '' 校驗 -->
	  <if test="userId != null and userId != ''">
 	  	and users.userId = #{userId}
 	  </if>
 	  
 	  <if test="username != null and username != ''">
 	  	and users.username like '%${username}%'
 	  </if>
 	</where>
  </select>

    3. foreachxml

        foreach 能夠向 SQL 傳遞數組、List<E> 等,下面介紹一個數組的例子對象

<!-- 動態 sql 查詢用戶信息 -->
  <select id="findUserByDynamicSql" parameterType="user" resultType="user">
  	select * from users
  	<!-- where 能夠自動處理第一個 and -->
  	<where>
  	  <!-- 解析傳遞過來的多個 userId -->
  	  <!-- ids 是結合;item 是集合中的項目變量 -->
  	  <foreach collection="ids" item="id" open="userId in(" close=")" separator=",">
  	  	#{id}
  	  </foreach>
  	
  	  <!-- 注意:要作不爲null 和 '' 校驗 -->
	  <if test="userId != null and userId != ''">
 	  	and users.userId = #{userId}
 	  </if>
 	  
 	  <if test="username != null and username != ''">
 	  	and users.username like '%${username}%'
 	  </if>
 	</where>
  </select>

       運行結果:it

        

        若是上面傳遞的數組中是 pojo 對象,那麼collection 屬性名稱必須是 array(若是是傳遞 List 對象,io

        那麼collection屬性名稱是 list),而傳遞到 sql 當中的參數則是 class

        pojo.屬性名。以下:test

        index:爲數組的下標, item:數組中每一個元素的名稱,隨便定義

        open:循環開始, close:循環結束         separator:中間分隔輸出

<select id="selectUserByArray" parameterType="Object[]" resultType="user">
    select * from user 
    <where> 
        <!-- 傳遞數組 -->
        <if test="array!=null">
          <foreach collection="array" index="index" item="item" 
              open="and id in(" separator="," close=")" >
            #{item.id} 
          </foreach>
        </if>
    </where>
</select>

 4. SQL 片斷

    按照上面的 動態SQL 寫法,可能會產生不少重複的 sql。爲了重用這些 sql 減小代碼,能夠將重複的 sql 

    提取出來,使用時經過 include 引用。

    a. 定義 SQL 片斷,將 重複的 sql 抽取出來

<!-- 定義SQL 片斷 -->
  <sql id="query_user_ByUserName">
  	<if test="username != null and username != ''">
 	  and users.username like '%${username}%'
 	</if>
  </sql>
  
  <sql id="query_user_ByUserId">
  	<!-- 注意:要作不爲null 和 '' 校驗 -->
	<if test="userId != null and userId != ''">
 	  and users.userId = #{userId}
 	</if>
  </sql>
  
  <sql id="query_user_ByIdArray">
  	<!-- 解析傳遞過來的多個 userId -->
  	<!-- ids 是結合;item 是集合中的項目變量 -->
  	<foreach collection="ids" item="id" open="userId in(" close=")" separator=",">
  	  #{id}
  	</foreach>
  </sql>

    b. 在 SQL 中引用 sql 片斷,能夠對比上面所舉得例子中的代碼

<!-- 動態 sql 查詢用戶信息 -->
  <select id="findUserByDynamicSql" parameterType="user" resultType="user">
  	select * from users
  	<!-- where 能夠自動處理第一個 and -->
  	<where>
  	  <include refid="query_user_ByIdArray"></include>
  	
  	  <include refid="query_user_ByUserId"></include>
 	  
 	  <include refid="query_user_ByUserName"></include>
 	  
 	</where>
  </select>
相關文章
相關標籤/搜索