天天看點

MyBatis的動态SQL

簡單的來說就是可以根據實時的業務需求動态的改變SQL語句。在程式還未編譯的情況下SQL語句不能确定,而是在程式運作階段并在執行過程中才能确定SQL語句,這就叫動态SQL語句。

在初級階段我們的程式進行資料庫操作時,書寫的SQL語句都是确定的,就在程式運作前就已經寫死了,我們不能根據實時業務對SQL進行實時更改,這樣可能導緻我們需要為業務編寫的SQL語句繁多,舉個例子:現在我需要根據10個不同的資料庫表字段名進行查詢,其中每個字段名都是可選的,如果不用動态SQL,使用靜态SQL我們需要實作的SQL語句有多少?數學好的可以使用全排看看需要多少?

想想如果可以在SQL中來個if語句該有多好?那隻需要編寫一條SQL語句就可以滿足需求了(美滋滋),是以動态SQL的重要性不言而喻,在如今的大資料時代,如果沒有動态SQL,業務的開發周期可想而知有多長!

接下來就看官方文檔吧!應該沒有什麼是部落格加官方文檔解決不了的。如果有那就再看幾遍!

<code>if</code>:

條件判斷,是最常用的,也是最有效的。

<code>where</code>:

where 元素隻會在子元素傳回任何内容的情況下才插入 “WHERE” 子句。而且,若子句的開頭為 “AND” 或 “OR”,where 元素也會将它們去除。

<code>set</code>:

set 元素會動态地在行首插入 SET 關鍵字,并會删掉額外的逗号(這些逗号是在使用條件語句給列指派時引入的)。通過介紹得知,set元素隻能用在修改操作。

<code>foreach</code>:

這個也是比較重要的元素,重點在于了解<code>collection</code>屬性!

<code>choose、when、otherwise</code>:

這個就是Java中的switch-case,分支選擇。choose類似于switch代碼塊,when類似于一個一個條件,otherwise則為最後預設的條件。

<code>trim</code>:

這個元素千萬别以為他是簡單“去空格”(一開始我也是這樣認為的),他的功能非常強大,但是卻不常用,我們可以通過自定義 trim 元素來定制其他動态SQL元素的功能,比如where、set...等,也許就因為太強大了,平常業務中并不需要,是以使用的不多(這就是無敵太寂寞?)。

<code>include、sql</code>:

這兩個是搭配來使用的。

sql:這個元素申請在<code>&lt;mapper&gt;</code>标簽的根下,作用是用來定義公共的SQL代碼片段,一般是表的字段名,字段名過多的話,用sql元素定義并搭配include元素使用減少代碼量。

include:包含,含有的意思,在代碼中我們使用這個元素可以讓指定讓使用了sql元素定義的代碼片段插入到SQL語句中。

<code>bind</code>:

元素允許你在 OGNL 表達式以外建立一個變量,并将其綁定到目前的上下文。一般我們常用于模糊查詢,像模糊查詢我們寫SQL時如果直接使用占位符來傳參是不行的,是以需要使用字元串拼接的方式來傳參,但是有可能導緻sql注入,是以bind元素無疑是一種較好的選擇。