最近遇到个需求,对现存的业务表做个数据导入接口,情况如下
1、表的数量比较多
2、根据不同表的业务,多个字段判断是否重复数据,如果重复就更新原来的数据,否则新增**
本来使用Mybatis-Plus有saveOrUpdateBatch接口就可以简单实现,奈何公司没用plus。
考虑到表的数量多,选择用一个通用的mapper接口,接收不同的表名和数据来实现。
1、首先在表中,对需要参与判断业务唯一的字段建立联合索引,并且设置为唯一索引
2、设计mapper
<!-- 自定义批量保存数据-->
<insert id="batchSaveDynamic" parameterType="java.util.Map">
INSERT INTO
<if test="tableName != null and tableName != ''">
${tableName}
</if>
(
<foreach collection="records[0].keySet()" item="column" separator=",">
${column}
</foreach>
)
VALUES
<foreach collection="records" item="record" separator=",">
(
<foreach collection="record.values()" item="value" separator=",">
#{value}
</foreach>
)
</foreach>
ON DUPLICATE KEY UPDATE
<foreach collection="records[0].keySet()" item="column" separator=",">
${column} = VALUES(${column})
</foreach>
</insert>
mapper接口
/**
* 自定义批量保存数据
*
* @param tableName 表名
* @param records 数据集合
* @return 保存数据数目
**/
int batchSaveDynamic(@Param("tableName")String tableName, @Param("records") List<Map<String,Object>> records);
其中List是需要保存的数据集合,Map中的key对应表字段,Object为对应的值,需要注意Map中的所有key,数据库表中必须存在。