Mybatis框架:foreach迴圈遍歷欄位(為了解決動態表、動態欄位查詢資料)
最近由於需求,需要前端傳遞動態表名,然後根據表名動態查詢欄位,然後對其資料進行處理,匯入空間資料庫。留下腳印,已做標記!
估計這時候會有人想,查詢動態欄位返回值為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對映檔案
需要注意:
foreach標籤中遍歷的內容,如果是用在列名的獲取,要用${value}獲取值,也就是直接去拼接,而不是預編譯,否則會報錯。用在條件遍歷是預編譯會更好一些(防止SQL隱碼攻擊),即#{value}。
引數為Map型別時,collection=”params.values”取的是值,而
collection=”params.keys”取的是鍵。不管是任何引數,@Param(“key”)註解的中key才是collection=”key”中取到的值(或者是鍵)。
以上是foreach基本用法介紹。
好了,基本用法已經掌握,這裡有一個問題,就是當不確定哪張表,因此不確定有哪些欄位,該怎麼查詢資料呢?
最初的想法是將所有columns引數和tableName引數都封裝到一個Map中,這樣在遍歷的時候就會出現tableName也會出現在查詢欄位中,當然去判斷應該也可以,只是還沒去深究,有興趣的同學可以研究一下。
還有一個思路就是既然Mybatis會將所有傳遞的引數自動封裝成Map,那麼我將所有的columns引數手動封裝,將tableName直接以String型別傳遞。
上碼:
service層
Dao層
- Mapper對映檔案
需要注意
- statementType=”STATEMENT” 這個引數,意思是非預編譯的,用了這個引數就不可以使用#{value}取值,必須使用${value}
這樣就實現動態表名,動態欄位查詢資料了。
僅供參考,這只是一種方法,如果大家有什麼更好的,請留言,互相學習。 謝謝大家
相關文章
- mybatis動態呼叫表名和欄位名MyBatis
- Python SqlAlchemy動態新增資料表欄位PythonSQL
- 動態為10g資料庫的表新增欄位,到256個欄位,hung住了?資料庫
- 如何在水晶報表中動態新增欄位
- 動態規劃最大欄位和動態規劃
- Laravel nova 建立動態資源配置欄位Laravel
- 不改表結構如何動態擴充套件欄位套件
- 如何在Spring Data MongoDB 中儲存和查詢動態欄位SpringMongoDB
- go語言將表資料動態轉成切片(欄位任意擴充)Go
- clob 欄位查詢
- mybatis自動填充時間欄位MyBatis
- 位運算-設計資料庫表的多選狀態欄位資料庫
- 根據欄位名查詢所有表
- mybatis利用example檔案進行異表欄位模糊查詢MyBatis
- MongoDB之資料查詢(欄位判斷)MongoDB
- hive將查詢資料插入表中某欄位無資料Hive
- 隨筆:MySQL 查詢事務狀態欄位說明MySql
- 給mybatis新增自動建表,自動加欄位的功能MyBatis
- MyBatis 多表聯合查詢,欄位重複的解決方法MyBatis
- java動態獲取實體類的欄位Java
- sqlserver查詢一個庫所有表的欄位名及欄位型別SQLServer型別
- SQL SERVER 資料庫查詢表和欄位資訊語句SQLServer資料庫
- SQL Server 查詢表註釋和欄位SQLServer
- 揭秘PostgreSQL:如何查詢表欄位名稱SQL
- [Mysql 查詢語句]——查詢欄位MySql
- 查詢某資料庫中所有的欄位資料庫
- mysql 查詢欄位為null或者非nullMySqlNull
- 在 Laravel 中動態 隱藏 / 顯示 API 欄位LaravelAPI
- lucene 多欄位查詢-MultiFieldQueryParser
- 查詢mysql某張表中的所有資料(欄位)型別MySql型別
- Oracle查詢資料表結構(欄位,型別,大小,備註)Oracle型別
- 如何在Oracle資料庫中查詢表和欄位說明Oracle資料庫
- EF Core3.1 CodeFirst動態自動新增表和欄位的描述資訊
- 查詢/刪除重複的資料(單個欄位和多個欄位條件)
- mybatis查詢mysql 資料庫中 BLOB欄位,結果出現亂碼MyBatisMySql資料庫
- 查詢oracle表的資訊(表,欄位,約束,索引)Oracle索引
- Oracle 動態效能表 v$session & v$process各個欄位的說明OracleSession
- java查詢資料庫,int型欄位為null的情況Java資料庫Null