mybatis通用批量json数据插入或更新实现

最近项目中要从外部接收一批各种类型的档案数据,为了数据提供者不用每种类型都调不同接口,所以做一个通用的数据接入接口,orm框架用的mybaits,

mapper接口如下:

public interface DataAccessMapper {

	public int batchInsertData(@Param("tableName") String tableName, @Param("cols") Set<String> cols, @Param("data") List<Map<String, Object>> data);

}

mapper.xml文件中

<insert id="batchInsertData">
        insert into ${tableName}
        <foreach collection="cols" item="col" open="(" close=")" separator=",">
            ${col}
        </foreach>
        values
        <foreach collection="data" item="map" separator=",">
            (
             <foreach collection="map.entrySet()" item="value" index="key" separator=",">
                 #{value}
             </foreach>
            )
        </foreach>
        ON DUPLICATE KEY UPDATE
        <foreach collection="cols" item="col"  separator=",">
            ${col} = VALUES(${col})
        </foreach>
    </insert>

此处ON DUPLICATE KEY UPDATE 当主键字段已存在时自动更新其他字段,联合主键也好使

上层可以封装成hsf,webservice,mq

我们用json数据处理

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public Integer batchInsertOrUpdateData(String tableName, String jsonData){
    //将json串转为json数组
    JSONArray ja = JSONObject.parseArray(jsonData);
    if(ja !=null && ja.size()>0){
        List<Map<String,Object>> data = (List)ja;
        //任取一条数据 取到单条数据的所有key 填充sql中的column集合 因为字段名不会重复所以用set
        Set<String> cols = data.get(0).keySet();
        return dataAccessMapper.batchInsertData(tableName,cols, data);
    }
    return 0;
}

问题解惑:1、此处有人可能会说json转map后key的顺序会乱,开始我使用linkedhashmap做了转换,后来测试了很多次不用linkedhashmap也没问题,应该是mabatis中的map和set都是使用linkhash实现的,保证了顺序不乱。

注意事项:试用场景,你的数据的格式应该统一的,并且原始数据中的key的顺序应该是一致的。

有问题欢迎大家留言交流

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值