1. 程式人生 > 其它 >MyBatis中SQL寫法總結

MyBatis中SQL寫法總結

技術標籤:mybatissql

最近MyBatis使用較多,在這裡簡單總結一下MyBatis的sql寫法

說簡單⼀點mybatis就是寫原⽣sql,官⽅都說了 mybatis 的動態sql語句是基於OGNL表示式的。可以⽅便的在 sql 語句中實現某些邏輯. 總體說來mybatis 動態SQL 語句主要有以下⼏類:

  1. if 語句 (簡單的條件判斷)
  2. choose (when,otherwize) ,相當於java 語⾔中的 switch ,與 jstl 中的choose 很類似.
  3. trim (對包含的內容加上 prefix,或者 suffix 等,字首,字尾)
  4. where (主要是⽤來簡化sql語句中where條件判斷的,能智慧的處理 and or ,不必擔⼼多餘導致語法誤)
  5. set (主要⽤於更新時)
  6. foreach (在實現 mybatis in 語句查詢時特別有⽤)

一、MyBatis – if 語句

< select id="dynamicIfTest" parameterType="Blog" resultType="Blog">
	select *  from t_blog  where 1 = 1
	<if test="title != null">
		and title =  #{title}
	</if>
	<if test="
content != null"
>
and content = #{content} </if> <if test="owner != null"> and owner = #{owner} </if> </ select>

if語句十分好理解,只有提供title,content,owener,這三個引數,才會返回滿足這些條件的所有結果,這是一個非常有用的功能,如果使用JDBC就需要拼SQL語句,是非常麻煩的,相比較而言,MyBatis提供的這種動態Sql就非常的簡單

二、MyBatis --choose 語句

相當於java 語⾔中的 switch ,與 jstl 中的choose 很類似.

<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">
	select *  from t_blog where 1 = 1
	<choose>
		<when test="title != null">
			and title =  #{title}
		</when>
		<when test="content != null">
			and content =  #{content}
		</when>
		<otherwise>
			and owner = "owner1"
		</otherwise>
	</choose>
</select>

when元素表⽰當when中的條件滿⾜的時候就輸出其中的內容,跟JAVA中的switch效果差不多的是按條件的順序,當when中有條件滿⾜的時候,就會跳出choose,即所有的whenotherwise條件中,只有個會輸出,當所有的我很條件都不滿⾜的時候就輸出otherwise中的內容。所以上述語句的意思⾮常簡單,當title!=null的時候就輸出and titlte = #{title},不再往下判斷條件,當title為空且content!=null的時候就出and content = #{content},當所有條件都不滿⾜的時候就輸出otherwise中的內容。

三、MyBatis – trim

對包含的內容加上 prefix,或者 suffix 等,字首,字尾

<select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">
	select *  from t_blog
	<trim prefix="where" prefixOverrides="and |or">
		<if test="title != null">
			title =  #{title}
		</if>
		<if test="content != null">
			and content =  #{content}
		</if>
		<if test="owner != null">
			or owner =  #{owner}
		</if>
	</trim>
</select>

字尾,與之對應的屬性是prefixsuffix;可以把包含內容的⾸部某些內容覆蓋,即忽略,也可以把尾的某些內容覆蓋,對應的屬性是prefixOverridessuffixOverrides;正因為trim有這樣的功能,所以我們可以⾮常簡單的利⽤trim來代替where元素的功能。

四、MyBatis – where

主要是⽤來簡化sql語句中where條件判斷的,能智慧的處理 and or 條件

<select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">
	select *  from t_blog
	<where>
		<if test="title != null">
			title =  #{title}
		</if>
		<if test="content != null">
			and content =  #{content}
		</if>
		<if test="owner != null">
			and owner =  #{owner}
		</if>
	</where>
</ select>

where元素的作⽤是會在寫⼊where元素的地⽅輸出⼀個where,另外⼀個好處是你不需要考慮where素⾥⾯的條件輸出是什麼樣⼦的,MyBatis會智慧的幫你處理,如果所有的條件都不滿⾜那麼MyBatis就查出所有的記錄,如果輸出後是and 開頭的,MyBatis會把第⼀個and忽略,當然如果是or開頭的MyBatis也會把它忽略;此外,在where元素中你不需要考慮空格的問題,MyBatis會智慧的幫你加上。像上述⼦中,如果title=null, ⽽content != null,那麼輸出的整個語句會是select * fromt_blog where content = {content},⽽不是select * from t_blog where and content = #{content},因為MyBatis會智慧的把⾸個and 或 or 給忽略。

五、MyBatis – set

主要⽤於更新時

<update id="dynamicSetTest" parameterType="Blog">
	update t_blog
	<set>
		<if test="title != null">
			title =  #{title},
		</if>
		<if test="content != null">
			content =  #{content},
		</if>
		<if test="owner != null">
			owner =  #{owner}
		</if>
	</set>
	where id =  #{id}
</update>

set元素主要是⽤在更新操作的時候,它的主要功能和where元素其實是差不多的,主要是在包含的語前輸出⼀個set,然後如果包含的語句是以逗號結束的話將會把該逗號忽略,如果set包含的內容為空的話會出錯。有了set元素我們就可以動態的更新那些修改了的欄位。

六、MyBatis – foreach

在實現 mybatis in 語句查詢時特別有⽤

<select id="queryById" resultMap="BaseReslutMap" >
	select * FROM entity
	where id  in
	<foreach collection="userids" item="userid" index="index" open="(" separator="," close=")">
		#{userid}
	</foreach>
</select>

foreach的主要⽤在構建in條件中,它可以在SQL語句中進⾏迭代⼀個集合。foreach元素的屬性主要有item,index,collection,open,separator,close。item表⽰集合中每⼀個元素進⾏迭代時的別名index指定⼀個名字,⽤於表⽰在迭代過程中,每次迭代到的位置,open表⽰該語句以什麼開始,separator⽰在每次進⾏迭代之間以什麼符號作為分隔符,close表⽰以什麼結束,在使⽤foreach的時候最關鍵的也最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不⼀樣的,主要有⼀下3種情況:

  1. 如果傳⼊的是單引數且引數型別是⼀個List的時候,collection屬性值為list。
  2. 如果傳⼊的是單引數且引數型別是⼀個array陣列的時候,collection的屬性值為array。
  3. 如果傳⼊的引數是多個的時候,我們就需要把它們封裝成⼀個Map了,當然單引數也可以封裝map實際上如果你在傳⼊引數的時候,在MyBatis⾥⾯也是會把它封裝成⼀個Map的,map的key就是引數名所以這個時候collection屬性值就是傳⼊的List或array物件在⾃⼰封裝的map⾥⾯的key。

七、MyBatis – concat

模糊查詢

<select id="queryById" resultMap="BascResultMap" parameterType="entity">
	SELECT *  from entity
	<where>
		<if test="name!=null">
			name like  concat('%',concat(#{name},'%'))
		</if>
	</where>
</select>

八、MyBatis – sql片段

sql⽚段標籤 :通過該標籤可定義能復⽤的sql語句⽚段,在執⾏sql語句標籤中直接引⽤即可。這既可以提⾼編碼效率,還能有效簡化程式碼,提⾼可讀性。

<!--定義sql⽚段-->
<sql id="orderAndItem">
	o.order_id,o.cid,o.address,o.create_date,o.orderitem_id,i.orderitem_id,i.product_id,i.count
</sql>
<select id="findOrderAndItemsByOid" parameterType="java.lang.String" resultMap="BaseResultMap">
	select
	<!--引⽤sql⽚段-->
	<include refid="orderAndItem" />
	from ordertable o
	join orderitem i on o.orderitem_id = i.orderitem_id
	where o.order_id = #{orderId}
</select>

需要配置的屬性:id="" >>>表⽰需要改sql語句⽚段的唯⼀標識

引⽤:通過 標籤引⽤,refid="" 中的值指向需要引⽤的 中的id=“”屬性