赞
踩
在Oracle中,可以使用MERGE语句实现批量插入数据,如果数据已存在则更新,不存在则新增。
MERGE语句的基本语法如下:
MERGE INTO table_name t
USING (SELECT ... FROM ...) s
ON (t.column_name = s.column_name)
WHEN MATCHED THEN
UPDATE SET t.col1 = s.val1, t.col2 = s.val2 ...
WHEN NOT MATCHED THEN
INSERT (col1, col2, ...) VALUES (s.val1, s.val2, ...)
其中,table_name为目标表名,s为源表查询结果集,column_name为目标表和源表的关联列,MATCHED表示匹配到记录时执行UPDATE操作,NOT MATCHED则表示未匹配到记录时执行INSERT操作。
具体应用到批量插入数据时,可以通过JDBC的批处理机制减少与数据库的交互次数,代码示例如下:
public static void insertOrUpdateBatch(List<User> userList) { Connection conn = null; PreparedStatement pstmt = null; try { conn = getConnection(); conn.setAutoCommit(false); String sql = "MERGE INTO user u " + "USING (SELECT ? id, ? name, ? age FROM dual) s " + "ON (u.id = s.id) " + "WHEN MATCHED THEN " + " UPDATE SET u.name = s.name, u.age = s.age " + "WHEN NOT MATCHED THEN " + " INSERT (id, name, age) VALUES (s.id, s.name, s.age)"; pstmt = conn.prepareStatement(sql); for (User user : userList) { pstmt.setLong(1, user.getId()); pstmt.setString(2, user.getName()); pstmt.setInt(3, user.getAge()); pstmt.addBatch(); } pstmt.executeBatch(); conn.commit(); } catch (SQLException e) { try { if (conn != null) { conn.rollback(); } } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { closeConnection(conn, pstmt); } }
以上代码中,使用MERGE语句批量插入或更新用户信息。在循环中,通过设置PreparedStatement的参数批量添加需要插入或更新的数据,并最终执行批处理操作。
需要注意的是,该方法中的MERGE语句中,ON子句的列需要根据具体情况修改,确保目标表和源表可以正确关联。同时,为避免SQL注入攻击,参数值应该使用占位符形式设置,而非直接拼接字符串。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。