1. 程式人生 > 實用技巧 >Mybatis學習八 (動態SQL語句)

Mybatis學習八 (動態SQL語句)

1.概述

MyBatis 的強大特性之一便是它的動態 SQL。

如果你有使用 JDBC 或其他類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句有多麼痛苦。

拼接的時候要確保不能忘了必要的空格,還要注意省掉列名列表最後的逗號。

利用動態 SQL 這一特性可以徹底擺脫這種痛苦。

通常使用動態 SQL 不可能是獨立的一部分,MyBatis 當然使用一種強大的動態 SQL

語言來改進這種情形,這種語言可以被用在任意的 SQL 對映語句中

動態 SQL 元素和使用 JSTL 或其他類似基於 XML 的文字處理器相似

在 MyBatis 之前的版本中,有很多的元素需要來了解。

MyBatis 3 大大提升了它們,現在用不到原先一半的元素就可以了。

MyBatis 採用功能強大的基於 OGNL 的表示式來消除其他元素。

2.分類

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 語句查詢時特別有用)

3.if

4.choose, when, otherwise

5.trim, where, set

6.foreach

7.bind

8.Multi-db vendor support

9.動態 SQL 中可插拔的指令碼語言

MyBatis 從 3.2 開始支援可插拔的指令碼語言,因此你可以在插入一種語言的驅動(language driver)之後來寫基於這種語言的動態 SQL 查詢。
可以通過實現下面介面的方式來插入一種語言:
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);
}

一旦有了自定義的語言驅動,你就可以在 mybatis-config.xml 檔案中將它設定為預設語言:

<typeAliases>
  <typeAlias type="org.sample.MyLanguageDriver" alias="myLanguage"/>
</typeAliases>
<settings>
  <setting name="defaultScriptingLanguage" value="myLanguage"/>
</settings>

除了設定預設語言,你也可以針對特殊的語句指定特定語言,這可以通過如下的lang屬性來完成:

<select id="selectBlog" lang="myLanguage"> SELECT * FROM BLOG </select>

或者在你正在使用的對映中加上註解@Lang來完成:

public interface Mapper {
  @Lang(MyLanguageDriver.class)
  @Select("SELECT * FROM BLOG")
  List<Blog> selectBlog();
}

學習來源:https://www.yiibai.com/mybatis/mybatis-dynamic-sql.html#article-start