JDBC 是 Java 訪問關係數據庫的標準 API。本文以 SQL Server 為例,從驅動下載、連接建立、CRUD 操作到資源管理,提供完整可運行的實戰代碼。
mssql-jdbc-x.x.x.jre8.jar)CREATE DATABASE java_conn_test;
USE java_conn_test;
CREATE TABLE tb_User (
UserId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
UserName NVARCHAR(50),
UserPwd NVARCHAR(50)
);
public class SelectQuery {
private Connection conn;
public Connection getConnection() {
try {
// 1. 加載驅動(JDBC 4.0+ 可省略,SPI 自動發現)
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
System.out.println("驅動加載成功");
// 2. 建立連接
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=java_conn_test";
conn = DriverManager.getConnection(url, "sa", "123456");
if (conn != null) System.out.println("數據庫連接成功");
else System.out.println("數據庫連接失敗");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
public class StartMain {
private static Connection conn;
public static void main(String[] args) {
conn = new SelectQuery().getConnection();
GetInsert(); GetSelect(); GetUpdate(); GetSelect(); GetDelete(); GetSelect();
}
// INSERT
public static void GetInsert() {
if (conn == null) return;
String sql = "INSERT INTO tb_User (UserName, UserPwd, UserId) VALUES ('name_"
+ (int)(Math.random()*5000) + "','pwd_" + (int)(Math.random()*5000) + "', NEWID())";
executeUpdate(sql, "添加");
}
// SELECT
public static void GetSelect() {
if (conn == null) return;
String sql = "SELECT * FROM tb_User";
try (PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("UserName") + "\t"
+ rs.getString("UserPwd") + "\t" + rs.getString("UserId"));
}
System.out.println("查詢成功");
} catch (Exception e) { System.out.println("查詢失敗"); e.printStackTrace(); }
}
// UPDATE
public static void GetUpdate() {
if (conn == null) return;
String sql = "UPDATE tb_User SET UserPwd=UserPwd+'xxxxxxxx' WHERE UserId='指定UUID'";
executeUpdate(sql, "修改");
}
// DELETE
public static void GetDelete() {
if (conn == null) return;
String sql = "DELETE FROM tb_User WHERE UserId!='指定UUID'";
executeUpdate(sql, "刪除");
}
// 通用增刪改
private static void executeUpdate(String sql, String op) {
try (Statement stmt = conn.createStatement()) {
int result = stmt.executeUpdate(sql);
System.out.println(result > 0 ? op + "成功" : op + "失敗");
} catch (Exception e) {
System.out.println(op + "失敗"); e.printStackTrace();
}
}
}
// 錯誤:拼接 SQL
String sql = "SELECT * FROM user WHERE name = '" + name + "'";
// 正確:參數化查詢
String sql = "SELECT * FROM user WHERE name = ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, name);
ResultSet rs = ps.executeQuery();
}
try (Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
// 使用資源
} // 自動按逆序關閉 rs → ps → conn
頻繁創建/銷毀連接極其低效。推薦 HikariCP(Spring Boot 2 默認)、Druid、DBCP2。
// HikariCP 示例
HikariConfig config = new HikariConfig();
config.setJdbcUrl(url);
config.setUsername(user);
config.setPassword(pwd);
config.setMaximumPoolSize(20);
DataSource ds = new HikariDataSource(config);
// 使用
try (Connection conn = ds.getConnection()) { ... }
conn.setAutoCommit(false);
try {
// 多條 SQL
conn.commit();
} catch (Exception e) {
conn.rollback();
throw e;
} finally {
conn.setAutoCommit(true);
}
驅動加載成功
數據庫連接成功
-----------INSERT------------
添加成功
-----------SELECT------------
name_1234 pwd_1234 UUID...
查詢成功
-----------UPDATE------------
修改成功!
-----------SELECT------------
name_1234 pwd_1234xxxxxxxx UUID...
查詢成功
-----------DELETE------------
刪除成功!
-----------SELECT------------
查詢成功
| 異常 | 原因 | 解決 |
|---|---|---|
| ClassNotFoundException | 驅動包未導入 | Build Path 添加 JAR |
| Connection refused | SQL Server 未啟用 TCP/IP 或端口錯誤 | SQL Server Configuration Manager 啟用 TCP/IP,確認 1433 端口 |
| Login failed | 用戶名密碼錯誤/未啟用混合驗證 | 檢查 sa 密碼、啟用 SQL Server 驗證模式 |
| SSL handshake failed | 高版本驅動默認要求加密 | URL 添加 ;encrypt=true;trustServerCertificate=true 或配置證書 |
JDBC 是持久層基石。實戰中:驅動 SPI 自動加載、PreparedStatement 防注入、try-with-resources 管資源、連接池提性能、事務保一致性。上層框架(MyBatis、JPA、JdbcTemplate)本質皆是對 JDBC 的封裝,理解底層細節能寫出更高效、更安全的數據訪問代碼。