日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mybatis_user_guide(5) 动态 SQL

發(fā)布時間:2023/12/3 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis_user_guide(5) 动态 SQL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【-1】README

1)本文全文總結于?http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html


【0】動態(tài) SQL 元素和使用 JSTL 或其他類似基于 XML 的文本處理器相似。在 MyBatis 之前的版本中,有很多的元素需要來了解。MyBatis 3 大大提升了它們,現(xiàn)在用不到原先一半的元素就可以了。MyBatis 采用功能強大的基于 OGNL 的表達式來消除其他元素。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

【1】if 1)intro:?動態(tài) SQL 通常要做的事情是有條件地包含 where 子句的一部分。比如: <select id="findActiveBlogWithTitleLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null">AND title like #{title}</if> </select> 2)如果想可選地通過“title”和“author”兩個條件搜索該怎么辦呢? 首先,改變語句的名稱讓它更具實際意義;然后只要加入另一個條件即可。 <select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <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>
【2】choose、when、otherwise 1)intro: 有些時候,我們不想用到所有的條件語句,而只想從中擇其一二。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。
<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>
【3】trim,where,set 1)?現(xiàn)在考慮回到“if”示例,這次我們將“ACTIVE = 1”也設置成動態(tài)的條件,看看會發(fā)生什么。 <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> 2)problem+solutions 2.1)problem:?如果這些條件沒有一個能匹配上將會怎樣?最終這條 SQL 會變成這樣: SELECT * FROM BLOG WHERE 這會導致查詢失敗。如果僅僅第二個條件匹配又會怎樣?這條 SQL 最終會是這樣:
SELECT * FROM BLOG WHERE AND title like someTitle 2.2)solutions:MyBatis 有一個簡單的處理 <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> 對以上代碼的分析(Analysis):

A1)where 元素知道只有在一個以上的if條件有值的情況下才去插入“WHERE”子句。而且,若最后的內容是“AND”或“OR”開頭的,where 元素也知道如何將他們去除。

A2)如果 where 元素沒有按正常套路出牌,我們還是可以通過自定義 trim 元素來定制我們想要的功能。比如,和 where 元素等價的自定義 trim 元素為:

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

A3)prefixOverrides 屬性會忽略通過管道分隔的文本序列(注意此例中的空格也是必要的)。它帶來的結果就是所有在 prefixOverrides 屬性中指定的內容將被移除,并且插入 prefix 屬性中指定的內容。


3)類似的用于動態(tài)更新語句的解決方案叫做 set。set 元素可以被用于動態(tài)包含需要更新的列,而舍去其他的。比如: <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> 對以上代碼的分析(Analysis):?這里,set 元素會動態(tài)前置 SET 關鍵字,同時也會消除無關的逗號,因為用了條件語句之后很可能就會在生成的賦值語句的后面留下這些逗號。
4)若你對等價的自定義 trim 元素的樣子感興趣,那這就應該是它的真面目: trim prefix="SET" suffixOverrides=",">... </trim> Attention)注意這里我們忽略的是后綴中的值,而又一次附加了前綴中的值。
【4】foreach 1)intro:?動態(tài) SQL 的另外一個常用的必要操作是需要對一個集合進行遍歷,通常是在構建 IN 條件語句的時候。比如: <select id="selectPostIn" resultType="domain.blog.Post">SELECT *FROM POST PWHERE ID in<foreach item="item" index="index" collection="list"open="(" separator="," close=")">#{item}</foreach> </select>

對以上代碼的分析(Analysis):foreach 元素的功能是非常強大的,它允許你指定一個集合,聲明可以用在元素體內的集合項和索引變量。它也允許你指定開閉匹配的字符串以及在迭代中間放置分隔符。這個元素是很智能的,因此它不會偶然地附加多余的分隔符。

Attention)你可以將任何可迭代對象(如列表、集合等)和任何的字典或者數(shù)組對象傳遞給foreach作為集合參數(shù)。當使用可迭代對象或者數(shù)組時,index是當前迭代的次數(shù),item的值是本次迭代獲取的元素。當使用字典(或者Map.Entry對象的集合)時,index是鍵,item是值。


【5】bind

1)intro:?bind?元素可以從 OGNL 表達式中創(chuàng)建一個變量并將其綁定到上下文。比如:

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

【6】Multi-db vendor support

1)intro: 一個配置了“_databaseId”變量的 databaseIdProvider 對于動態(tài)代碼來說是可用的,這樣就可以根據(jù)不同的數(shù)據(jù)庫廠商構建特定的語句。比如下面的例子:

<insert id="insert"><selectKey keyProperty="id" resultType="int" order="BEFORE"><if test="_databaseId == 'oracle'">select seq_users.nextval from dual</if><if test="_databaseId == 'db2'">select nextval for seq_users from sysibm.sysdummy1"</if></selectKey>insert into users values (#{id}, #{name}) </insert>

【7】動態(tài) SQL 中可插拔的腳本語言

1)intro:?MyBatis 從 3.2 開始支持可插拔的腳本語言,因此你可以在插入一種語言的驅動(language driver)之后來寫基于這種語言的動態(tài) SQL 查詢。

2)可以通過實現(xiàn)下面接口的方式來插入一種語言:

public interface LanguageDriver {ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType);SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType); } 3)一旦有了自定義的語言驅動,你就可以在 mybatis-config.xml 文件中將它設置為默認語言: <typeAliases><typeAlias type="org.sample.MyLanguageDriver" alias="myLanguage"/> </typeAliases> <settings><setting name="defaultScriptingLanguage" value="myLanguage"/> </settings> 4)除了設置默認語言,你也可以針對特殊的語句指定特定語言,這可以通過如下的?lang?屬性來完成: <select id="selectBlog" lang="myLanguage">SELECT * FROM BLOG </select> 5)或者在你正在使用的映射中加上注解?@Lang?來完成: public interface Mapper {@Lang(MyLanguageDriver.class)@Select("SELECT * FROM BLOG")List<Blog> selectBlog(); } Attention)

A1)可以將 Apache Velocity 作為動態(tài)語言來使用,更多細節(jié)請參考 MyBatis-Velocity 項目。

A2)你前面看到的所有 xml 標簽都是默認 MyBatis 語言提供的,它是由別名為?xml?語言驅動器?org.apache.ibatis.scripting.xmltags.XmlLanguageDriver?驅動的。


總結

以上是生活随笔為你收集整理的mybatis_user_guide(5) 动态 SQL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。