12.2

在 JavaWeb 中實現(xiàn)單表的增刪改查(CRUD)操作的一般步驟和示例代碼,這里以 MySQL 數(shù)據(jù)庫為例,并且使用 JDBC來連接數(shù)據(jù)庫和執(zhí)行操作。
- 準備工作
導入 JDBC 驅動包:確保在項目的依賴中添加了 MySQL 的 JDBC 驅動包(如mysql-connector-java),以便能夠在 Java 程序中連接 MySQL 數(shù)據(jù)庫。 - 建立數(shù)據(jù)庫連接
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnection {
private static final String URL = "jdbc:mysql://localhost:3306/db1";
private static final String USERNAME = "root";
private static final String PASSWORD = "aaa666";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
}
3. 創(chuàng)建表對應的實體類
public class Student {
private int id;
private String name;
private int age;
public Student() {}
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// 以下是各屬性的getter和setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4. 實現(xiàn)增刪改查操作
插入數(shù)據(jù)(Create)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class StudentDAO {
public void addStudent(Student student) {
try (Connection connection = DatabaseConnection.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO students (name, age) VALUES (?,?)")) {
preparedStatement.setString(1, student.getName());
preparedStatement.setInt(2, student.getAge());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
在上述代碼中,通過PreparedStatement來預編譯 SQL 語句,然后設置參數(shù)并執(zhí)行插入操作。
查詢數(shù)據(jù)(Read)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class StudentDAO {
public List
List
try (Connection connection = DatabaseConnection.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM students");
ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
Student student = new Student();
student.setId(resultSet.getInt("id"));
student.setName(resultSet.getString("name"));
student.setAge(resultSet.getInt("age"));
students.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
}
這里通過ResultSet來獲取查詢結果集,并將每行數(shù)據(jù)封裝成Student對象添加到列表中。
修改數(shù)據(jù)(Update)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class StudentDAO {
public void updateStudent(Student student) {
try (Connection connection = DatabaseConnection.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE students SET name =?, age =? WHERE id =?")) {
preparedStatement.setString(1, student.getName());
preparedStatement.setInt(2, student.getAge());
preparedStatement.setInt(3, student.getId());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
同樣使用PreparedStatement來預編譯更新語句,設置相應參數(shù)后執(zhí)行更新操作。
刪除數(shù)據(jù)(Delete)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class StudentDAO {
public void deleteStudent(int id) {
try (Connection connection = DatabaseConnection.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM students WHERE id =?")) {
preparedStatement.setInt(1, id);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
通過PreparedStatement預編譯刪除語句,設置要刪除記錄的id參數(shù)后執(zhí)行刪除操作。
5. 測試操作
可以在main方法中編寫如下測試代碼:
public class Main {
public static void main(String[] args) {
// 測試插入操作
StudentDAO studentDAO = new StudentDAO();
Student newStudent = new Student(0, "John", 20);
studentDAO.addStudent(newStudent);
// 測試查詢操作
List<Student> students = studentDAO.getAllStudents();
for (Student student : students) {
System.out.println("ID: " + student.getId() + ", Name: " + student.getName() + ", Age: " + student.getAge());
}
// 測試更新操作
Student toUpdateStudent = students.get(0);
toUpdateStudent.setName("Updated John");
studentDAO.updateStudent(toUpdateStudent);
// 測試刪除操作
studentDAO.deleteStudent(toUpdateStudent.getId());
}
}
要實現(xiàn)通過頁面來對數(shù)據(jù)庫單表進行增刪改查操作,通常需要結合前端頁面(如 HTML、CSS、JavaScript)和后端代碼(如 JavaWeb 相關技術)來完成。以下是一個較為基礎的示例流程,以 Web 應用中常見的 JSP(JavaServer Pages)頁面為例來說明如何實現(xiàn)與前面介紹的單表增刪改查功能的交互:
- 前端頁面設計
創(chuàng)建 HTML 頁面(以index.html為例)
th,
td {
border: 1px solid black;
padding: 8px;
}
</style>
</head>
<body>
<h1>學生信息管理</h1>
<!-- 顯示學生列表的表格 -->
<table id="studentTable">
<tr>
<th>ID</th>
<th>姓名</th>
<th>年齡</th>
<th>操作</th>
</tr>
</table>
<!-- 添加學生信息的表單 -->
<h2>添加學生</h2>
<form id="addStudentForm">
<label for="name">姓名:</label>
<input type="text" id="name" name="name" required><br>
<label for="age">年齡:</label>
<input type="number" id="age" name="age" required><br>
<input type="submit" value="添加學生">
</form>
<script src="script.js"></script>
</body>
在上述 HTML 頁面中,定義了一個用于顯示學生列表的表格和一個用于添加學生信息的表單。
創(chuàng)建 JavaScript 文件(script.js)
// 獲取頁面元素
const studentTable = document.getElementById('studentTable');
const addStudentForm = document.getElementById('addStudentForm');
// 函數(shù):填充學生列表表格
function populateStudentTable(students) {
studentTable.innerHTML = ''; // 先清空表格內容
const tableHeader = document.createElement('tr');
const idHeader = document.createElement('th');
idHeader.textContent = 'ID';
const nameHeader = document.createElement('th');
nameHeader.textContent = '姓名';
const ageHeader = document.createElement('th');
ageHeader.textContent = '年齡';
const actionHeader = document.createElement('th');
actionHeader.textContent = '操作';
tableHeader.appendChild(idHeader);
tableHeader.appendChild(nameHeader);
tableHeader.appendChild(ageHeader);
tableHeader.appendChild(actionHeader);
studentTable.appendChild(tableHeader);
students.forEach((student) => {
const row = document.createElement('tr');
const idCell = document.createElement('td');
idCell.textContent = student.id;
const nameCell = document.createElement('td');
nameCell.textContent = student.name;
const ageCell = document.createElement('td');
ageCell.textContent = student.age;
const deleteButton = document.createElement('button');
deleteButton.textContent = '刪除';
deleteButton.addEventListener('click', () => {
deleteStudent(student.id);
});
const updateButton = document.createElement('button');
updateButton.textContent = '更新';
updateButton.addEventListener('click', () => {
// 這里可以實現(xiàn)跳轉到更新頁面或者彈出更新表單等操作,暫不詳細展開
console.log('更新學生:', student);
});
const actionCell = document.createElement('td');
actionCell.appendChild(deleteButton);
actionCell.appendChild(updateButton);
row.appendChild(idCell);
row.appendChild(nameCell);
row.appendChild(ageCell);
row.appendChild(actionCell);
studentTable.appendChild(row);
});
}
// 函數(shù):添加學生
function addStudent() {
const name = document.getElementById('name').value;
const age = document.getElementById('age').value;
const studentData = {
name: name,
age: age
};
fetch('/addStudent', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(studentData)
})
.then(response => response.json())
.then(() => {
// 添加成功后重新獲取學生列表并顯示
getStudents();
})
.catch(error => console.error(error));
}
// 函數(shù):刪除學生
function deleteStudent(id) {
fetch('/deleteStudent/' + id, {
method: 'DELETE'
})
.then(response => response.json())
.then(() => {
// 刪除成功后重新獲取學生列表并顯示
getStudents();
})
.catch(error => console.error(error));
}
// 函數(shù):獲取學生列表
function getStudents() {
fetch('/getStudents')
.then(response => response.json())
.then((students) => {
populateStudentTable(students);
})
.catch(error => console.error(error));
}
// 頁面加載時獲取學生列表并顯示
window.onload = function () {
getStudents();
};
// 為添加學生表單添加提交事件監(jiān)聽器
addStudentForm.addEventListener('submit', (e) => {
e.preventDefault();
addStudent();
});
在上述 JavaScript 文件中,實現(xiàn)了以下幾個主要功能:
填充學生列表表格:根據(jù)從后端獲取的學生數(shù)據(jù),動態(tài)生成表格內容并顯示在頁面上。
添加學生:獲取表單輸入的學生姓名和年齡信息,通過fetch API 發(fā)送POST請求到后端的/addStudent接口,添加成功后重新獲取并顯示學生列表。
刪除學生:當點擊刪除按鈕時,通過fetch API 發(fā)送DELETE請求到后端的/deleteStudent接口,刪除成功后重新獲取并顯示學生列表。
獲取學生列表:在頁面加載時以及其他操作后需要重新獲取學生列表時,通過fetch API 發(fā)送GET請求到后端的/getStudents接口,獲取學生數(shù)據(jù)并調用填充表格函數(shù)進行顯示。
2. 后端代碼調整
在之前的 Java 代碼基礎上,需要進行一些調整來處理前端頁面發(fā)送過來的請求并返回相應的結果。
修改StudentDAO類
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class StudentDAO {
// 獲取所有學生信息
public List
List
try (Connection connection = DatabaseConnection.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM students")) {
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
Student student = new Student();
student.setId(resultSet.getInt("id"));
student.setName(resultSet.getString("id"));
student.setAge(resultSet.getInt("age"));
students.add(student);
}
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
// 根據(jù)ID獲取單個學生信息
public Student getStudentById(int id) {
Student student = null;
try (Connection connection = DatabaseConnection.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM students WHERE id =?")) {
preparedStatement.setInt(1, id);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
student = new Student();
student.setId(resultSet.getInt("id"));
student.setName(resultSet.getString("name"));
student.setAge(resultSet.getInt("age"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return student;
}
// 添加學生信息
public void addStudent(Student student) {
try (Connection connection = DatabaseConnection.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO students (name, age) VALUES (?,?)")) {
preparedStatement.setString(1, student.getName());
preparedStatement.setInt(2, student.getAge());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 更新學生信息
public void updateStudent(Student student) {
try (Connection connection = DatabaseConnection.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE students SET name =?, age =? WHERE id =?")) {
preparedStatement.setString(1, student.getName());
preparedStatement.setInt(2, if (student.getAge()!= null) {
return student.getAge();
} else {
return 0;
}));
preparedStatement.setInt(3, student.getId());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 刪除學生信息
public void deleteStudent(int id) {
try (Connection connection = DatabaseConnection.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM students WHERE id =?")) {
preparedStatement.setInt(1, id);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
這里在StudentDAO類中增加了根據(jù)ID獲取單個學生信息的方法。
創(chuàng)建 Servlet 類來處理前端請求
import com.google.gson.Gson;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet("/getStudents")
public class GetStudentsServlet extends HttpServlet {
@Override
protected void doGet() {
StudentDAO studentDAO = new StudentDAO();
List
Gson gson = new Gson();
String jsonResponse = gson.toJson(students);
try (PrintWriter writer = response.getWriter()) {
writer.write(jsonResponse);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@WebServlet("/addStudent")
public class AddStudentServlet extends HttpServlet {
@Override
protected void doPost() {
StudentDAO studentDAO = new StudentDAO();
Gson gson = new Gson();
try {
String requestBody = request.getReader().readString();
Student student = gson.fromJson(requestBody, Student.class);
studentDAO.addStudent(student);
try (PrintWriter writer = response.getWriter()) {
writer.write("添加成功");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@WebServlet("/deleteStudent")
public class DeleteStudentServlet extends HttpServlet {
@Override
protected void doDelete() {
int id = Integer.parseInt(request.getPathInfo().substring(1));
StudentDAO studentDAO = new StudentDAO();
studentDAO.deleteStudent(id);
try (PrintWriter writer = response.getWriter()) {
writer.write("刪除成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
@WebServlet("/updateStudent")
public class UpdateStudentServlet extends HttpServlet {
@Override
protected void doPut() {
StudentDAO studentDAO = new StudentDAO();
Gson gson = new Gson();
try {
String requestBody = request.getReader().readString();
Student student = gson.fromJson(requestBody, Student.class);
studentDAO.updateStudent(student);
try (PrintWriter writer = response.getWriter()) {
writer.write("更新成功");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述代碼中,創(chuàng)建了幾個Servlet類來分別處理前端頁面發(fā)送過來的GET(獲取學生列表)、POST(添加學生)、DELETE(刪除學生)、PUT(更新學生)等請求。通過Gson庫將 Java 對象和 JSON 字符串進行相互轉換,以便在前后端之間進行數(shù)據(jù)傳輸和交互。
在mysql中創(chuàng)建students表
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
age INT,
gender ENUM('男', '女', '其他') DEFAULT '其他',
major VARCHAR(255),
grade INT,
);
id:作為學生記錄的唯一標識符,設置為自增長的整數(shù)類型,并將其指定為表的主鍵。這樣每當插入一條新的學生記錄時,id的值會自動遞增。
name:用于存儲學生的姓名,設置為VARCHAR類型,最大長度為 255 個字符,并且規(guī)定該字段不能為空,以確保每條學生記錄都有對應的姓名信息。
age:用來記錄學生的年齡,為整數(shù)類型。這里可以根據(jù)實際情況考慮是否設置年齡的取值范圍限制等約束條件。
gender:表示學生的性別,采用ENUM枚舉類型,列舉了常見的性別選項 ' 男'、' 女 '、' 其他 ',并將默認值設置為 ' 其他 ',以便應對一些特殊情況。
major:存儲學生所學的專業(yè),也是VARCHAR類型,最大長度 255 個字符,可根據(jù)具體專業(yè)名稱的長度需求進行調整。
grade:記錄學生所在的年級,為整數(shù)類型。

浙公網(wǎng)安備 33010602011771號