BaseDao)package com.abc.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class BaseDao {
/** 獲取數據庫連接 */
public Connection getConn() {
Connection conn = null;
try {
// 1. 加載驅動類 (JDBC 4.0+ 可省略,DriverManager 會自動發現)
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 2. 建立連接
String url = "jdbc:mysql://127.0.0.1:3306/user";
try {
conn = DriverManager.getConnection(url, "root", "");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/** 統一關閉資源 (按創建順序反向關閉) */
public void closeAll(ResultSet rs, Statement stat, Connection conn) {
if (rs != null) {
try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if (stat != null) {
try { stat.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if (conn != null) {
try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
}
}
Class.forName("com.mysql.jdbc.Driver") 註冊驅動至 DriverManager。MySQL 8.0+ 驅動類為 com.mysql.cj.jdbc.Driver,URL 需加 ?useSSL=false&serverTimezone=UTC。DriverManager.getConnection(url, user, password) 返回 Connection 對象,代表物理會話。ResultSet → Statement → Connection 逆序關閉,防止連接洩漏。Java 7+ 建議使用 try-with-resources 自動管理。public class JdbcTemplate {
private static final String URL = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASS = "password";
static {
try { Class.forName("com.mysql.cj.jdbc.Driver"); }
catch (ClassNotFoundException e) { throw new RuntimeException("驅動加載失敗", e); }
}
/** 通用查詢模板 */
public <T> List<T> query(String sql, RowMapper<T> mapper, Object... params) {
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sql)) {
// 綁定參數防止 SQL 注入
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
try (ResultSet rs = ps.executeQuery()) {
List<T> results = new ArrayList<>();
while (rs.next()) {
results.add(mapper.mapRow(rs));
}
return results;
}
} catch (SQLException e) {
throw new RuntimeException("查詢執行失敗: " + sql, e);
}
}
/** 通用增刪改模板 */
public int update(String sql, Object... params) {
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sql)) {
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
return ps.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException("更新執行失敗: " + sql, e);
}
}
@FunctionalInterface
public interface RowMapper<T> {
T mapRow(ResultSet rs) throws SQLException;
}
}
JdbcTemplate jdbc = new JdbcTemplate();
// 查詢
List<User> users = jdbc.query(
"SELECT id, username, email FROM users WHERE status = ?",
rs -> new User(rs.getInt("id"), rs.getString("username"), rs.getString("email")),
1
);
// 新增
int rows = jdbc.update(
"INSERT INTO users(username, email, status) VALUES (?, ?, ?)",
"張三", "zhangsan@example.com", 1
);
生產環境絕不可直接使用 DriverManager 頻繁創建連接,必須引入連接池:
<!-- HikariCP Maven 依賴 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
本文提供了 JDBC 連接 MySQL 的最基礎實現,適合理解底層原理。實際開發中請直接使用 Spring JdbcTemplate、MyBatis 或 JPA/Hibernate 等成熟框架,並配置高性能連接池,專注於業務邏輯而非樣板代碼。