MyBatis中關於SQL的寫法總結
最近MyBatis使用較多,在這裡簡單總結一下MyBatis的sql寫法
說簡單一點mybatis就是寫原⽣sql,官方都說瞭 mybatis 的動態sql語句是基於OGNL表達式的。可以方便的在 sql 語句中實現某些邏輯.
總體說來mybatis 動態SQL 語句主要有以下幾類:
if
語句 (簡單的條件判斷)choose
(when,otherwize) ,相當於java 語⾔中的 switch ,與 jstl 中的choose 很類似.trim
(對包含的內容加上 prefix,或者 suffix 等,前綴,後綴)where
(主要是⽤來簡化sql語句中where條件判斷的,能智能的處理 and or ,不必擔心多餘導致語法誤)set
(主要⽤於更新時)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,即所有的when和otherwise條件中,隻有個會輸出,當所有的我很條件都不滿⾜的時候就輸出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>
後綴,與之對應的屬性是prefix和suffix;可以把包含內容的⾸部某些內容覆蓋,即忽略,也可以把尾的某些內容覆蓋,對應的屬性是prefixOverrides和suffixOverrides;正因為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=“”屬性
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Mybatis中xml的動態sql實現示例
- 基於mybatis 動態SQL查詢總結
- mybatis動態sql常用場景總結
- 一篇文章帶你瞭解mybatis的動態SQL
- mybatis中mapper.xml文件的常用屬性及標簽講解