【算法】⽤java实现mysql的insertorupdate
楼主使⽤的 sqlserver 数据库,不⽀持 insert or uodate,但是楼主需要完成批量的数据操作,从前端拿到数据集合,从数据库拿到已有的数据集合,进⾏⽐对,如果主键相同并且其他字段不同,则进⾏更新,如果所有字段都相同即忽略,其他情况就都是插⼊,以下的图是数据⽰例:
【⽅法⼀】
这⾥说明⼀下,由于是因为使⽤了sqlerver 数据库,数据相同的情况下进⾏update 会返回1 也就是数据库仍然会进⾏⼀次操作。在mysql ⾥则会返回0,所以如果是使⽤的mysql,就不⽤考虑数据相同的情况了,直接update即可
for (Map data : incomeData) { //遍历从前端拿到的数据
boolean bo_insert = false;  //标记是否做插⼊操作
boolean bo_update = false; //标记是否需要更新
boolean bo_nothing = false;
String staff_id2 = (("staff_id");
String yearmon2 = (("yearmon");
BigDecimal ratio2 ;
if (("ratio") instanceof Double) {
ratio2 = new BigDecimal((("ratio"));
}else{
ratio2 = new BigDecimal((("ratio"));
}
for (Map map : ratioList) { //遍历从数据库拿到的数据
String staff_id = (("staff_id");
String yearmon = (("yearmon");
BigDecimal ratio = (("ratio");
//主键相同且其他字段不相同,标记为更新
if (staff_id.equals(staff_id2)&&yearmon.equals(yearmon2)&&ratio2pareTo(ratio)!=0) {bo_update = true;}
//全部字段相同,标记为忽略
if (staff_id.equals(staff_id2)&&yearmon.equals(yearmon2)&&ratio2pareTo(ratio)==0) {bo_nothing = true;}
}
//不是更新操作也不是忽略操作,标记为插⼊
if (!bo_update&&!bo_nothing) {bo_insert = true;}
if (bo_insert) {//插⼊操作
}
if(bo_update){//修改操作
}
}
【⽅法⼆(推荐)】
原本的数据结构(⽰例):
[{rdproj_id:1001,yearmon:201801,staff_id:2001,ratio:0.5},{rdproj_id:1001,yearmon:201802,staff_id:2001,ratio:0.8}]现在将其改造成以下结构
{1001:{{201801:{2001:0.5}},{201802:{2001:0.8}}}}
这样我们就可以通过⼀层⼀层的 ("")⽅法来进⾏⽐较,⽐如,我现在想要⽐较的数据是
{rdproj_id:1002,yearmon:201801,staff_id:2001,ratio:0.5}
那么,很明显在第⼀层 ("1002")时就会返回null,那么,这⼀组数据可以直接判定为insert操作。
注意:在这个⽅法⾥,我没有再去忽略完全相同的记录。将其归为了update
public class MemoryContainer {
//准备⼀个内存容器
public static Map<String, Map<String, Map<String, Double>>> staffRatioMap = new HashMap<String, Map<String, Map<String, Double>>>(); //准备⼀个将list转为map
public static void putStaffRatioMap(List<Map> ratioList){
for (Map map : ratioList) {
String project_id = (String) ("rdproj_id");
String ym = (String) ("yearmon");
String staff_id = (String) ("staff_id");
Double ratio ;
if (("ratio") instanceof Double) {
ratio = (("ratio");
}else if (("ratio") instanceof Integer) {
int r = (("ratio");
if (r==0) {ratio = 0.0;}else{ratio = 1.0;}
}else {
BigDecimal r = (("ratio");
ratio = r.doubleValue();
}
Map<String, Map<String, Double>> ymmap;
Map<String, Double> smap;
if (CMYUtils.isEmpty(ymmap = (project_id))){
smap = new HashMap<String, Double>();
smap.put(staff_id, ratio);
ymmap = new HashMap<String, Map<String, Double>>();
ymmap.put(ym, smap);
MemoryContainer.staffRatioMap.put(project_id, ymmap);
} else {
if (CMYUtils.isEmpty(smap = (ym))) {
smap = new HashMap<String, Double>();
smap.put(staff_id, ratio);
ymmap.put(ym, smap);
} else {
if(CMYUtils.(staff_id))){
smap.put(staff_id,ratio);
}
}
}
}
}
}
Map<String, Map<String, Map<String, Double>>> menoryRec = MemoryContainer.staffRatioMap;
if (menoryRec.size()==0) {//如果内存中没有,查数据库,并且存⼊内存
List<Map> ratioList = businessMapper.selectStaffRatio(inDto);
MemoryContainer.putStaffRatioMap(ratioList);
menoryRec = MemoryContainer.staffRatioMap;
}
Map<String, Map<String, Double>> rec = ((0).get("rdproj_id"));
if (CMYUtils.isEmpty(rec)) { //如果第⼀层⽐对就为null,做插⼊操作
MemoryContainer.putStaffRatioMap(incomeData);
for (Map webData : incomeData) {
//insert⽅法
}
}else{
for (Map webData : incomeData) { //遍历前台拿到的数据
boolean bo_insert = true;
String webStaff = (("staff_id");
String webYearMon = (("yearmon");
Double ratioDouble;
if (("ratio") instanceof Double) {
ratioDouble = (("ratio");
}else {
if ((("ratio")==1) {
ratioDouble = 1.0;
}else{
ratioDouble = 0.0;
}
}
if (CMYUtils.(webYearMon))) {
bigdecimal转换为integerMap<String, Double> staff = (Map) (webYearMon);
if (CMYUtils.(webStaff))) {bo_insert = false;}//标记为更新操作
staff.put(webStaff, ratioDouble);//往内存存⼊数据,有则覆盖(修改),⽆则添加
}else{
Map<String,Double> sMap = new HashMap<String, Double>();
sMap.put(webStaff, ratioDouble);
rec.put(webYearMon, sMap);//往内存添加数据。
}
if (bo_insert) {
//insert⽅法
}else {
//更新⽅法
}
}
}
我在做更新或者插⼊操作的同时,内存容器 staffRatioMap 也在做同样的动作,所以,在下⼀次调⽤这个⽅法时,staffRatioMap⾥的数据和数据库是同步的,在项⽬重启前完全不需要再访问数据库了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。