1. 程式人生 > >foreach屬性-動態-mybatis中使用map類型參數,其中key為列名,value為列值

foreach屬性-動態-mybatis中使用map類型參數,其中key為列名,value為列值

ima 符號 post gpo name ota public arr ack

最近有個需求,就是使用mybatis時,向mysql中插入數據,其參數為map類型,map裏面的key為列名,而key對應的value是該列對應的列值;問題是每次插入mysql中數據行的部分列,即map裏面key的值每次都不固定,在用mybatis時需要通過map的key作為列名。

基礎知識

對於這類問題基本思路就是用foreach標簽遍歷map,因此需要看看foreach的知識。

foreach屬性

屬性 描述

item 循環體中的具體對象。支持屬性的點路徑訪問,如item.age,item.info.details。
具體說明:若collection屬性為list或array,則item代表list或array裏面的一個元素。若collection屬性對應一個map,則item代表的是map中的value集合中的單個value
該參數為必選。
collection

foreach遍歷的對象,作為入參時,List對象默認用list代替作為鍵,數組對象有array代替作為鍵,Map對象沒有默認的鍵。也就是傳入的集合(list,array,map)的名字,這個名字可以在foreach裏面隨便引用)
當然在作為入參時可以使用@Param("params")來設置鍵,設置keyName後,list,array將會失效。 除了入參這種情況外,還有一種作為參數對象的某個字段的時候。舉個例子:
如果User有屬性List ids。入參是User對象,那麽這個collection = "ids"
如果User有屬性Ids ids;其中Ids是個對象,Ids有個屬性List id;入參是User對象,那麽collection = "ids.id"

如果傳入參數類型為map,這個入參有註解@Param("params"),則map的所有的key集合可以寫成params.keys,所有值集合可以寫成params.values。這樣foreach就可以對key集合或值集合進行叠代了。

上面只是舉例,具體collection等於什麽,就看你想對那個元素做循環。
該參數為必選。

separator 元素之間的分隔符,例如在in()的時候,separator=","會自動在元素中間用“,“隔開,避免手動輸入逗號導致sql錯誤,如in(1,2,)這樣。該參數可選。
open foreach代碼的開始符號,一般是(和close=")"合用。常用在in(),values()時。該參數可選。
close foreach代碼的關閉符號,一般是)和open="("合用。常用在in(),values()時。該參數可選。
index 在list和數組中,index是元素的序號,在map中,index是元素的key,該參數可選。

實現

有了以上基礎就可以實現我們想要的功能:

首先,在mapper對應的dao中使用@param註解,顯式指定集合參數類的別名(列表和數組有默認的別名list和array):

Java代碼 技術分享圖片
  1. public interface CrawDao {
  2. public void saveNewNews(@Param("params")Map<String, String> params);
  3. }

第二步,在mapper的xml文件裏對map的key進行叠代:

Xml代碼 技術分享圖片
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" " http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="us.codecraft.webmagic.dao.CrawDao">
  4. <insert id="saveNewNews" parameterType="java.util.Map">
  5. insert ignore into tb_news
  6. <foreach collection="params.keys" item="key" open="(" close=")" separator="," >
  7. ${key}
  8. </foreach>
  9. values
  10. <foreach collection="params.keys" item="key" open="(" close=")" separator=",">
  11. #{params[${key}]}
  12. </foreach>
  13. </insert>
  14. </mapper>

通過以上兩步就動態的獲取了列名,並對對應的列賦值。

foreach屬性-動態-mybatis中使用map類型參數,其中key為列名,value為列值