| 角色 | 職責 | 對應關係 | 典型方法 |
| 實體類 | 單筆記錄封裝 | 一個實例 = 一張表的一行 | getXxx()/setXxx()、equals()/hashCode() |
| 會話類 | 表級操作協調 | 對應一張表的所有記錄操作 | insert()/update()/delete()/findByXxx()/findAll() |
實戰範例:圖書查詢系統
資料庫結構
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
理解本質設計模式,才能駕馭框架而非被框架綁架。
- 上一篇文章: XML生產消費者模式:多線程環境下SAX解析的高併發架構設計
- 下一篇文章: Java程序設計基礎入門概述:從綠色計劃到三大平台
Copyright ©
程式碼之家 All Rights Reserved