Mybatis入門教程(四)之mybatis靜態sql。本站提示廣大學習愛好者:(Mybatis入門教程(四)之mybatis靜態sql)文章只能為提供參考,不一定能成為您想要的結果。以下是Mybatis入門教程(四)之mybatis靜態sql正文
推舉浏覽:
MyBatis入門進修教程(一)-MyBatis疾速入門
甚麼是靜態SQL? 靜態SQL有甚麼感化?
傳統的應用JDBC的辦法,信任年夜家在組合龐雜的的SQL語句的時刻,須要去拼接,略不留意哪怕少了個空格,都邑招致毛病。Mybatis的靜態SQL功效恰是為懂得決這類成績, 其經由過程 if, choose, when, otherwise, trim, where, set, foreach標簽,可組分解異常靈巧的SQL語句,從而進步開辟人員的效力。
上面就去感觸感染Mybatis靜態SQL的魅力吧:
1. if: 你們能斷定,我也能斷定!
作為法式猿,誰不懂 if ! 在mybatis中也能用 if 啦:
<select id="findUserById" resultType="user"> select * from user where <if test="id != null"> id=#{id} </if> and deleteFlag=0; </select>
下面例子: 假如傳入的id 不為空, 那末才會SQL才拼接id = #{id}。 這個信任年夜家看一樣就可以明確,不多說。
仔細的人會發明一個成績:“你這纰謬啊! 如果你傳入的id為null, 那末你這終究的SQL語句不就成了 select * from user where and deleteFlag=0, 這語句有成績!”
是啊,這時候候,mybatis的 where 標簽就該盛大退場啦:
2. where, 有了我,SQL語句拼接前提神馬的都是浮雲!
我們經由過程where改革一下下面的例子:
<select id="findUserById" resultType="user"> select * from user where <where> <if test="id != null"> id=#{id} </if> and deleteFlag=0; </where> </select>
有些人就要問了: “你這都是些甚麼玩藝兒! 跟下面的比擬, 不就是多了個where標簽嘛! 那這個還會不會湧現 select * from user where and deleteFlag=0 ?”
切實其實,從外面下去看,就是多了個where標簽罷了, 不外本質上, mybatis是對它做了處置,當它碰到AND或許OR這些,它曉得怎樣處置。其實我們可以經由過程 trim 標簽去自界說這類處置規矩。
3. trim : 我的地皮,我做主!
下面的where標簽,其適用trim 可以表現以下:
<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>
它的意思就是: 當WHERE後緊隨AND或則OR的時刻,就去除AND或許OR。 除WHERE之外, 其實還有一個比擬經典的完成,那就是SET。
4. set: 信我,不失足!
<update id="updateUser" parameterType="com.dy.entity.User"> update user set <if test="name != null"> name = #{name}, </if> <if test="password != null"> password = #{password}, </if> <if test="age != null"> age = #{age} </if> <where> <if test="id != null"> id = #{id} </if> and deleteFlag = 0; </where> </update>
成績又來了: “假如我只要name不為null, 那末這SQL不就成了 update set name = #{name}, where ........ ? 你那name前面那逗號會招致失足啊!”
是的,這時候候,便可以用mybatis為我們供給的set 標簽了。上面是經由過程set標簽改革後:
<update id="updateUser" parameterType="com.dy.entity.User"> update user set <set> <if test="name != null">name = #{name},</if> <if test="password != null">password = #{password},</if> <if test="age != null">age = #{age},</if> </set> <where> <if test="id != null"> id = #{id} </if> and deleteFlag = 0; </where> </update>
這個用trim 可表現為:
<trim prefix="SET" suffixOverrides=","> ... </trim>
WHERE是應用的 prefixOverrides(前綴), SET是應用的 suffixOverrides (後綴), 看明確了吧!
5. foreach: 你有for, 我有foreach, 不要認為就你才屌!
java中有for, 可經由過程for輪回, 異樣, mybatis中有foreach, 可經由過程它完成輪回,輪回的對象固然重要是java容器和數組。
<select id="selectPostIn" resultType="domain.blog.Post"> SELECT * FROM POST P WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select>
將一個 List 實例或許數組作為參數對象傳給 MyBatis,當這麼做的時刻,MyBatis 會主動將它包裝在一個 Map 中並以稱號為鍵。List 實例將會以“list”作為鍵,而數組實例的鍵將是“array”。異樣, 當輪回的對象為map的時刻,index其實就是map的key。
6. choose: 我選擇了你,你選擇了我!
Java中有switch, mybatis有choose。
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE' <choose> <when test="title != null"> AND title like #{title} </when> <when test="author != null and author.name != null"> AND author_name like #{author.name} </when> <otherwise> AND featured = 1 </otherwise> </choose> </select>
以上例子中: 當title和author都不為null的時刻, 那末選擇二選一(前者優先), 假如都為null, 那末就選擇 otherwise中的, 假如tilte和author只要一個不為null, 那末就選擇不為null的誰人。
以上所述是小編給年夜家引見的Mybatis入門教程(四)之mybatis靜態sql,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!