八月 9, 2023
摘要:在本教程中,您将学习如何使用 JDBC API 将数据插入到 PostgreSQL 数据库的表中。
我们将使用示例数据库中的actor
表进行演示。
向表中插入一行
要将行插入表中,请按照下列步骤操作:
- 建立数据库连接,获取 Connection 对象。
- 从 Connection 对象创建 Statement 对象。
- 执行 INSERT 语句。
- 关闭数据库连接。
要连接到 PostgreSQL 数据库服务器,您必须提供指定数据库服务器位置以及数据库名称的连接字符串。此外,您需要提供用户名和密码以向数据库服务器进行身份验证。
以下connect()
方法创建数据库连接,并返回一个Connection
对象。
private final String url = "jdbc:postgresql://localhost/dvdrental";
private final String user = "postgres";
private final String password = "postgres";
/**
* Connect to the PostgreSQL database
*
* @return a Connection object
*/
public Connection connect() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
查看如何连接 PostgreSQL 数据库服务器以获取详细信息。
当我们向具有自动生成 id 的表中插入一行时,我们通常希望取回 id 值以进行进一步处理。
要获取自动生成的 id,您必须:
- 创建 Statement 对象时,将
Statement.RETURN_GENERATED_KEYS
传递给prepareStatement()
方法。 - 调用 Statement 对象的
getGeneratedKeys()
方法获取 id 值。
下面的insertActor()
方法向actor
表中插入一行。
public long insertActor(Actor actor) {
String SQL = "INSERT INTO actor(first_name,last_name) "
+ "VALUES(?,?)";
long id = 0;
try (Connection conn = connect();
PreparedStatement pstmt = conn.prepareStatement(SQL,
Statement.RETURN_GENERATED_KEYS)) {
pstmt.setString(1, actor.getFirstName());
pstmt.setString(2, actor.getLastName());
int affectedRows = pstmt.executeUpdate();
// check the affected rows
if (affectedRows > 0) {
// get the ID back
try (ResultSet rs = pstmt.getGeneratedKeys()) {
if (rs.next()) {
id = rs.getLong(1);
}
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
return id;
}
Actor 类如下:
package net.rockdata.tutorial;
/**
*
* @author rockdata.net
*/
public class Actor {
private String firstName;
private String lastName;
public Actor(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public Actor() {
}
/**
* @return the firstName
*/
public String getFirstName() {
return firstName;
}
/**
* @param firstName the firstName to set
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* @return the lastName
*/
public String getLastName() {
return lastName;
}
/**
* @param lastName the lastName to set
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
向表中插入多行
向表中插入多行的步骤如下:
- 创建数据库连接。
- 创建一个
PreparedStatement
对象。 - 调用
PreparedStatement
对象的addBatch()
方法。 - 调用
executeBatch()
方法将一批INSERT
语句提交给 PostgreSQL 数据库服务器执行。 - 关闭数据库连接。
由于发送到 PostgreSQL 的 SQL 语句的长度是有限的,因此,您应该针对一定数量或更少的行(例如每 100 行)调用executeBatch()
。
下面的insertActors()
方法将演员列表插入到actor
表中。
/**
* insert multiple actors
*/
public void insertActors(List<Actor> list) {
String SQL = "INSERT INTO actor(first_name,last_name) "
+ "VALUES(?,?)";
try (
Connection conn = connect();
PreparedStatement statement = conn.prepareStatement(SQL);) {
int count = 0;
for (Actor actor : list) {
statement.setString(1, actor.getFirstName());
statement.setString(2, actor.getLastName());
statement.addBatch();
count++;
// execute every 100 rows or less
if (count % 100 == 0 || count == list.size()) {
statement.executeBatch();
}
}
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
在本教程中,您学习了如何使用 JDBC API 将一行或多行插入到 PostgreSQL 数据库中。