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

J2EE資料庫類設計模式:實體類與會話類分離的模組化架構

     編輯:Java 程式設計入門

設計模式動機

J2EE應用常需操作資料庫實體(商品、用戶、訂單)。傳統設計將資料邏輯與業務邏輯混雜,維護困難。本模式將資料庫相關類分為兩大類:

核心角色定義

實戰範例:圖書查詢系統

資料庫結構

TABLE Book (ID, Name, ISBN, Author, PublisherID, Price, Volume)
TABLE Publisher (ID, Name, Telephone, Address, Postcode)
-- 關聯:Book.PublisherID → Publisher.ID

實體類實現

public class Book {
    private int id;
    private String name;
    private String isbn;
    private String author;
    private int publisherId;
    private double price;
    private int volume;
    
    // 全參建構子、預設建構子
    // 標準getter/setter
    // equals/hashCode基於ID比較
    // toString()除錯友善
}

會話類實現

public class BookSession {
    private Connection conn;
    
    public BookSession(Connection conn) { this.conn = conn; }
    
    public void insert(Book book) throws SQLException {
        String sql = "INSERT INTO Book VALUES (?,?,?,?,?,?,?)";
        try (PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setInt(1, book.getId());
            stmt.setString(2, book.getName());
            stmt.setString(3, book.getIsbn());
            stmt.setString(4, book.getAuthor());
            stmt.setInt(5, book.getPublisherId());
            stmt.setDouble(6, book.getPrice());
            stmt.setInt(7, book.getVolume());
            stmt.executeUpdate();
        }
    }
    
    public Book findById(int id) throws SQLException {
        String sql = "SELECT * FROM Book WHERE ID = ?";
        try (PreparedStatement stmt = conn.prepareStatement(sql)) {
            stmt.setInt(1, id);
            try (ResultSet rs = stmt.executeQuery()) {
                if (rs.next()) {
                    return mapRow(rs);
                }
            }
        }
        return null;
    }
    
    public List findAll() throws SQLException {
        List list = new ArrayList<>();
        String sql = "SELECT * FROM Book";
        try (Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            while (rs.next()) {
                list.add(mapRow(rs));
            }
        }
        return list;
    }
    
    private Book mapRow(ResultSet rs) throws SQLException {
        Book book = new Book();
        book.setId(rs.getInt("ID"));
        book.setName(rs.getString("Name"));
        book.setIsbn(rs.getString("ISBN"));
        book.setAuthor(rs.getString("Author"));
        book.setPublisherId(rs.getInt("PublisherID"));
        book.setPrice(rs.getDouble("Price"));
        book.setVolume(rs.getInt("Volume"));
        return book;
    }
}

事務處理考量

  • 會話類方法預設自動提交,複雜業務需外層控制事務
  • 引入TransactionManager或Spring@Transactional管理邊界
  • 實體類保持純粹POJO,不持有連線、不參與事務

EJB對比與選型

  • 分散式應用 → EJB(Entity/Session Bean)容器管理事務/安全/並發
  • 單體應用 → 輕量級POJO + Spring/JDBC/Hibernate,效能更優
  • 避免為單機應用引入EJB重型開銷

現代演進

此模式是DAO模式雛形,現代框架進一步封裝:

  • Spring JdbcTemplate消除樣板代碼
  • Hibernate/JPA實現ORM,實體類成持久化實體
  • Spring Data JPA接口式編程,會話類簡化為Repository

理解本質設計模式,才能駕馭框架而非被框架綁架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
角色職責對應關係典型方法
實體類單筆記錄封裝一個實例 = 一張表的一行getXxx()/setXxx()、equals()/hashCode()
會話類表級操作協調對應一張表的所有記錄操作insert()/update()/delete()/findByXxx()/findAll()