首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java BaseDAO 資料存取基類設計與實作

     編輯:Java 相關知識

設計目標

封裝 JDBC 重複樣板代碼:連線獲取、PreparedStatement 參數綁定、ResultSet 釋放、事務提交/回滾,讓具體 DAO 專注 SQL 與業務邏輯。

BaseDao 完整實作

package dao;

import java.sql.*;

public class BaseDao {
    // 資料庫配置(實務建議外部化至 properties)
    private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private static final String URL = "jdbc:sqlserver://localhost:1433;DatabaseName=BookManage";
    private static final String USER = "sa";
    private static final String PASS = "";

    protected Connection conn;
    protected PreparedStatement ps;
    protected ResultSet rs;

    // 獲取連線(含驅動載入)
    public Connection getCon() {
        try {
            Class.forName(DRIVER);
            conn = DriverManager.getConnection(URL, USER, PASS);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    // 統一資源釋放(逆序關閉)
    public void closeAll(ResultSet rs, PreparedStatement ps, Connection conn) {
        try {
            if (rs != null) rs.close();
            if (ps != null) ps.close();
            if (conn != null) conn.close();
        } catch (SQLException e) { e.printStackTrace(); }
    }

    // 通用增刪改:支援可變參數綁定
    public int executeUpdate(String sql, Object... params) {
        int rows = 0;
        try {
            ps = getCon().prepareStatement(sql);
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i + 1, params[i]); // 索引從 1 開始
                }
            }
            rows = ps.executeUpdate();
        } catch (SQLException e) { e.printStackTrace(); }
        finally { closeAll(rs, ps, conn); }
        return rows;
    }
    
    // 可擴充:通用查詢模板方法(回調 RowMapper)
    // public  List executeQuery(String sql, RowMapper mapper, Object... params) { ... }
}

子類使用範例

public class BookDao extends BaseDao {
    public int add(Book book) {
        String sql = "INSERT INTO t_book(name, author, price) VALUES(?,?,?)";
        return executeUpdate(sql, book.getName(), book.getAuthor(), book.getPrice());
    }
    
    public int deleteById(int id) {
        return executeUpdate("DELETE FROM t_book WHERE id=?", id);
    }
}

設計亮點與不足

進化方向:從 BaseDao 到 Spring JdbcTemplate / MyBatis

  • DataSource 注入:移除硬編碼,配置 Druid/HikariCP 連線池。
  • JdbcTemplate:Spring 內建,提供 query/update 模板、RowMapper、NamedParameter 支援。
  • MyBatis:SQL 外部化至 XML/註解,動態 SQL、結果映射、緩存、分頁插件開箱即用。
  • Spring Data JPA:Repository 介面零實作,衍生查詢、Spec、Audit 自動化。

總結

BaseDAO 是理解「資料存取層封裝」的最佳入門教材。雖然生產環境建議直接使用成熟框架,但親手實作過 BaseDAO 的開發者,更能理解框架底層原理、排查疑難雜症、做出合理技術選型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
亮點待改進
消除樣板代碼,子類極度精簡連線資訊硬編碼,建議注入 DataSource
可變參數靈活綁定,防 SQL 注入無連線池,高併發效能差
finally 保證資源釋放缺乏查詢模板(RowMapper/ResultSetHandler)
異常吞沒僅列印,建議拋出自定義異常事務控制粒度粗(單語句自動提交)