mybatis 通过list<Map>,插入或更新数据到表中

xml文件里的sql语句写法:

插入或更新,表示在插入数据前,先判断在表中有没有数据,有的话,直接更新,没有的话直接插入。
这个例子是用一个mybatis方法来实现,避免了mybatis多次连接数据库查询数据造成的耗时。
这个例子里是循环list里的每个map,每个map执行一次插入更新。相对来说慢了点。
在mysql中有一种插入更新的写法:
replace into table 写法,mysql会自动的根据主键或唯一索引,或者联合索引,判断是待插入的数据是否在表中已存在,如果已存在,就更新,否则插入。
在下一篇博客中,会给出批量更新插入表的方法。

<insert id="insertOrgTransFee" parameterType="java.util.Map">
	  	<selectKey keyProperty="count" resultType="int" order="BEFORE">
		    select count(*) as count from org_transaction_fee_result 
	  		where 
	  			organization_id=#{org_id} 
		  		and eng_name=#{Code} 
		  		and month=#{Date}
	  </selectKey>
  		
  		<if test="count==0">
  			insert into org_transaction_fee_result
  			<foreach collection="maps" item="value" index="key" open="(" separator="," close=")">
            <if test='key!="count"'>
  					${key}
  				</if>
	        </foreach>
	        values
	        <foreach collection="maps" item="value" index="key" open="(" separator="," close=")">
	          	  <if test='key!="count"'>
  					  #{value}
  				</if>
	        </foreach>
  		</if>
  		<if test="count!=0">
  			update org_transaction_fee_result
  				set
  				<foreach collection="maps" item="value" index="key" separator=",">
  				  <if test='key!="count"'>
  					${key}=#{value}
  				</if>
		        </foreach>
		        where 
	  			organization_id=#{org_id} 
		  		and eng_name=#{Code} 
		  		and month=#{Date}
  		</if>
  </insert>
  

利用selectorKey做前置查询,注意order="BEFORE"标识为前置查询,keyProperty=“count”标识将查询结果缓存到count,下面会用到这个count的结果。
如果count0标识没有这条记录,那么就直接插入,用foreach循环map的每个kv,其中collection中的maps标识方法里的参数的别名,item标识map的value,index标识map的key,separator标识每次循环一次后,在后面加一个逗号
注意下面的,因为表没有count这个字段,所以在每次循环时,要把这个排除掉。
如果count
1,标识有数据,要更新该条数据。

Mapper接口中对应的方法:

/**
	 * 插入org_transaction_fee_result
	 * @param maps
	 */
	void insertOrgTransFee(@Param(value="maps")Map<String,Object> maps,@Param(value="org_id")String org_id,
						   @Param(value="Code")String Code,@Param(value="Date")String Date);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值