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这个字段,所以在每次循环时,要把这个排除掉。
如果count1,标识有数据,要更新该条数据。
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);