目录
- 准备工作
- 安装并启动 PostgreSQL 数据库
- 创建数据库和用户
- 下载 JDBC 驱动
- Maven/Gradle 项目配置
- Maven (
pom.xml) - Gradle (
build.gradle)
- Maven (
- Java 代码示例
- 基础连接示例
- 使用
try-with-resources的最佳实践 - 执行查询并处理结果集
- 执行更新/插入/删除语句
- 连接字符串详解
- 最佳实践与常见问题
- 使用连接池
- 处理 SQL 注入
- 捕获和处理异常
- SSL 连接
准备工作
a. 安装并启动 PostgreSQL 数据库
确保您的计算机上已经安装了 PostgreSQL 并正在运行,您可以从 PostgreSQL 官方网站 下载并安装。

b. 创建数据库和用户
为了安全和方便,我们建议为应用程序创建一个专用的数据库和用户。
- 打开终端或命令行工具(如
psql)。 - 登录到 PostgreSQL(默认用户是
postgres):psql -U postgres
- 创建新数据库(
myapp_db):CREATE DATABASE myapp_db;
- 创建新用户(
myapp_user)并设置密码:CREATE USER myapp_user WITH PASSWORD 'your_strong_password';
- 为新用户授予新数据库的所有权限:
GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user;
- 退出
psql:\q
c. 下载 JDBC 驱动
Java 应用程序需要一个 JDBC 驱动程序来与 PostgreSQL 通信,最简单的方式是在您的构建工具(Maven/Gradle)中添加依赖。
如果您想手动下载,可以从 PostgreSQL JDBC 官方页面 下载最新版本的 JAR 文件。
Maven/Gradle 项目配置
强烈推荐使用构建工具来管理依赖,这样更简单且能避免版本冲突。

Maven (pom.xml)
在您的 pom.xml 文件中,添加 postgresql 依赖。
<dependencies>
<!-- PostgreSQL JDBC Driver -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<!-- 建议使用最新版本,可以在 Maven Central 查找 -->
<version>42.7.3</version>
</dependency>
</dependencies>
Gradle (build.gradle)
在您的 build.gradle 文件中,添加 implementation 依赖。
dependencies {
// PostgreSQL JDBC Driver
implementation 'org.postgresql:postgresql:42.7.3'
}
提示:
7.3是一个示例版本号,请访问 Maven Central 获取最新的稳定版本。
Java 代码示例
a. 基础连接示例
这个示例展示了如何建立和关闭一个最基本的连接。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class BasicPostgresConnection {
public static void main(String[] args) {
// 数据库连接信息
String url = "jdbc:postgresql://localhost:5432/myapp_db";
String user = "myapp_user";
String password = "your_strong_password";
// Connection 对象,用于管理数据库连接
Connection conn = null;
try {
// 1. 加载 JDBC 驱动 (对于现代 JDBC 驱动,这步通常是可选的)
// Class.forName("org.postgresql.Driver");
// 2. 建立连接
System.out.println("正在连接到 PostgreSQL...");
conn = DriverManager.getConnection(url, user, password);
// 如果没有抛出异常,说明连接成功
if (conn != null) {
System.out.println("连接成功!");
}
} catch (SQLException e) {
// 捕获并处理 SQL 异常
System.err.println("连接数据库失败!");
e.printStackTrace();
} finally {
// 3. 关闭连接 (非常重要!)
try {
if (conn != null) {
conn.close();
System.out.println("连接已关闭。");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
b. 使用 try-with-resources 的最佳实践
try-with-resources 是 Java 7 引入的一个特性,它可以确保实现了 AutoCloseable 接口(如 Connection, Statement, ResultSet)的资源在 try 块执行完毕后自动关闭,即使在发生异常时也能保证关闭,这是目前推荐的写法。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TryWithResourcesConnection {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/myapp_db";
String user = "myapp_user";
String password = "your_strong_password";
// try-with-resources 会自动关闭 conn
try (Connection conn = DriverManager.getConnection(url, user, password)) {
if (conn != null) {
System.out.println("连接成功!(使用 try-with-resources)");
// 在这里执行数据库操作...
}
} catch (SQLException e) {
System.err.println("数据库操作出错!");
e.printStackTrace();
}
// conn 在这里会自动关闭,无需手动调用 conn.close()
}
}
c. 执行查询并处理结果集
下面是一个完整的示例,展示如何查询数据并遍历结果集。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SelectExample {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/myapp_db";
String user = "myapp_user";
String password = "your_strong_password";
// 假设我们有一个 users 表,结构为: id SERIAL PRIMARY KEY, name VARCHAR(50), email VARCHAR(100)
// 使用 try-with-resources 确保 Connection, Statement, ResultSet 都被正确关闭
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, email FROM users")) {
System.out.println("ID\tName\tEmail");
System.out.println("-----------------------------");
// 遍历结果集
while (rs.next()) {
// 通过列名获取数据,更具可读性和健壮性
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
// 输出数据
System.out.printf("%d\t%s\t%s%n", id, name, email);
}
} catch (SQLException e) {
System.err.println("查询数据时出错!");
e.printStackTrace();
}
}
}
d. 执行更新/插入/删除语句
使用 executeUpdate() 方法来执行 INSERT, UPDATE, DELETE 或 DDL 语句。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class InsertUpdateDeleteExample {
public static void main(String[] args) {
String url = "jdbc:postgresql://localhost:5432/myapp_db";
String user = "myapp_user";
String password = "your_strong_password";
// 插入一条新记录
String insertSql = "INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')";
// 更新一条记录
String updateSql = "UPDATE users SET email = 'alice_new@example.com' WHERE name = 'Alice'";
// 删除一条记录
String deleteSql = "DELETE FROM users WHERE name = 'Alice'";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement()) {
System.out.println("正在执行插入操作...");
int rowsInserted = stmt.executeUpdate(insertSql);
System.out.println(rowsInserted + " 行数据被插入。");
System.out.println("正在执行更新操作...");
int rowsUpdated = stmt.executeUpdate(updateSql);
System.out.println(rowsUpdated + " 行数据被更新。");
System.out.println("正在执行删除操作...");
int rowsDeleted = stmt.executeUpdate(deleteSql);
System.out.println(rowsDeleted + " 行数据被删除。");
} catch (SQLException e) {
System.err.println("执行 SQL 语句时出错!");
e.printStackTrace();
}
}
}
连接字符串详解
连接字符串的格式是:jdbc:postgresql://[host]:[port]/[database][?property1=value1&property2=value2]
jdbc:postgresql://: 固定协议。[host]: 数据库服务器地址,本地是localhost或0.0.1。[port]: 数据库端口,默认是5432。/[database]: 要连接的数据库名称。- 可选的连接属性。
常用连接属性:
user: 数据库用户名。password: 数据库密码。ssl: 是否使用 SSL 连接。ssl=true。currentSchema: 设置当前搜索的模式。timezone: 设置会话的时区。timezone=UTC。
示例带属性的连接字符串:
jdbc:postgresql://localhost:5432/myapp_db?user=myapp_user&password=your_strong_password&ssl=true
最佳实践与常见问题
a. 使用连接池
对于任何生产环境的应用程序,绝对不要在每次请求时都创建和销毁连接,这会导致巨大的性能开销,应该使用连接池来管理和复用数据库连接。
流行的 Java 连接池库:
- HikariCP: 目前性能最好、最流行的连接池。
- Apache DBCP: 经典的连接池实现。
- C3P0: 另一个老牌连接池。
使用 HikariCP 的示例:
-
添加依赖 (
pom.xml):<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.1.0</version> </dependency> -
Java 代码:
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class HikariCPExample { private static HikariDataSource dataSource; static { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:postgresql://localhost:5432/myapp_db"); config.setUsername("myapp_user"); config.setPassword("your_strong_password"); config.setDriverClassName("org.postgresql.Driver"); // 连接池配置 (可选) config.setMaximumPoolSize(10); // 最大连接数 config.setMinimumIdle(5); // 最小空闲连接数 config.setConnectionTimeout(30000); // 连接超时时间 (毫秒) dataSource = new HikariDataSource(config); } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } public static void main(String[] args) { try (Connection conn = HikariCPExample.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users")) { while (rs.next()) { System.out.println(rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); } } }
b. 处理 SQL 注入
永远不要使用字符串拼接来构建 SQL 语句,这会导致严重的 SQL 注入安全漏洞。始终使用 PreparedStatement。
PreparedStatement 的好处:
- 安全: 它会自动对输入参数进行转义,防止 SQL 注入。
- 性能: 对于需要多次执行的 SQL,数据库可以预编译它,提高执行效率。
// 安全的方式 - 使用 PreparedStatement
String name = "Alice";
String sql = "SELECT * FROM users WHERE name = ?"; // 使用 ? 作为占位符
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
// 设置参数,索引从 1 开始
pstmt.setString(1, name);
try (ResultSet rs = pstmt.executeQuery()) {
// 处理结果...
}
} catch (SQLException e) {
e.printStackTrace();
}
c. 捕获和处理异常
始终捕获 SQLException,并根据业务逻辑进行适当的处理(如记录日志、返回错误信息给用户等)。
d. SSL 连接
在生产环境中,为了数据安全,强烈建议启用 SSL 连接,您可以在连接字符串中添加 ssl=true,对于更高级的配置,可以设置 sslmode 参数(如 sslmode=verify-full)。
| 步骤 | 关键点 | 示例/工具 |
|---|---|---|
| 环境准备 | 安装 PostgreSQL,创建数据库和专用用户。 | CREATE DATABASE ...; CREATE USER ...; |
| 项目配置 | 使用 Maven/Gradle 添加 JDBC 驱动依赖。 | postgresql:42.7.3 |
| 编写代码 | - 连接: DriverManager.getConnection()- 查询: Statement.executeQuery()- 更新: Statement.executeUpdate()- 最佳实践: 使用 try-with-resources 和 PreparedStatement。 |
try (Connection conn = ...) |
| 生产环境 | 必须使用连接池(如 HikariCP)来管理连接。 | HikariDataSource |
| 安全 | 必须使用 PreparedStatement 来防止 SQL 注入。 |
pstmt.setString(1, ...) |
遵循以上指南,您就可以在 Java 应用程序中安全、高效地连接和操作 PostgreSQL 数据库了。
