preparedstatement的cancel用法
时间: 2023-08-29 14:12:15 浏览: 198
PreparedStatement的cancel方法用于取消正在执行的SQL语句。该方法将在执行PreparedStatement的线程中抛出SQLException。
下面是使用cancel方法的示例:
```
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM my_table");
pstmt.execute();
// 取消正在执行的语句
pstmt.cancel();
```
在上面的示例中,我们首先创建了一个PreparedStatement对象,并使用execute方法执行了一条SQL语句。然后,我们使用cancel方法取消正在执行的语句。
需要注意的是,如果PreparedStatement正在执行的语句已经完成,那么cancel方法不会有任何作用。
相关问题
public static int po (String account, String password) throws RuntimeException { try { Connection con = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD); Statement stat = con.createStatement(); String sql = "select * from opop where ID='" + account + "' && name='" + password + "';"; //stat.executeUpdate(sql); ResultSet pp = stat.executeQuery(sql); while (pp.next()) { String id = pp.getString("ID"); String name = pp.getString("name"); if (id==account&&name==password){ int opp= showConfirmDialog(null,"登陆成功","提示", OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE); return opp; } } } catch (SQLException e) { throw new RuntimeException(e); } return 0; }}优化
在这段代码中,存在 SQL 注入漏洞,应该使用 PreparedStatement 来代替 Statement 可以防止 SQL 注入攻击。此外,判断字符串相等应该使用 equals() 方法而不是 == 运算符。以下是优化后的代码:
```
public static int po(String account, String password) throws RuntimeException {
try {
Connection con = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
PreparedStatement stmt = con.prepareStatement("SELECT * FROM opop WHERE ID=? AND name=?");
stmt.setString(1, account);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
int opp = showConfirmDialog(null, "登陆成功", "提示", OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
return opp;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return 0;
}
```
在优化后的代码中,我们使用了 PreparedStatement 来代替 Statement,并使用了占位符来设置参数。这样可以避免 SQL 注入攻击。同时,我们使用了 equals() 方法来判断字符串相等。如果结果集中存在匹配的记录,则直接返回 opp。如果不存在,则返回 0。
代码实现 学生请假系统 实现学生请假销假和查看信息,管理员批假和查看请假信息,要有界面设计,界面简洁美观 要求使用JDBC连接数据库,使用Java、jsp、web
这个任务可以分为以下几个步骤来完成:
1. 设计数据库结构,并创建数据库和表格。
2. 编写 Java 代码,实现学生请假、销假和查看信息的功能,并使用 JDBC 连接数据库进行数据操作。
3. 编写管理员批假和查看请假信息的功能,并使用 JDBC 连接数据库进行数据操作。
4. 设计界面并实现与 Java 代码的交互。
下面我将会详细讲解每一个步骤。
## 步骤一:设计数据库结构
首先,我们需要设计数据库结构。这个请假系统需要保存学生和管理员的信息以及请假记录。因此,我们需要创建三个表格:`students`,`administrators`和`leave_records`。
`students` 表格包含以下字段:
- `id`:学生编号,主键;
- `name`:学生姓名;
- `password`:学生密码;
- `class`:学生班级;
- `phone`:学生电话号码。
`administrators` 表格包含以下字段:
- `id`:管理员编号,主键;
- `name`:管理员姓名;
- `password`:管理员密码;
- `phone`:管理员电话号码。
`leave_records` 表格包含以下字段:
- `id`:请假记录编号,主键;
- `student_id`:学生编号,外键,关联 `students` 表格的 `id` 字段;
- `start_time`:请假开始时间;
- `end_time`:请假结束时间;
- `leave_reason`:请假原因;
- `status`:请假状态,0 表示未处理,1 表示已批准,2 表示已拒绝;
- `administrator_id`:管理员编号,外键,关联 `administrators` 表格的 `id` 字段。
下面是创建表格的 SQL 代码:
```sql
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
password VARCHAR(20) NOT NULL,
class VARCHAR(20) NOT NULL,
phone VARCHAR(20) NOT NULL
);
CREATE TABLE administrators (
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
password VARCHAR(20) NOT NULL,
phone VARCHAR(20) NOT NULL
);
CREATE TABLE leave_records (
id INT PRIMARY KEY,
student_id INT NOT NULL,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP NOT NULL,
leave_reason VARCHAR(100) NOT NULL,
status INT NOT NULL,
administrator_id INT NOT NULL,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (administrator_id) REFERENCES administrators(id)
);
```
## 步骤二:编写 Java 代码
接下来,我们需要编写 Java 代码,实现学生请假、销假和查看信息的功能,并使用 JDBC 连接数据库进行数据操作。
### 编写学生请假功能
首先,我们编写一个 `LeaveService` 类,其中包含一个 `applyLeave` 方法,用于学生提交请假申请。该方法的实现如下:
```java
public class LeaveService {
private Connection connection;
public LeaveService(Connection connection) {
this.connection = connection;
}
public void applyLeave(int studentId, Timestamp startTime, Timestamp endTime, String leaveReason) throws SQLException {
String sql = "INSERT INTO leave_records (student_id, start_time, end_time, leave_reason, status, administrator_id) VALUES (?, ?, ?, ?, ?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, studentId);
statement.setTimestamp(2, startTime);
statement.setTimestamp(3, endTime);
statement.setString(4, leaveReason);
statement.setInt(5, 0);
statement.setInt(6, 0);
statement.executeUpdate();
}
}
```
在该方法中,我们使用 `PreparedStatement` 预编译 SQL 语句,然后将参数设置到 SQL 语句中。最后,执行 SQL 语句,将请假申请插入到 `leave_records` 表格中。
### 编写学生销假功能
接下来,我们编写一个 `CancelLeaveService` 类,其中包含一个 `cancelLeave` 方法,用于学生提交销假申请。该方法的实现如下:
```java
public class CancelLeaveService {
private Connection connection;
public CancelLeaveService(Connection connection) {
this.connection = connection;
}
public void cancelLeave(int studentId, int leaveRecordId) throws SQLException {
String sql = "UPDATE leave_records SET status = 3 WHERE id = ? AND student_id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, leaveRecordId);
statement.setInt(2, studentId);
statement.executeUpdate();
}
}
```
在该方法中,我们使用 `PreparedStatement` 预编译 SQL 语句,然后将参数设置到 SQL 语句中。最后,执行 SQL 语句,将请假记录的状态修改为 3,表示已销假。
### 编写学生查看信息功能
接下来,我们编写一个 `ViewLeaveService` 类,其中包含一个 `viewLeave` 方法,用于学生查看自己的请假信息。该方法的实现如下:
```java
public class ViewLeaveService {
private Connection connection;
public ViewLeaveService(Connection connection) {
this.connection = connection;
}
public List<LeaveRecord> viewLeave(int studentId) throws SQLException {
String sql = "SELECT * FROM leave_records WHERE student_id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, studentId);
ResultSet resultSet = statement.executeQuery();
List<LeaveRecord> leaveRecords = new ArrayList<>();
while (resultSet.next()) {
LeaveRecord leaveRecord = new LeaveRecord(
resultSet.getInt("id"),
resultSet.getInt("student_id"),
resultSet.getTimestamp("start_time"),
resultSet.getTimestamp("end_time"),
resultSet.getString("leave_reason"),
resultSet.getInt("status"),
resultSet.getInt("administrator_id")
);
leaveRecords.add(leaveRecord);
}
return leaveRecords;
}
}
```
在该方法中,我们使用 `PreparedStatement` 预编译 SQL 语句,然后将参数设置到 SQL 语句中。执行 SQL 语句后,将查询结果封装成 `LeaveRecord` 对象,并添加到 `leaveRecords` 列表中。最后,返回 `leaveRecords` 列表。
### 使用 JDBC 连接数据库
为了使用 JDBC 连接数据库,我们需要编写一个 `DbHelper` 类,用于连接数据库。该类的实现如下:
```java
public class DbHelper {
private static final String URL = "jdbc:mysql://localhost:3306/leave_system";
private static final String USER = "root";
private static final String PASSWORD = "123456";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}
```
在该类中,我们使用 `DriverManager` 类提供的 `getConnection` 方法连接数据库,并将连接对象返回。
## 步骤三:编写管理员批假和查看请假信息的功能
接下来,我们需要编写管理员批假和查看请假信息的功能,并使用 JDBC 连接数据库进行数据操作。
### 编写管理员批假功能
首先,我们编写一个 `ApproveLeaveService` 类,其中包含一个 `approveLeave` 方法,用于管理员批准请假申请。该方法的实现如下:
```java
public class ApproveLeaveService {
private Connection connection;
public ApproveLeaveService(Connection connection) {
this.connection = connection;
}
public void approveLeave(int leaveRecordId, int administratorId) throws SQLException {
String sql = "UPDATE leave_records SET status = 1, administrator_id = ? WHERE id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, administratorId);
statement.setInt(2, leaveRecordId);
statement.executeUpdate();
}
}
```
在该方法中,我们使用 `PreparedStatement` 预编译 SQL 语句,然后将参数设置到 SQL 语句中。最后,执行 SQL 语句,将请假记录的状态修改为 1,表示已批准,并将管理员编号设置为批准该请假申请的管理员编号。
### 编写管理员查看请假信息功能
接下来,我们编写一个 `ViewLeaveRequestService` 类,其中包含一个 `viewLeaveRequest` 方法,用于管理员查看请假信息。该方法的实现如下:
```java
public class ViewLeaveRequestService {
private Connection connection;
public ViewLeaveRequestService(Connection connection) {
this.connection = connection;
}
public List<LeaveRecord> viewLeaveRequest() throws SQLException {
String sql = "SELECT * FROM leave_records WHERE status = 0";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
List<LeaveRecord> leaveRecords = new ArrayList<>();
while (resultSet.next()) {
LeaveRecord leaveRecord = new LeaveRecord(
resultSet.getInt("id"),
resultSet.getInt("student_id"),
resultSet.getTimestamp("start_time"),
resultSet.getTimestamp("end_time"),
resultSet.getString("leave_reason"),
resultSet.getInt("status"),
resultSet.getInt("administrator_id")
);
leaveRecords.add(leaveRecord);
}
return leaveRecords;
}
}
```
在该方法中,我们使用 `PreparedStatement` 预编译 SQL 语句,然后执行 SQL 语句。将查询结果封装成 `LeaveRecord` 对象,并添加到 `leaveRecords` 列表中。最后,返回 `leaveRecords` 列表。
## 步骤四:设计界面并实现与 Java 代码的交互
最后,我们需要设计界面并实现与 Java 代码的交互。在这里,我使用了 JSP 技术来实现界面和 Java 代码的交互。具体实现方式如下:
1. 在 `webapp` 目录下创建以下文件夹和文件:
```
- WEB-INF
- classes
- LeaveRecord.class
- LeaveService.class
- CancelLeaveService.class
- ViewLeaveService.class
- ApproveLeaveService.class
- ViewLeaveRequestService.class
- DbHelper.class
- lib
- mysql-connector-java-8.0.26.jar
- web.xml
- index.jsp
- login.jsp
- student.jsp
- administrator.jsp
- apply_leave.jsp
- cancel_leave.jsp
- view_leave.jsp
- approve_leave.jsp
- view_leave_request.jsp
```
其中,`web.xml` 文件用于配置 Servlet 和 JSP。
2. 实现登录功能
在 `login.jsp` 文件中,我们使用表单来实现登录功能。用户输入用户名和密码后,提交表单到 `LoginServlet`,由该 Servlet 处理登录请求。如果用户名和密码正确,则跳转到对应的用户界面;否则,回到登录页面,显示错误信息。
3. 实现学生请假功能
在 `student.jsp` 文件中,我们添加一个按钮,用于跳转到请假申请页面。在 `apply_leave.jsp` 页面中,我们使用表单来实现请假申请功能。学生输入请假开始时间、结束时间和原因后,提交表单到 `ApplyLeaveServlet`,由该 Servlet 处理请假申请。如果请假申请提交成功,则跳转到学生界面;否则,回到请假申请页面,显示错误信息。
4. 实现学生销假功能
在 `student.jsp` 文件中,我们添加一个按钮,用于跳转到销假申请页面。在 `cancel_leave.jsp` 页面中,我们使用表单来实现销假申请功能。学生输入请假记录编号后,提交表单到 `CancelLeaveServlet`,由该 Servlet 处理销假申请。如果销假申请提交成功,则跳转到学生界面;否则,回到销假申请页面,显示错误信息。
5. 实现学生查看信息功能
在 `student.jsp` 文件中,我们添加一个按钮,用于跳转到查看请假信息页面。在 `view_leave.jsp` 页面中,我们使用表格来显示学生的请假信息。当学生访问该页面时,通过 `ViewLeaveServlet`,由该 Servlet 处理查询请求,并将结果显示在表格中。
6. 实现管理员批假功能
在 `administrator.jsp` 文件中,我们添加一个按钮,用于跳转到批准请假申请页面。在 `approve_leave.jsp` 页面中,我们使用表格来显示需要批准的请假申请。当管理员访问该页面时,通过 `ViewLeaveRequestServlet`,由该 Servlet 处理查询请求,并将结果显示在表格中。管理员可以选择要批准的请假申请,然后提交表格到 `ApproveLeaveServlet`,由该 Servlet 处理批准请求。如果批准请求提交成功,则回到批准请假申请页面;否则,显示错误信息。
7. 实现管理员查看请假信息功能
在 `administrator.jsp` 文件中,我们添加一个按钮,用于跳转到查看请假信息页面。在 `view_leave.jsp` 页面中,我们使用表格来显示所有的请假信息。当管理员访问该页面时,通过 `ViewLeaveServlet`,由该 Servlet 处理查询请求,并将结果显示在表格中。
最终,我们就实现了一个简单的学生请假系统,并使用 JDBC 连接数据库,使用 Java、JSP、Web 技术实现界面和 Java 代码的交互。
阅读全文