最近项目中要从外部接收一批各种类型的档案数据,为了数据提供者不用每种类型都调不同接口,所以做一个通用的数据接入接口,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的顺序应该是一致的。
有问题欢迎大家留言交流