Mybatis框架:foreach迴圈遍歷欄位(為了解決動態表、動態欄位查詢資料)

gcheng.Liu發表於2018-03-30

最近由於需求,需要前端傳遞動態表名,然後根據表名動態查詢欄位,然後對其資料進行處理,匯入空間資料庫。留下腳印,已做標記!


估計這時候會有人想,查詢動態欄位返回值為tableName.*就可以了啊,的確,但是個人原因吧,不太喜歡用*來做為查詢返回欄位,而且用*會影響資料庫查詢效能。

因此才想到用foreach來迴圈遍歷所需欄位:
foreach 基本語法:標籤體內主要屬性有item、index、collection、open、separator、close

  • item:集合中元素迭代時的別名
  • index:集合中元素迭代時的索引
  • open:表示以什麼開始
  • separator:表示在每次進行迭代時的分隔符
  • close 常用語where語句中,表示以什麼結束

在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況 下,該屬性的值是不一樣的,主要有一下3種情況:

  • 如果傳入的是單引數且引數型別是一個List的時候,collection屬性值為list
  • 如果傳入的是單引數且引數型別是一個array陣列的時候,collection的屬性值為array
  • 如果傳入的引數是多個的時候,我們就需要把它們封裝成一個Map了,當然單引數也可以封裝成map,實際上如果你在傳入引數的時候,在MyBatis裡面也是會把它封裝成一個Map的,map的key就是引數名,所以這個時候collection屬性值就是傳入的List或array物件在自己封裝的map裡面的key.

針對最後一條,我們來看一下官方說法:

注意 你可以將一個 List 例項或者陣列作為引數物件傳給 MyBatis,當你這麼做的時候,MyBatis 會自動將它包裝在一個 Map 中並以名稱為鍵。List 例項將會以“list”作為鍵,而陣列例項的鍵將是“array”。

以上內容摘自部落格https://www.cnblogs.com/ningheshutong/p/6422345.html

示例(親測):

  • serviceImpl層:

  • Dao層

  • Mapper對映檔案

需要注意:

  1. foreach標籤中遍歷的內容,如果是用在列名的獲取,要用${value}獲取值,也就是直接去拼接,而不是預編譯,否則會報錯。用在條件遍歷是預編譯會更好一些(防止SQL隱碼攻擊),即#{value}。

  2. 引數為Map型別時,collection=”params.values”取的是值,而
    collection=”params.keys”取的是鍵。

  3. 不管是任何引數,@Param(“key”)註解的中key才是collection=”key”中取到的值(或者是鍵)。

以上是foreach基本用法介紹。


好了,基本用法已經掌握,這裡有一個問題,就是當不確定哪張表,因此不確定有哪些欄位,該怎麼查詢資料呢?

最初的想法是將所有columns引數和tableName引數都封裝到一個Map中,這樣在遍歷的時候就會出現tableName也會出現在查詢欄位中,當然去判斷應該也可以,只是還沒去深究,有興趣的同學可以研究一下。
還有一個思路就是既然Mybatis會將所有傳遞的引數自動封裝成Map,那麼我將所有的columns引數手動封裝,將tableName直接以String型別傳遞。
上碼:

  • service層

  • Dao層

  • Mapper對映檔案

需要注意

  • statementType=”STATEMENT” 這個引數,意思是非預編譯的,用了這個引數就不可以使用#{value}取值,必須使用${value}

這樣就實現動態表名,動態欄位查詢資料了。

僅供參考,這只是一種方法,如果大家有什麼更好的,請留言,互相學習。 謝謝大家

相關文章