我是靠谱客的博主 不安百合,最近开发中收集的这篇文章主要介绍【Java】关于采用PreparedStatement中executeBatch()方法实现批量更新或插入时数据相互覆盖的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在批量更新或插入数据的过程中,发现所写的代码没能实现批量的处理,仅查询到入库成功的一个数据,由此对这一块的内容进行整理记录……

public void coverOrInsertData(String ids,String username){
Date date=new Date();
String createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
String sql = "select * from T_RESULT where n_id in (";
String[] IDS = ids.split(",");
for (int i = 0; i < IDS.length; i++) {
if (i == IDS.length - 1) {
sql += ("'" + IDS[i] + "'");
} else {
sql += ("'" + IDS[i] + "',");
}
}
sql += ")";
Statement sta = null;
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DruidPool.instance("evaluate_database").getConnection();
conn.setAutoCommit(true);//如果设置自动提交为false,后边需要手动提交一遍
sta = conn.createStatement();
ResultSet resultSet = sta.executeQuery(sql);
List<ResultVo> list = new ArrayList<ResultVo>();
list = resultBo.getResultList(resultSet);
logger.info("list长度为:" + list.size());
if (list.isEmpty()) {
return;
}
//注意:这个for循环便是今天要提的问题点,本意是想实现“表里存在数据则更新,不存在则插入,而这种写法在实际操作中发现没能实现批量插入或更新,仅插入了某个数据”
for (ResultVo vo : list) {
List<ResultSourceVo> vos = queryResultSource(vo, conn);
logger.info("查询结果条数为:" + vos.size());
if (vos.isEmpty()) {
ps = conn.prepareStatement(insertResultSourceSql);
ps.setString(1, vo.getCode());
//省略一堆参数

ps.setString(3, createTime);
ps.setString(4, username);
ps.addBatch();
} else {
ps = conn.prepareStatement(updateResultSourceSql);
ps.setString(1, vo.getCode());
//省略一堆参数

ps.setString(3, createTime);
ps.setString(4, username);
ps.addBatch();
}
}
if (ps != null) {
ps.executeBatch();
//conn.commit(); //手动提交
ps.clearBatch(); //提交后,批量清空。
}
} catch (Exception e) {
logger.info("出现异常:"+ExceptionUtils.getMessage(e));
} finally {
try {
if (sta != null) sta.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
} catch (SQLException e) {
logger.info(ExceptionUtils.getMessage(e));
}
}
}

经过分析,下列sql语句放在循环内不合适,这将直接导致数据的覆盖,应当将其移到for循环外部,然而sql一句是插入一句是更新,没法一同置放在循环外部,故而将两句sql合并改写成oracle的merge into写法,至此批量处理正常实现。

ps = conn.prepareStatement(insertResultSourceSql);
ps = conn.prepareStatement(updateResultSourceSql);

最后

以上就是不安百合为你收集整理的【Java】关于采用PreparedStatement中executeBatch()方法实现批量更新或插入时数据相互覆盖的问题的全部内容,希望文章能够帮你解决【Java】关于采用PreparedStatement中executeBatch()方法实现批量更新或插入时数据相互覆盖的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部