国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

MyBatis快速入門(三) 動態SQL

2019-11-08 01:34:19
字體:
來源:轉載
供稿:網友

動態SQL

MyBatis還有一個方便的功能就是動態SQL,可以根據條件智能生成SQL語句。這里的例子全部來自MyBatis文檔。

if標簽

下面這個例子使用了MyBatis的if元素,在標題不為空的情況下在查詢結果中包含標題的查詢。

<select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if></select>

where/trim/set標簽

如果需要在多個情況中包含某一個查詢條件。可以向下面這樣,使用choose、when、otherwise。如果使用過JSTL的話,會發現這和JSTL的條件標簽非常類似。

<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>

對于下面這個例子,如果state為空,無法生成合法的SQL語句。

<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if></select>

MyBatis自然也有相應的解決辦法。就是使用where標簽改寫。where標簽非常智能。如果標簽內部沒有合適的語句,where標簽就不會生成任何東西,防止出現錯誤語句。

<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG <where> <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if> </where></select>

有時候where標簽還不能滿足需求。這時候還可以使用trim標簽進行更高級的定制。trim標簽中的PRefix和suffix屬性會被用于生成實際的SQL語句,會和標簽內部的語句拼接。如果語句的前面或后面遇到prefixOverrides或suffixOverrides屬性中指定的值,MyBatis會自動將它們刪除。在指定多個值的時候,別忘了每個值后面都要有一個空格,保證不會和后面的SQL連接在一起。下面這個例子和where標簽完全等效。

<trim prefix="WHERE" prefixOverrides="AND |OR "> ...</trim>

還有一個set標簽用于智能執行更新語句。

<update id="updateAuthorIfNecessary"> update Author <set> <if test="username != null">username=#{username},</if> <if test="passWord != null">password=#{password},</if> <if test="email != null">email=#{email},</if> <if test="bio != null">bio=#{bio}</if> </set> where id=#{id}</update>

與它等價的trim標簽如下。

<trim prefix="SET" suffixOverrides=","> ...</trim>

foreach標簽

還有一個迭代標簽可以生成一系列值,這個標簽主要用于SQL的in語句后面。

<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>

bind標簽

bind標簽可以將非OGNL表達式值綁定到其中。下面的例子將結果映射中的值綁定到了OGNL表達式中,從而可以直接使用#{}語法訪問。

<select id="selectBlogsLike" resultType="Blog"> <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" /> SELECT * FROM BLOG WHERE title LIKE #{pattern}</select>

SQL構造類

有時候需要在java代碼中生成SQL語句。如果我們直接編寫的話會是一件非常麻煩的事情。由于Java不支持跨行字符串,所以我們要么在一行里面寫一個非常非常長的SQL語句,要么用加號拼接出一個笨拙的字符串。MyBatis提供了SQL構造類,我們可以方便的使用這個類構造出SQL語句。

下面這幾個例子同樣來自于MyBatis文檔。SQL構造類有兩種用法:匿名類和流式構造。構造完成之后,調用toString()方法即可生成對應的SQL語句。

// 匿名內部類public String deletePersonSql() { return new SQL() {{ DELETE_FROM("PERSON"); WHERE("ID = #{id}"); }}.toString();}// 流式構造public String insertPersonSql() { String sql = new SQL() .INSERT_INTO("PERSON") .VALUES("ID, FIRST_NAME", "#{id}, #{firstName}") .VALUES("LAST_NAME", "#{lastName}") .toString(); return sql;}// 如果需要條件構造,只能使用匿名類方式,注意匿名類要引用方法參數的話,參數必須聲明為final的public String selectPersonLike(final String id, final String firstName, final String lastName) { return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME"); FROM("PERSON P"); if (id != null) { WHERE("P.ID like #{id}"); } if (firstName != null) { WHERE("P.FIRST_NAME like #{firstName}"); } if (lastName != null) { WHERE("P.LAST_NAME like #{lastName}"); } ORDER_BY("P.LAST_NAME"); }}.toString();}public String deletePersonSql() { return new SQL() {{ DELETE_FROM("PERSON"); WHERE("ID = #{id}"); }}.toString();}

參考資料

MyBatis文檔 動態SQL


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇巴县| 沾化县| 武夷山市| 台前县| 镇沅| 长子县| 镇平县| 浦北县| 中江县| 高邑县| 台湾省| 怀集县| 介休市| 青岛市| 普宁市| 皮山县| 和顺县| 且末县| 临武县| 宁国市| 抚州市| 积石山| 禹城市| 闵行区| 南投县| 甘南县| 丁青县| 安庆市| 合川市| 武功县| 巍山| 原平市| 米易县| 邻水| 福贡县| 孝感市| 山阳县| 瑞昌市| 南涧| 湖南省| 申扎县|