一、批处理
假如要插入一万条记录到数据表中,那么使用普通的方法就要执行一万次插入操作,这样会频繁打开和关闭数据库连接,导致执行速度变慢。
因此可以使用批处理机制将多条语句一次性提交给数据库批量处理。
批处理的相关API:
- void addBatch() —— 将一组参数添加到 PreparedStatement 对象的批处理命令中。
- int[] executeBatch() —— 将一批SQL命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
- void chearBatch() —— 清空此 Statement 对象的当前 SQL 命令列表。
示例:使用批处理机制向Student表插入1008条记录
// 参数:
// jdbc协议:postgresql子协议://主机地址:数据库端口号/要连接的数据库名
String url = "jdbc:postgresql://localhost:5432/test2";
// 数据库用户名
String user = "postgres";
// 数据库密码
String password = "123456";
// 1. 加载Driver类,Driver类对象将自动被注册到DriverManager类中
Class.forName("org.postgresql.Driver");
// 2. 连接数据库,返回连接对象
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 预编译SQL语句
String sql = "INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept) " +
"VALUES(?, ?, ?, ?, ?);";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 4. 批处理,向Student表中插入1008条记录
for(int i = 0; i < 1008; i++) {
// 设置一条记录的参数
pstmt.setString(1, "sno" + i);
pstmt.setString(2, "student" + i);
pstmt.setString(3, "男");
pstmt.setInt(4, 20);
pstmt.setString(5, "CS");
// 将一条记录的参数添加到批处理命令中
pstmt.addBatch();
// 每100条执行一次批处理
if(i % 100 == 0) {
pstmt.executeBatch(); // 将100条插入记录命令提交给数据库来执行
pstmt.clearBatch(); // 清空此Statement对象的当前SQL命令列表
}
}
// 将剩余的8条插入记录命令提交给数据库执行
pstmt.executeBatch();
pstmt.clearBatch();
// 关闭资源
pstmt.close();
conn.close();
二、获取自增长列的值
主码自增长的功能,比如Oracle的Sequence机制、MySQL的AUTO_INCREMENT以及PostgreSQL的Serial数据类型。
如果使用JDBC往数据库表中插入一条新记录,要想获取主码新增长的值,则需要再进行一次查询操作,这样不够方便。
因此比较理想的方式是在进行数据插入操作时就能获取到自增长列对应的值,JDBC也提供了这样的功能。
相关API:
- PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) —— 创建一个默认 PreparedStatement 对象,该对象能获取数据表自动生成的键值。
参数autoGeneratedKeys - 指示是否应该返回自动生成的键值,它可以是 Statement.RETURN_GENERATED_KEYS 或Statement.NO_GENERATED_KEYS
- ResultSet getGeneratedKeys() —— 获取由于执行此 Statement 对象而创建的所有自动生成的键。如果此 Statement 对象没有生成任何键,则返回空的 ResultSet 对象。
示例:获取用户表的自增长列的值
首先在PostgreSQL中创建一张t_user表,其中主码id具有自增长功能:
CREATE TABLE t_user(
id SERIAL PRIMARY KEY,
name CHAR(20),
password CHAR(20)
);
然后在JDBC中往表插入一条记录,获取新插入记录的主码自增长值:
// 省略参数代码...
// 1. 加载Driver类,Driver类对象将自动被注册到DriverManager类中
Class.forName("org.postgresql.Driver");
// 2. 连接数据库,返回连接对象
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 预编译SQL, 获取PreparedStatement对象
String sql = "INSERT INTO t_user(name, password) VALUES(?, ?);";
// 创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键。
PreparedStatement pstmt = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
// 4. 设置参数,并将SQL语句传给数据库执行
pstmt.setString(1, "张三");
pstmt.setString(2, "123456");
pstmt.executeUpdate();
// 5. 获取主码自增长的值,以ResultSet类的形式返回
ResultSet rs = pstmt.getGeneratedKeys();
while(rs.next()) {
System.out.println("主码自增长值为: " + rs.getInt(1));
}
控制台打印输出: