iT邦幫忙

2026 iThome 鐵人賽

0
JavaScript

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

Day 20|讓病患資料可以修改:使用 JDBC 執行 UPDATE

  • 分享至 

  • xImage
  •  

一、為什麼系統需要修改功能?

在前幾篇文章中,我們已經讓醫療資訊小系統具備新增與查詢病患資料的能力。

但如果登記時不小心輸入錯誤,例如電話號碼打錯,難道只能刪掉整筆資料再重新新增嗎?

當然不是!

一般的資料管理系統通常會提供新增、查詢、修改和刪除功能,也就是常說的 CRUD。

今天,我們要完成其中的 Update(修改),讓使用者可以修改已經儲存在 MySQL 裡的病患資料。

二、先認識 UPDATE 語法

MySQL 可以使用 UPDATE 修改資料表中的內容。

例如,我們想修改編號為 1 的病患電話:

UPDATE patient
SET phone = '0987654321'
WHERE id = 1;

這段 SQL 可以分成三個部分:

  • UPDATE patient:指定要修改的資料表。
  • SET phone = ...:指定要修改的欄位與新值。
  • WHERE id = 1:指定要修改哪一筆資料。

這裡有一個非常重要的觀念:

修改資料時,一定要仔細確認 WHERE 條件。

如果忘記寫 WHERE,就可能把整張資料表的電話欄位全部改掉。

三、使用 JDBC 修改病患資料

接著,我們使用之前建立的 DBConnection.java,透過 JDBC 執行修改操作。

建立 TestPatientUpdate.java:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import util.DBConnection;
public class TestPatientUpdate {
public static void main(String[] args) {
String sql =
"UPDATE patient SET phone = ? WHERE id = ?";
try (
Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)
) {
ps.setString(1, "0987654321");
ps.setInt(2, 1);
int rows = ps.executeUpdate();
if (rows > 0) {
System.out.println("修改成功!");
} else {
System.out.println("找不到這筆病患資料。");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

這裡使用 PreparedStatement 設定兩個參數:

ps.setString(1, "0987654321");
ps.setInt(2, 1);

第一個參數是新的電話號碼,第二個參數是病患編號。

executeUpdate() 會回傳受影響的資料筆數。如果結果大於 0,就代表有資料被修改;如果是 0,可能是沒有符合條件的紀錄,也可能是資料內容原本就相同。

四、讓 Servlet 接收修改請求

前面使用 main() 測試,只能由程式碼指定要修改的內容。

真正的網頁系統則需要讓使用者填寫表單,再由 Servlet 接收資料。

建立 PatientUpdateServlet.java:

package servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import util.DBConnection;
@WebServlet("/patient/update")
public class PatientUpdateServlet extends HttpServlet {
@Override
protected void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String idText = request.getParameter("id");
String name = request.getParameter("name");
String gender = request.getParameter("gender");
String birthdayText = request.getParameter("birthday");
String phone = request.getParameter("phone");
try {
int id = Integer.parseInt(idText);
if (name == null || name.isBlank()
|| birthdayText == null
|| birthdayText.isBlank()) {
response.sendError(
HttpServletResponse.SC_BAD_REQUEST,
"姓名和生日不可為空"
);
return;
}
java.time.LocalDate birthday =
java.time.LocalDate.parse(birthdayText);
String sql = "UPDATE patient "
+ "SET name = ?, gender = ?, "
+ "birthday = ?, phone = ? "
+ "WHERE id = ?";
try (
Connection conn = DBConnection.getConnection();
PreparedStatement ps =
conn.prepareStatement(sql)
) {
ps.setString(1, name);
ps.setString(2, gender);
ps.setDate(
3,
java.sql.Date.valueOf(birthday)
);
ps.setString(4, phone);
ps.setInt(5, id);
int rows = ps.executeUpdate();
if (rows > 0) {
response.sendRedirect(
request.getContextPath() + "/patients"
);
} else {
response.sendError(
HttpServletResponse.SC_NOT_FOUND,
"找不到這筆病患資料"
);
}
}
} catch (IllegalArgumentException e) {
response.sendError(
HttpServletResponse.SC_BAD_REQUEST,
"編號或日期格式不正確"
);
} catch (SQLException e) {
throw new ServletException("修改資料失敗", e);
}
}
}

這個範例使用 POST 接收修改表單,並在修改成功後回到病患清單。

注意:這是教學用的基本範例。正式系統還需要完整的輸入驗證、登入與權限檢查、CSRF 防護,以及適當的錯誤處理。

五、建立修改表單

我們可以先建立一個簡單的 patient-edit.jsp:

<%@ page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>

這是最簡化的練習表單,使用者需要自行輸入病患編號。完整版本應先透過資料庫取得指定病患的原始資料,再將原本的值填入表單,避免使用者不小心修改錯誤的紀錄。

六、今天完成了什麼?

今天我們第一次使用 UPDATE 修改資料,也把修改操作放進 Servlet 的處理流程。

目前的操作流程是:

使用者填寫修改表單
↓
PatientUpdateServlet
↓
PreparedStatement
↓
執行 UPDATE
↓
MySQL 更新資料
↓
回到病患清單

這代表我們的系統已經不只是單純顯示資料,而是開始具備基本的資料維護功能。

今日小結

今天學會:

  1. 使用 UPDATE 修改資料。
  2. 使用 WHERE 指定要修改的紀錄。
  3. 使用 PreparedStatement 設定修改參數。
  4. 使用 executeUpdate() 判斷受影響的資料筆數。
  5. 透過 Servlet 接收表單並執行修改。

Day 20 完成!

下一篇,我們要來處理另一種資料操作:刪除病患資料。不過,刪除涉及資料完整性,因此不能只考慮如何執行 SQL,也必須思考如何避免誤刪。

參考資料:Oracle Java Tutorials:Using Prepared Statements


上一篇
Day 19|把病患資料整理成清單:從 JDBC 到 JSP
下一篇
Day 21|讓病患資料可以刪除:使用 JDBC 執行 DELETE
系列文
30天從零打造醫療資訊小系統 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言