iT邦幫忙

2026 iThome 鐵人賽

0
JavaScript

30天從零打造醫療資訊小系統系列 第 22 篇

Day 25|整理程式碼:把資料庫操作獨立成 DAO

  • 分享至 

  • xImage
  •  

一、為什麼功能越多,程式碼越難維護?

在前面的文章中,我們已經完成病患資料的新增、查詢、修改、刪除、搜尋與詳細資料頁面。

不過,當功能逐漸增加時,可能會發現一個問題:Servlet 裡面除了接收使用者輸入,還要處理 SQL、連接資料庫、整理資料,甚至決定要轉去哪個 JSP 頁面。

如果所有工作都放在同一個類別中,程式碼很容易越來越長。

因此,今天要認識 DAO(Data Access Object,資料存取物件),將資料庫操作獨立出來,讓不同類別各自負責自己的工作。

二、先理解三個角色

  • Servlet: 接收 HTTP 請求,處理流程。
  • DAO: 負責執行 SQL 與資料庫操作。
  • JSP: 負責呈現畫面。

例如,使用者想查看病患清單時,流程可以是:

使用者 → PatientListServlet → PatientDAO → MySQL → JSP

這樣未來即使要修改 SQL,也不必到每個 Servlet 裡逐一尋找。

三、建立 PatientDAO

假設專案中已經有 Patient 類別,以及可用的 DBConnection.getConnection() 方法。以下範例將查詢病患資料的工作放進 DAO。

package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import model.Patient;
import util.DBConnection;
public class PatientDAO {
public List findAll() throws Exception {
List patients = new ArrayList<>();
String sql = "SELECT id, name, gender, birth_date, phone "
+ "FROM patient ORDER BY id DESC";
try (Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
Patient p = new Patient();
p.setId(rs.getInt("id"));
p.setName(rs.getString("name"));
p.setGender(rs.getString("gender"));
p.setBirthDate(rs.getDate("birth_date"));
p.setPhone(rs.getString("phone"));
patients.add(p);
}
}
return patients;
}
}

注意:這段程式假設 Patient 類別具有對應的欄位與 setter。如果你的專案使用不同的欄位名稱或日期型別,記得調整。

try-with-resources 可以在程式離開區塊時自動關閉 JDBC 資源,減少連線未關閉的問題。

四、讓 Servlet 只負責流程

原本的 Servlet 可能包含整段 SQL 查詢。整理後,就可以簡化成:

@WebServlet("/patient/list")
public class PatientListServlet extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
try {
PatientDAO dao = new PatientDAO();
request.setAttribute(
"patients", dao.findAll()
);
request.getRequestDispatcher(
"/patient-list.jsp"
).forward(request, response);
} catch (Exception e) {
throw new ServletException(
"無法取得病患清單", e
);
}
}
}

這樣 Servlet 便不需要直接處理 SQL,閱讀起來也更清楚。

五、其他功能也能使用 DAO

除了 findAll(),後續還可以逐步加入:

  • findById(int id):依 ID 查詢單筆資料。
  • insert(Patient patient):新增病患資料。
  • update(Patient patient):修改病患資料。
  • deleteById(int id):刪除病患資料。
  • searchByName(String name):依姓名搜尋。

不需要一次重寫所有程式,可以先從查詢清單開始,再逐步將其他功能搬過去。

六、今日小結

今天學會了 DAO 的基本概念,也將資料庫操作與請求處理分開。

這不只是讓程式碼變短,更重要的是建立清楚的分工。當醫療資訊系統增加更多功能時,良好的結構能讓除錯、測試與維護變得容易。

下一篇,我們將開始實作登入功能,讓系統不再只是任何人都能直接開啟的資料管理頁面。

本篇使用模擬病患資料進行開發,請勿直接放入真實病患個資。


上一篇
Day 24|避免錯誤資料進入資料庫:建立表單驗證機制
下一篇
Day 26|加入登入功能:使用 Session 記錄登入狀態
系列文
30天從零打造醫療資訊小系統 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言