1. 程式人生 > >MyBatis之動態sql語句

MyBatis之動態sql語句

一、if

if是mybatis動態SQL中的判斷元素,這個有點類似於Java的if語句,不同的是這裡的if一般常和test配合使用。if標籤一般用於非空驗證,如下例,若id為空,if標籤裡的程式碼,將不會執行,反之,則會執行中

<select id="getUser" resultMap="u" parameterType="String">
        select * from user
        <if test="address!=null and address !=''">
            WHERE address LIKE concat('%',#{address},'%')
        </if>
    </select>

二、set

set是我們在更新表的時候使用的元素,通過set元素,我們可以逐欄位的修改一條資料

在set元素中,如果遇到了逗號,系統會自動將之去除

<update id="update">
        UPDATE user
        <set>
            <if test="username!=null">
                user_name=#{username},
            </if>
            <if test="password!=null">
                password=#{password}
            </if>
        </set>
        WHERE id=#{id}
    </update>

三、if+where

在新增查詢條件的時候,經常在查詢條件之前都先添加了where 1=1,後面直接在這之後再追加and什麼什麼的。

這個“where”標籤會知道如果它包含的標籤中有返回值的話,它就插入一個‘where’。此外,如果標籤返回的內容是以AND 或OR 開頭的,則它會剔除掉

<!-- 演示動態sql-where標籤的使用情景 -->
	<select id="getUserByWhere" parameterType="user"resultType="com.mark.pojo.User">
		SELECT
		*
		FROM USER
		<!-- where會自動加上where同處理多餘的and -->
		<where>
			<!-- if標籤的使用 -->
			<if test="id != null">
				and id = #{id}
			</if>
			<if test="username != null and username != ''">
				and username LIKE '%${username}%'
			</if>
		</where>
       </select>

四、if+set

上面的對於查詢 SQL 語句包含 where 關鍵字,如果在進行更新操作的時候,含有 set 關鍵詞,我們怎麼處理呢?

這樣寫,如果第一個條件 username 為空,那麼 sql 語句為:update user u set u.sex=? where id=?

如果第一個條件不為空,那麼 sql 語句為:update user u set u.username = ? ,u.sex = ? where id=?

<!-- 根據 id 更新 user 表的資料 -->
<update id="updateUserById" parameterType="com.ys.po.User">
    update user u
        <set>
            <if test="username != null and username != ''">
                u.username = #{username},
            </if>
            <if test="sex != null and sex != ''">
                u.sex = #{sex}
            </if>
        </set>
     
     where id=#{id}
</update>

五、choose(when,otherwise) 

有時候,我們不想用到所有的查詢條件,只想選擇其中的一個,查詢條件有一個滿足即可,使用 choose 標籤可以解決此類問題。choose有點類似於Java中的switch,常常配合when和otherwise一起來使用。

在查詢條件中,如果使用者傳來了id,那麼我就查詢該id的資料,如果使用者傳來了username,那麼我就新增username的查詢條件,最後如果使用者任何一個查詢條件都沒有新增進來,那麼預設查詢條件就是查詢sex的所有資料。

如果 id 不為空,那麼查詢語句為:select * from user where  id=?

如果 id 為空,那麼看username 是否為空,如果不為空,那麼語句為 select * from user where  username=?;

如果 username 為空,那麼查詢語句為 select * from user where sex=?

<select id="selectUserByChoose" resultType="com.ys.po.User" parameterType="com.mark.po.User">
      select * from user
      <where>
          <choose>
              <when test="id !='' and id != null">
                  id=#{id}
              </when>
              <when test="username !='' and username != null">
                  and username=#{username}
              </when>
              <otherwise>
                  and sex=#{sex}
              </otherwise>
          </choose>
      </where>
  </select>

六、trim

trim有點元素替換的意思,還是上面的案例,我們可以將and替換為where

這個最終執行的sql是SELECT * FROM user where id=1

prefix:字首,prefixoverride:去掉第一個and或者是or

suffix:字尾,suffixoverride:去掉最後一個逗號(也可以是其他的標記,就像是上面字首中的and一樣)

<select id="getUser4" resultMap="u">
        SELECT * FROM user
        <trim prefix="where" prefixOverrides="and">
            AND id=1
        </trim>
    </select>

七、foreach

foreach元素用來遍歷集合,比如我想查詢多個城市的人,我的sql語句可能是這樣SELECT * FROM user WHERE address IN('西安','北京'),我在查詢的時候可能只是傳入了一個list集合,該集合中有西安和北京兩個查詢條件,那我如何將這個集合組裝成一個sql語句呢?

collection表示傳入的引數中集合的名稱,index表示是當前元素在集合中的下標,open和close則表示如何將集合中的資料包裝起來,separator表示分隔符,item則表示迴圈時的當前元素。這樣一段配置最終組合成的sql就是SELECT * FROM user
WHERE address IN('西安','北京')

<select id="getUserInCities" resultMap="u">
        SELECT * FROM user
        WHERE address IN
        <foreach collection="cities" index="city" open="(" separator="," close=")" item="city">
            #{city}
        </foreach>
    </select>

八、bind

使用bind元素我們可以預先定義一些變數,然後在查詢語句中使用

    <select id="getUserByName" resultMap="u">
        <bind name="un" value="username+'%'"></bind>
            SELECT* FROM user2 WHERE user_name LIKE #{un}
    </select>

九、SQL 片段

定義共用重複sql片段

<!-- sql片段 定義,id:片段唯一標識 -->
	<sql id="user_column">
		`id`,
		`username`,
		`birthday`,
		`sex`,
		`address`,
		`uuid2`
	</sql>

使用sql片段 

                SELECT
		<!-- sql片段的使用:include:引入sql片段,refid引入片段id -->
		<include refid="user_column" />
		FROM USER