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