foreach屬性-動態-mybatis中使用map類型參數,其中key為列名,value為列值
最近有個需求,就是使用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裏面隨便引用) 如果傳入參數類型為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代碼- public interface CrawDao {
- public void saveNewNews(@Param("params")Map<String, String> params);
- }
第二步,在mapper的xml文件裏對map的key進行叠代:
Xml代碼- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" " http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="us.codecraft.webmagic.dao.CrawDao">
- <insert id="saveNewNews" parameterType="java.util.Map">
- insert ignore into tb_news
- <foreach collection="params.keys" item="key" open="(" close=")" separator="," >
- ${key}
- </foreach>
- values
- <foreach collection="params.keys" item="key" open="(" close=")" separator=",">
- #{params[${key}]}
- </foreach>
- </insert>
- </mapper>
通過以上兩步就動態的獲取了列名,並對對應的列賦值。
foreach屬性-動態-mybatis中使用map類型參數,其中key為列名,value為列值