jfinal 批量更新 merge into

一共有30个参数,写起来有点费劲,有啥其它方法实现批量更新吗?

#sql("batchsavealarm")
 merge into se_alarm_info t1
		using dual
		on (t1.clearkeyword = ?)
		when matched then
		  update
		     SET 
		         CLEARED       = ?,
		         RAISETIME     = ?,
		         CLEARTIME     = ?,
		         OPERTIME = ?
		   where clearkeyword = ? and cleared !='true'
		when not matched then
		  insert
		    (ID,
		     SWITCH,
		     STATIONTYPE,
		     CLEARKEYWORD,
		     CLEARED,
		     EMSALARMID,
		     ALARMTEXT,
		     CAUSE,
		     SOURCE,
		     SOURCETYPE,
		     RAISETIME,
		     CLEARTIME,
		     LEVELS,
		     NETYPE,
		     WBJ,
		     EQUIPNAME,
		     VENDORID,
		     EMSID,
		     LON,
		     LAT,
		     OMCALARMID,
		     FAULTBILLRULE,
		     OPERTIME,
		     hid)
		  values
		    (?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     ?,
		     SEQ_se_alarm_info.Nextval)
#end
public void saveAlarm(String filePath) {
		String sql = "clearkeyword,cleared,raisetime,cleartime,opertime,clearkeyword,id,switch,stationtype,clearkeyword,cleared,emsalarmid,alarmtext,cause,source,sourcetype,raisetime,cleartime,alarmlevel,netype,wbj,equipname,vendorid,emsid,lon,lat,omcalarmid,faultbillrule,opertime";
		try {
			// 创建CSV读对象
			CsvReader csvReader = new CsvReader(filePath, ',', Charset.forName("gbk"));
			csvReader.readHeaders(); // 跳过表头 如果需要表头的话,不要写这句。
			String[] head = csvReader.getHeaders(); // 获取表头
			List<Record> alarmlist = new ArrayList<Record>();
			while (csvReader.readRecord()) {
				Record alarm = new Record();
				// Map<String, Object> para = new HashMap<String, Object>();
				for (int i = 0; i < head.length; i++) {
					if ("alarmlevel".equals(head[i].toLowerCase())) {
						alarm.set("levels", csvReader.get(head[i]));
					} else {
						alarm.set(head[i].toLowerCase(), csvReader.get(head[i]));
					}
				}
				alarm.set("id", UUIDUtil.getUUID());
				alarm.set("opertime", DateUtil.getDateTime());
				alarmlist.add(alarm);
				// Db.update(Db.getSqlPara("alarm.savealarm", para));
			}
			Db.batch(Db.getSql("alarm.batchsavealarm"), sql, alarmlist, 5000);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		try {
			TimeUnit.HOURS.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		this.stop();
	}



评论区

JFinal

2019-01-21 16:49

先通过 getSqlPara 得到 sqlPara 对象,然后通过 sqlPara.getSql() 得到 sql 语句

然后再使用 Db.batch 带有一条 sql 以及多行参数的方法即可

wangerxiao

2019-01-21 16:54

Db.batch(Db.getSql("alarm.savealarm"), para, 1000); 大佬 para这里具体写什么

wangerxiao

2019-01-21 17:38

clearkeyword,cleared,raisetime,cleartime,opertime,clearkeyword,id,switch,stationtype,clearkeyword,cleared,emsalarmid,alarmtext,cause,source,sourcetype,raisetime,cleartime,alarmlevel,netype,wbj,equipname,vendorid,emsid,lon,lat,omcalarmid,faultbillrule,opertime,SEQ_se_alarm_info.Nextval

wangerxiao

2019-01-21 17:38

@JFinal 大佬看一下这样写对吗

JFinal

2019-01-21 17:51

@wangerxiao 由于你的 sql 中使用 #para 指令,所以 Db.getSql(...) 肯定会有异常

需要使用 Db.getSqlPara(...) 得到 SqlPara 对象,然后再通过它的 getSql() 得到 sql

DbPro 的 batch 系的方法是有使用的代码例子,打开源码看一下例子就知道怎么使用了

wangerxiao

2019-01-21 20:07

@JFinal 已经解决谢谢您

JFinal

2019-01-21 20:09

@wangerxiao 你的用法 将 getSqlPara 用于 Db.batch 还是头一次见过,有一定的创新性,赞一个

热门反馈

扫码入社