在Oracle中,可以使用MERGE语句实现批量插入数据,如果数据已存在则更新,不存在则新增。
MERGE语句的基本语法如下:
sql
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的批处理机制减少与数据库的交互次数,代码示例如下:
java
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注入攻击,参数值应该使用占位符形式设置,而非直接拼接字符串。