来详细讲解一下“实例讲解Java批量插入、更新数据”的完整攻略吧。
思路概述
在 Java 中批量插入、更新数据的基本思路是:
- 手动拼接 SQL 语句,将多条插入语句合并成一条;
- 执行批量插入、更新操作;
对于第一步手动拼接 SQL 语句,为了避免 SQL 注入,一般会使用 PreparedStatement 或 NamedParameterJdbcTemplate 进行 SQL 语句的拼接。
对于第二步执行批量插入、更新操作,可以使用 JDBC 中的 Batch 操作或 MyBatis 中的批量操作。
代码实现
使用 JDBC Batch 操作
以下为使用 JDBC Batch 操作实现 Java 批量插入、更新数据的示例代码:
public static void batchInsertUpdate() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet generatedKeys = null;
try {
conn = getConnection();
conn.setAutoCommit(false);
String sql = "INSERT INTO student (name, age, gender) VALUES (?, ?, ?)";
List<Student> students = new ArrayList<>();
students.add(new Student("Tom", 18, "male"));
students.add(new Student("Lucy", 19, "female"));
students.add(new Student("Jack", 20, "male"));
ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
for (Student student : students) {
ps.setString(1, student.getName());
ps.setInt(2, student.getAge());
ps.setString(3, student.getGender());
ps.addBatch();
}
ps.executeBatch();
generatedKeys = ps.getGeneratedKeys();
while (generatedKeys.next()) {
System.out.println("插入成功,自增ID:" + generatedKeys.getLong(1));
}
ps.clearBatch();
sql = "UPDATE student SET gender=? WHERE id=?";
ps = conn.prepareStatement(sql);
for (int i = 0; i < students.size(); i++) {
Student student = students.get(i);
ps.setString(1, "female");
ps.setLong(2, i + 1);
ps.addBatch();
}
ps.executeBatch();
conn.commit();
} catch (SQLException e) {
if (conn != null) {
conn.rollback();
}
e.printStackTrace();
} finally {
if (generatedKeys != null) {
generatedKeys.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}
}
以上代码中,我们先定义了一个 Student 类作为数据模型,然后定义了一个 batchInsertUpdate() 方法用于批量插入、更新数据,思路如下:
- 获取数据库连接,并设置自动提交为 false;
- 手动拼接 SQL 插入语句,构造一个学生列表;
- 创建 PreparedStatement 对象,并使用 addBatch() 方法添加多条插入语句;
- 执行批量插入操作,并获取插入后生成的自增 ID;
- 清空批量操作,并手动拼接 SQL 更新语句;
- 创建 PreparedStatement 对象,并使用 addBatch() 方法添加多条更新语句;
- 执行批量更新操作;
- 提交事务,并关闭连接;
使用 MyBatis 批量操作
以下为使用 MyBatis 批量操作实现 Java 批量插入、更新数据的示例代码:
public static void mybatisBatchInsertUpdate() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
StudentMapper mapper = session.getMapper(StudentMapper.class);
List<Student> students = new ArrayList<>();
students.add(new Student("Tom", 18, "male"));
students.add(new Student("Lucy", 19, "female"));
students.add(new Student("Jack", 20, "male"));
mapper.batchInsert(students);
List<Long> ids = mapper.getIds();
for (int i = 0; i < ids.size(); i++) {
System.out.println("插入成功,自增ID:" + ids.get(i));
}
students.forEach(student -> student.setGender("female"));
mapper.batchUpdate(students);
session.commit();
} catch (Exception e) {
session.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
以上代码中,我们使用 MyBatis 来操作数据库,思路如下:
- 使用 SqlSessionFactory 和 SqlSession 对象获取 StudentMapper;
- 创建学生列表;
- 调用 StudentMapper 中的 batchInsert() 批量插入数据,并获取插入后生成的自增 ID;
- 打印插入成功的自增 ID;
- 将学生列表中所有学生的性别修改为女性;
- 调用 StudentMapper 中的 batchUpdate() 批量更新学生性别;
- 提交事务,并关闭 SqlSession。
示例测试
我们以使用 JDBC Batch 操作实现 Java 批量插入、更新数据的示例为例,进行测试。在方法前增加 @Test 注解,示例代码如下:
public class JdbcBatchInsertUpdateTest {
@Test
public void testBatchInsertUpdate() throws SQLException {
batchInsertUpdate();
}
}
运行测试,查看控制台输出。可以看到执行成功了批量插入、更新数据的操作,并输出了自增 ID。
总结
以上就是“实例讲解Java批量插入、更新数据”的完整攻略,我们介绍了使用 JDBC Batch 操作和 MyBatis 批量操作实现 Java 批量插入、更新数据的方法,并给出了两个示例代码进行测试。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:实例讲解Java批量插入、更新数据 - Python技术站