1. 程式人生 > 實用技巧 >vagrant ubuntu 18.04 static ip

vagrant ubuntu 18.04 static ip

User表結構如下:

一、動態SQL:if標籤、where標籤

  需求:使用username和gender來查詢資料,如果username為空,則只根據gender來查詢資料;如果gender為空,則只根據username來查詢資料

  如果我們不使用動態SQL來書寫SQL語句

<select id="queryUserByUsernameAndGender" resultType="com.mybatis.entity.User">
	SELECT * FROM user WHERE username=#{username} AND gender=#{gender}
</select>

  1、如果username為空,那麼SQL語句就會變成這樣,這個樣子自然是查詢不到資料的

SELECT * FROM user WHERE username='null' AND gender='female';

  2、如果gender為空,那麼SQL語句就會變成這樣,這個樣子也是查詢不到資料的

SELECT * FROM user WHERE username='xiaomao' AND gender='null';

  那麼怎麼解決上述的問題呢?這個時候就需要使用if標籤,加上了if標籤的SQL語句如下

<select id="queryUserByUsernameAndGender" resultType="com.mybatis.entity.User">
	SELECT * FROM user WHERE
	// 如果條件成立則執行if內的SQL語句
	<if test="username != null">
		username=#{username}
	</if>

	<if test="gender != null">
		AND gender=#{gender}
	</if>
</select>

  3、這個時候如果gender為空的情況下,SQL語句就變成了這樣,看樣子已經符合我們的需求了

SELECT * FROM user WHERE username='小毛';

  4、但是,如果gender為空的時候,SQL如下,這個語句明顯是錯誤的,因為多了一個AND關鍵字

SELECT * FROM user WHERE  AND gender='female';

  5、那麼如何處理這個多出來的AND關鍵字呢?這個時候我們就需要配合使用另外一個標籤,where標籤

<select id="queryUserByUsernameAndGender" resultType="com.mybatis.entity.User">
	SELECT * FROM user
	<where>
		<if test="username != null">
			username=#{username}
		</if>

		<if test="gender != null">
			AND gender=#{gender}
		</if>
	</where>
</select>

  6、到現在為止我們就可以滿足需求了,即

    username和gender都存在的情況下:以兩個條件查詢

    username存在,gender不存在的情況下,以username作為條件查詢

    username不存在,gender存在的情況下,以gender作為條件查詢

  <if>標籤:滿足該標籤的條件之後才能去拼接標籤內的SQL

  <where>標籤:如果where標籤的返回結果是以 AND 或者 OR 開頭,那麼它會幫我們剔除多餘的AND 和 OR

  

二、動態SQL:set標籤

  需求:根據id更新使用者的username和gender資訊

<update id="updateUserById">
	UPDATE user set
	<if test="username != null">
		username=#{username},
	</if>
	<if test="gender != null">
		gender=#{gender}
	</if>
	<where>
		<if test="id != null">
		  id = #{id}
		</if>
	</where>
</update>

  1、如果username為空,那麼SQL將會變成如下的樣子,這樣子的SQL沒有任何問題

UPDATE user set gender=? WHERE id = ?

  2、如果gender為空的話,那麼SQL就會變成如下的樣子,很明顯這個SQL是有問題的,因為它在username=?後面多了一個逗號

UPDATE user set username=?, WHERE id = ?

  3、要解決上面的問題,我們需要使用<set>標籤

<update id="updateUserById">
	UPDATE user
	<set>
		<if test="username != null">
			username=#{username},
		</if>
		<if test="gender != null">
			gender=#{gender}
		</if>
	</set>
	<where>
		<if test="id != null">
		  id = #{id}
		</if>
	</where>
</update>

  <set>標籤:如果set標籤內的SQL返回值以逗號結尾,那麼set標籤會剔除多餘的逗號.

三、動態SQL:choose(when,otherwise)語句

  有時候,我們不想用到所有的查詢條件,只想選擇其中的一個,查詢條件有一個滿足即可,使用 choose 標籤可以解決此類問題,類似於 Java 的 switch 語句

<select id="queryUserByOneCondition" resultType="com.mybatis.entity.User">
	SELECT * FROM user
	<where>
		<choose>
			<when test="id != null">
				id = #{id}
			</when>
			<when test="username != null">
				username = #{username}
			</when>
			<otherwise>
				address=#{address}
			</otherwise>
		</choose>
	</where>
</select>

  1、如果id滿足<when>標籤的條件,那麼SQL語句如下

SELECT * FROM user where id=?

  2、如果id不滿足<when>標籤的條件,username滿足<when>標籤的條件,那麼SQL語句如下

SELECT * FROM user where username=?

  3、如果id和username都不滿足<when>標籤的條件,那麼SQL語句如下

SELECT * FROM user where address=?

四、動態SQL:SQL片段

  有時候可能某個 sql 語句我們用的特別多,為了增加程式碼的重用性,簡化程式碼,我們需要將這些程式碼抽取出來,然後使用時通過id直接呼叫.

// 抽取SQL片段,這裡有一個id,在別的SQL語句中可以通過這個id引入SQL片段
<sql id="selectBasic">
	SELECT * FROM user
</sql>

<select id="queryUserByOneCondition" resultType="com.mybatis.entity.User">
	// 引入SQL片段,相當於是 SELECT * FROM user
	<include refid="selectBasic"></include>
	<where>
		<choose>
			<when test="id != null">
				id = #{id}
			</when>
			<when test="username != null">
				username = #{username}
			</when>
			<otherwise>
				address=#{address}
			</otherwise>
		</choose>
	</where>
</select>

  

五、動態SQL:trim標籤

  trim標記是一個格式化的標記,可以完成set或者是where標記的功能

  1、替換where的功能

<select id="queryUserByUsernameAndGender" resultType="com.mybatis.entity.User">
	SELECT * FROM user
	<where>
		<if test="username != null">
			username=#{username}
		</if>

		<if test="gender != null">
			AND gender=#{gender}
		</if>
	</where>
</select>

<select id="queryUserByUsernameAndGender" resultType="com.mybatis.entity.User">
	SELECT * FROM user
	// prefix:為trim返回的結果前面新增一個where
	// prefixOverrides:剔除trim返回的結果後面的 and 或者是 or
	<trim prefix="where" prefixOverrides="and | or">
		<if test="username != null">
			username=#{username}
		</if>

		<if test="gender != null">
			AND gender=#{gender}
		</if>
	</trim>
</select> 

  prefix:為整個的sql語句新增一個字首      

  prefixoverride:去掉第一個and或者是or

  2、替換set功能

<update id="updateUserById">
	UPDATE user
	<set>
		<if test="username != null">
			username=#{username},
		</if>
		<if test="gender != null">
			gender=#{gender}
		</if>
	</set>
	<where>
		<if test="id != null">
			id = #{id}
		</if>
	</where>
</update>

<update id="updateUserById">
	UPDATE user
	<trim prefix="set" suffixOverrides=",">
		<if test="username != null">
			username=#{username},
		</if>
		<if test="gender != null">
			gender=#{gender}
		</if>
	</trim>
	<trim prefix="where">
		<if test="id != null">
			id = #{id}
		</if>
	</trim>
</update>

  suffix:字尾  

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

六、動態SQL:foreach語句 

  1、UserMapper介面

// 批量新增,使用@Param註解之後在collection中只要寫註解對應的value值就可以了,不需要再去判斷是陣列,List,Map之類的了.
public abstract Boolean addBatch(@Param("Users") List<User> list);

// 批量刪除
public abstract Boolean deleteBatch(@Param("ids")Integer[] integers);

  2、UserMapper.xml

// 批量新增
<insert id="addBatch">
	INSERT INTO user VALUES
	<foreach collection="Users" item="user" separator=",">
		(null,#{user.username},#{user.gender},null,null)
	</foreach>
</insert>

// 批量刪除
<delete id="deleteBatch">
	DELETE FROM user WHERE id IN
	<foreach collection="ids" item="id" open="(" close=")" separator=",">
		#{id}
	</foreach>
</delete>

  collection:指定輸入物件中的集合屬性
  item:每次遍歷生成的物件
  open:在foreach返回的結果前面拼接的字串
  close:在foreach返回的結果後面拼接的字串
  separator:遍歷物件之間的分隔符

 

轉載自:https://www.cnblogs.com/ysocean/p/7289529.html