本文展示一個基於 JDBC + DBCP 連接池 + DAO 模式的寵物信息管理系統,包含實體類、工具類、DAO 層、測試類、建表腳本、配置文件,適合 Java 初學者理解分層架構與資源管理最佳實踐。
com.daliu.jdbc
├── PetMessage.java # 實體類
├── DBUtil.java # 連接池工具類
├── PetDAO.java # 數據訪問層
├── PetTest.java # 測試類
├── db.properties # 配置文件
└── schema.sql # 建表腳本
public class PetMessage {
private int petId;
private String petSort, petName, petSex, petDate;
private int petAge;
// 構造器、getter/setter、toString 省略
}
public class DBUtil {
private static BasicDataSource dbcp;
private static ThreadLocal tl = new ThreadLocal<>();
static {
Properties prop = new Properties();
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("com/daliu/jdbc/db.properties");
prop.load(is);
dbcp = new BasicDataSource();
dbcp.setDriverClassName(prop.getProperty("jdbc.driver"));
dbcp.setUrl(prop.getProperty("jdbc.url"));
dbcp.setUsername(prop.getProperty("jdbc.user"));
dbcp.setPassword(prop.getProperty("jdbc.password"));
dbcp.setInitialSize(Integer.parseInt(prop.getProperty("initsize")));
dbcp.setMaxActive(Integer.parseInt(prop.getProperty("maxactive")));
dbcp.setMaxWait(Integer.parseInt(prop.getProperty("maxwait")));
dbcp.setMinIdle(Integer.parseInt(prop.getProperty("minidle")));
dbcp.setMaxIdle(Integer.parseInt(prop.getProperty("maxidle")));
}
public static Connection getConnection() throws SQLException {
Connection conn = dbcp.getConnection();
tl.set(conn);
return conn;
}
public static void closeConnection() {
try {
Connection conn = tl.get();
if (conn != null) {
conn.close(); // 歸還連接池
tl.remove();
}
} catch (Exception e) { throw new RuntimeException(e); }
}
}
public class PetDAO {
// 統一模板:獲取連接 → PreparedStatement → 綁參 → 執行 → 釋放
public static void doAdd(PetMessage pet) { /* INSERT ... */ }
public static void doDeleteWithId(PetMessage pet) { /* DELETE WHERE petId */ }
public static void doDeleteWithName(PetMessage pet) { /* DELETE WHERE petName */ }
public static void doUpdateWithID(PetMessage pet) { /* UPDATE SET petName WHERE petId */ }
public static void doUpdateWithName(PetMessage pet) { /* UPDATE SET petAge WHERE petName */ }
public static void doSelectWithId(PetMessage pet) { /* SELECT WHERE petId */ }
public static void doSelectWithName(PetMessage pet) { /* SELECT WHERE petName */ }
}
public class PetTest {
public static void main(String[] args) {
PetMessage pet = new PetMessage(1, "leopard", "小豹子", "female", 5, "2014-12-19");
PetDAO.doSelectWithId(pet); // 查詢驗證
}
}
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/PetSystem
jdbc.user=root
jdbc.password=123456
initsize=1
maxactive=10
maxwait=5000
maxidle=5
minidle=1
CREATE DATABASE PetSystem;
USE PetSystem;
CREATE TABLE petMessage (
petId INT(7) PRIMARY KEY,
petSort VARCHAR(20),
petName VARCHAR(20),
petSex VARCHAR(20),
petAge INT(4),
petDate VARCHAR(20)
);
| 層級 | 職責 | 關鍵技術 |
|---|---|---|
| Entity | 數據載體 | POJO、toString |
| Util | 連接池管理 | DBCP BasicDataSource、ThreadLocal 綁定事務連接 |
| DAO | SQL 執行 | PreparedStatement 防注入、資源 try-catch-finally 關閉 |
| Test | 功能驗證 | main 方法調用 DAO |
DataAccessException,上層統一處理。Connection.setAutoCommit(false) + 服務層控制提交/回滾。此 Demo 完整演示了「配置 → 連接池 → 實體 → DAO → 測試」的標準化流程,是從 JDBC 原始 API 邁向企業級持久層架構的最小可行性原型。