|
|
@ -0,0 +1,318 @@
|
|
|
|
|
|
|
|
package com.dao.impl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.sql.Connection;
|
|
|
|
|
|
|
|
import java.sql.PreparedStatement;
|
|
|
|
|
|
|
|
import java.sql.ResultSet;
|
|
|
|
|
|
|
|
import java.sql.SQLException;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.dao.AccountDao;
|
|
|
|
|
|
|
|
import com.javaBean.Account;
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 实现了AccountDao接口,该类封装了对账户数据进行CRUD(创建、读取、更新、删除)操作的数据库逻辑。
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public class Accountimpl implements AccountDao {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 从数据库连接工具类获取连接。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return 数据库连接对象
|
|
|
|
|
|
|
|
* @throws SQLException 连接失败时抛出
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
// 使用JDBC工具类获取数据库连接
|
|
|
|
|
|
|
|
private Connection getConnection() throws SQLException {
|
|
|
|
|
|
|
|
return JDBCUtil.getConnection();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 验证用户ID和密码是否匹配。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param userid 用户ID
|
|
|
|
|
|
|
|
* @param password 用户密码
|
|
|
|
|
|
|
|
* @return 匹配的Account对象,如果没有匹配的记录则返回null
|
|
|
|
|
|
|
|
* @throws SQLException 数据库操作过程中发生的异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Account validateUser(String userid, String password) throws SQLException {
|
|
|
|
|
|
|
|
// 方法功能:验证用户ID和密码是否匹配,如果匹配则返回对应的Account对象,否则返回null。
|
|
|
|
|
|
|
|
// 参数:userid - 用户ID;password - 用户密码。
|
|
|
|
|
|
|
|
// 返回:与userid和password匹配的Account对象,如果没有匹配项则返回null。
|
|
|
|
|
|
|
|
// 异常:可能会抛出SQLException,表示数据库访问过程中发生错误。
|
|
|
|
|
|
|
|
Account account = null;// 初始化Account对象为null,准备存储查询结果。
|
|
|
|
|
|
|
|
Connection conn = null;// 数据库连接对象。
|
|
|
|
|
|
|
|
PreparedStatement prestm = null; // 预编译的SQL语句对象,用于执行查询。
|
|
|
|
|
|
|
|
ResultSet rs = null;// 结果集对象,用于存放查询结果。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 1. 获取数据库连接。
|
|
|
|
|
|
|
|
conn = getConnection();
|
|
|
|
|
|
|
|
// 2. 构造SQL查询语句,用于根据用户ID和密码验证用户。
|
|
|
|
|
|
|
|
// 使用预编译语句(PreparedStatement)以防止SQL注入攻击
|
|
|
|
|
|
|
|
String sql = "SELECT * FROM elsfk.wlw20 WHERE userid=? AND password=?";
|
|
|
|
|
|
|
|
// 3. 创建PreparedStatement实例并预编译SQL语句。
|
|
|
|
|
|
|
|
prestm = conn.prepareStatement(sql);
|
|
|
|
|
|
|
|
// 4. 为预编译语句的参数赋值。
|
|
|
|
|
|
|
|
prestm.setString(1, userid); // 设置第一个问号的值为userid
|
|
|
|
|
|
|
|
prestm.setString(2, password); // 设置第二个问号的值为password
|
|
|
|
|
|
|
|
// 5. 执行查询语句。
|
|
|
|
|
|
|
|
rs = prestm.executeQuery();
|
|
|
|
|
|
|
|
// 6. 判断查询结果是否有数据。
|
|
|
|
|
|
|
|
if (rs.next()) {
|
|
|
|
|
|
|
|
// 7. 如果查询到匹配的记录,创建Account对象并填充数据。
|
|
|
|
|
|
|
|
account = new Account();
|
|
|
|
|
|
|
|
account.setuserid(rs.getString("userid")); // 假设Account类有set_userid方法
|
|
|
|
|
|
|
|
account.setpassword(rs.getString("password")); // 同上,假设存在set_password方法
|
|
|
|
|
|
|
|
// 根据实际表结构,可继续设置其他属性
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
|
|
|
// 8. 捕获并打印SQLException,用于调试和问题追踪。
|
|
|
|
|
|
|
|
// 再次抛出异常,允许上层调用者处理此异常。
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
|
|
throw e; // 重新抛出异常,以便调用者可以处理
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
// 9. 确保在方法结束前,所有数据库资源(ResultSet、PreparedStatement、Connection)被关闭。
|
|
|
|
|
|
|
|
closeResources(rs, prestm, conn);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 10. 返回查询结果。如果有匹配项,则返回Account对象;否则返回null。
|
|
|
|
|
|
|
|
return account;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 其他方法的实现与validateUser相似,增加了详细的注释说明每一步操作的目的和处理逻辑
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 通用资源关闭方法,确保ResultSet、PreparedStatement、Connection等资源被正确关闭。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param rs 结果集对象
|
|
|
|
|
|
|
|
* @param stmt PreparedStatement对象
|
|
|
|
|
|
|
|
* @param conn 数据库连接对象
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 根据用户ID查找账户信息。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param userid 用户ID
|
|
|
|
|
|
|
|
* @return 查找到的Account对象,如果未找到则返回null
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Account findByUserid(String userid) {
|
|
|
|
|
|
|
|
// 方法功能:根据用户ID从数据库中查找对应的账户信息。
|
|
|
|
|
|
|
|
// 参数:userid - 需要查询的用户ID。
|
|
|
|
|
|
|
|
// 返回:与userid匹配的Account对象,如果没有找到匹配的记录,则返回null。
|
|
|
|
|
|
|
|
Account account = null;// 初始化Account对象为null,用于存储查询结果。
|
|
|
|
|
|
|
|
Connection conn = null;// 数据库连接对象。
|
|
|
|
|
|
|
|
PreparedStatement prestm = null;// 预编译的SQL语句对象,用于执行查询
|
|
|
|
|
|
|
|
ResultSet rs = null;// 结果集对象,用于存放查询结果。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 获取数据库连接。
|
|
|
|
|
|
|
|
conn = getConnection();
|
|
|
|
|
|
|
|
// 准备SQL查询语句,目的是根据用户ID查找账户信息。
|
|
|
|
|
|
|
|
String sql = "SELECT * FROM elsfk.wlw20 WHERE userid=?";
|
|
|
|
|
|
|
|
// 创建PreparedStatement实例,预编译SQL语句,以防止SQL注入攻击。
|
|
|
|
|
|
|
|
prestm = conn.prepareStatement(sql);
|
|
|
|
|
|
|
|
// 设置SQL语句中的第一个参数(占位符)为传入的userid。
|
|
|
|
|
|
|
|
prestm.setString(1, userid);
|
|
|
|
|
|
|
|
// 执行查询语句。
|
|
|
|
|
|
|
|
rs = prestm.executeQuery();
|
|
|
|
|
|
|
|
// 如果查询结果集中有下一条记录(即找到了匹配的用户ID)。
|
|
|
|
|
|
|
|
if (rs.next()) {
|
|
|
|
|
|
|
|
account = new Account();// 从结果集中获取用户ID并设置到Account对象中。
|
|
|
|
|
|
|
|
account.setuserid(rs.getString("userid"));// 从结果集中获取密码并设置到Account对象中
|
|
|
|
|
|
|
|
account.setpassword(rs.getString("password"));// 注释提示:此处可根据实际需要继续设置Account对象的其他属性。
|
|
|
|
|
|
|
|
// 设置其他属性...
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
|
|
|
// 捕获并打印SQL异常,用于调试和问题追踪。
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
|
|
// 注意:在生产环境中,除了打印堆栈跟踪,还应考虑更合理的异常处理机制,如记录日志、抛出自定义异常等。
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
// 确保数据库资源(ResultSet、PreparedStatement、Connection)在方法结束前被关闭。
|
|
|
|
|
|
|
|
// 即便在try块中发生了异常,finally块中的代码也会被执行。
|
|
|
|
|
|
|
|
closeResources(rs, prestm, conn);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 返回查询结果。如果有匹配的记录,则返回填充了数据的Account对象;否则返回null。
|
|
|
|
|
|
|
|
return account;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 添加一个新的账户到数据库。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param account 要添加的Account对象
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public void addAccount(Account account) {
|
|
|
|
|
|
|
|
// 方法功能:向数据库中添加一个新的账户信息。
|
|
|
|
|
|
|
|
// 参数:account - 要添加的Account对象,应包含至少userid和password属性。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Connection conn = null;// 数据库连接对象。
|
|
|
|
|
|
|
|
PreparedStatement prestm = null;// 预编译的SQL语句对象,用于执行插入操作。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {// 1. 通过getConnection()方法获取数据库连接。
|
|
|
|
|
|
|
|
conn = getConnection();
|
|
|
|
|
|
|
|
// 2. 准备SQL插入语句,用于向表elsfk.wlw20中插入新记录,插入字段为userid和password。
|
|
|
|
|
|
|
|
String sql = "INSERT INTO elsfk.wlw20 (userid, password) VALUES (?, ?)";
|
|
|
|
|
|
|
|
// 3. 创建PreparedStatement实例,预编译SQL语句,以防止SQL注入攻击。
|
|
|
|
|
|
|
|
prestm = conn.prepareStatement(sql);
|
|
|
|
|
|
|
|
// 4. 为预编译语句的占位符设置实际值。
|
|
|
|
|
|
|
|
//设置第一个问号为Account对象中的userid。
|
|
|
|
|
|
|
|
prestm.setString(1, account.getuserid());
|
|
|
|
|
|
|
|
//设置第二个问号为Account对象中的password
|
|
|
|
|
|
|
|
prestm.setString(2, account.getpassword());
|
|
|
|
|
|
|
|
// 5. 执行插入操作,将预编译SQL语句中的数据插入到数据库中。
|
|
|
|
|
|
|
|
prestm.executeUpdate(); // 执行插入操作
|
|
|
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
|
|
|
// 6. 捕获并打印SQLException,用于调试和问题追踪。
|
|
|
|
|
|
|
|
// 实际应用中,可能需要更细致的错误处理,如记录日志、事务回滚等。
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
// 7. 在finally块中确保数据库资源被关闭,即使在try-catch中发生异常也是如此。
|
|
|
|
|
|
|
|
// 注意:这里传入的ResultSet为null,因为addAccount操作不涉及查询操作。
|
|
|
|
|
|
|
|
closeResources(null, prestm, conn);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 查询并返回数据库中的所有账户信息。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @return 包含所有账户的ArrayList集合
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public ArrayList<Account> findAll() {
|
|
|
|
|
|
|
|
// 方法功能:从数据库中检索所有账户信息,并以ArrayList形式返回所有Account对象列表。
|
|
|
|
|
|
|
|
ArrayList<Account> accounts = new ArrayList<>();// 初始化一个ArrayList,用于存储查询到的所有Account对象。
|
|
|
|
|
|
|
|
Connection conn = null; // 数据库连接对象。
|
|
|
|
|
|
|
|
PreparedStatement prestm = null; // 预编译的SQL语句对象,用于执行查询操作。
|
|
|
|
|
|
|
|
ResultSet rs = null;// 结果集对象,用于存放查询结果。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 1. 通过getConnection()方法获取数据库连接。
|
|
|
|
|
|
|
|
conn = getConnection();
|
|
|
|
|
|
|
|
// 2. 构建SQL查询语句,用于从表elsfk.wlw20中选取所有记录。
|
|
|
|
|
|
|
|
String sql = "SELECT * FROM elsfk.wlw20";
|
|
|
|
|
|
|
|
// 3. 创建PreparedStatement实例,预编译SQL查询语句,提高执行效率并防止SQL注入。
|
|
|
|
|
|
|
|
prestm = conn.prepareStatement(sql);
|
|
|
|
|
|
|
|
// 4. 执行查询操作,获取结果集。
|
|
|
|
|
|
|
|
rs = prestm.executeQuery();
|
|
|
|
|
|
|
|
// 5. 遍历结果集,对于每一行数据,创建Account对象并填充数据,然后将其添加到accounts列表中。
|
|
|
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
|
|
|
Account acc = new Account();
|
|
|
|
|
|
|
|
// 获取当前行的userid字段值,并设置给Account对象。
|
|
|
|
|
|
|
|
acc.setuserid(rs.getString("userid"));
|
|
|
|
|
|
|
|
// 获取当前行的password字段值,并设置给Account对象。
|
|
|
|
|
|
|
|
acc.setpassword(rs.getString("password"));
|
|
|
|
|
|
|
|
// 注释提示:此处可根据实际表结构继续设置Account对象的其他属性
|
|
|
|
|
|
|
|
accounts.add(acc); // 将填充好的Account对象添加到列表中。
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
|
|
|
// 6. 捕获并打印SQLException,用于调试和问题追踪。
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
closeResources(rs, prestm, conn);
|
|
|
|
|
|
|
|
// 7. 确保在方法结束前,数据库资源(ResultSet、PreparedStatement、Connection)被正确关闭。
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 8. 返回包含所有账户信息的ArrayList。
|
|
|
|
|
|
|
|
return accounts;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 更新指定账户的密码信息。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param account 包含待更新账户信息的对象
|
|
|
|
|
|
|
|
* @return 受影响的行数,成功更新则返回1,否则为0
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public int updateAccount(Account account) {
|
|
|
|
|
|
|
|
// 方法功能:根据Account对象更新数据库中对应用户的密码信息。
|
|
|
|
|
|
|
|
// 返回值:受影响的行数,一般情况下,如果更新成功则返回1,表示有一行数据被修改;
|
|
|
|
|
|
|
|
// 如果没有匹配的记录,则返回0。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int rowsAffected = 0;// 初始化受影响的行数为0,用于记录更新操作的结果。
|
|
|
|
|
|
|
|
Connection conn = null; // 数据库连接对象。
|
|
|
|
|
|
|
|
PreparedStatement prestm = null;// 预编译的SQL语句对象,用于执行更新操作。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 1. 获取数据库连接。
|
|
|
|
|
|
|
|
conn = getConnection();
|
|
|
|
|
|
|
|
// 2. 构造SQL更新语句,用于根据userid更新账户的password。
|
|
|
|
|
|
|
|
String sql = "UPDATE elsfk.wlw20 SET password=? WHERE userid=?";
|
|
|
|
|
|
|
|
// 3. 创建PreparedStatement实例,预编译SQL更新语句,提高执行效率并防止SQL注入。
|
|
|
|
|
|
|
|
prestm = conn.prepareStatement(sql);
|
|
|
|
|
|
|
|
// 4. 设置预编译语句的参数。
|
|
|
|
|
|
|
|
// 第一个问号处设置为Account对象的password。
|
|
|
|
|
|
|
|
prestm.setString(1, account.getpassword());
|
|
|
|
|
|
|
|
// 第二个问号处设置为Account对象的userid,作为更新条件。
|
|
|
|
|
|
|
|
prestm.setString(2, account.getuserid());
|
|
|
|
|
|
|
|
// 5. 执行更新操作,并通过executeUpdate()方法获取受影响的行数。
|
|
|
|
|
|
|
|
rowsAffected = prestm.executeUpdate(); // 执行更新操作并获取影响的行数
|
|
|
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
|
|
|
// 6. 捕获并打印SQLException,用于调试和问题追踪。
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
// 7. 确保数据库资源(PreparedStatement、Connection)被正确关闭,即便在异常情况下。
|
|
|
|
|
|
|
|
closeResources(null, prestm, conn);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 8. 返回受影响的行数,供调用者判断更新操作是否成功。
|
|
|
|
|
|
|
|
return rowsAffected;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 根据用户ID删除账户。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param userid 要删除账户的用户ID
|
|
|
|
|
|
|
|
* @return 受影响的行数,成功删除则返回1,否则为0
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public int deleteAccount(String userid) {
|
|
|
|
|
|
|
|
// 方法功能:根据用户ID从数据库中删除对应的账户记录。
|
|
|
|
|
|
|
|
// 参数:userid - 需要删除的账户的用户ID。
|
|
|
|
|
|
|
|
// 返回值:受影响的行数,如果删除成功,通常返回1;若无匹配记录,则返回0。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int rowsAffected = 0;// 初始化受影响的行数变量,用于记录删除操作的影响范围。
|
|
|
|
|
|
|
|
Connection conn = null;// 数据库连接对象。
|
|
|
|
|
|
|
|
PreparedStatement prestm = null;// 预编译的SQL语句对象,用于执行删除操作。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 1. 通过getConnection()方法获取数据库连接。
|
|
|
|
|
|
|
|
conn = getConnection();
|
|
|
|
|
|
|
|
// 2. 构造SQL删除语句,用于根据userid删除表elsfk.wlw20中的记录。
|
|
|
|
|
|
|
|
String sql = "DELETE FROM elsfk.wlw20 WHERE userid=?";
|
|
|
|
|
|
|
|
// 3. 创建PreparedStatement实例,预编译SQL删除语句,以提高执行效率并防止SQL注入。
|
|
|
|
|
|
|
|
prestm = conn.prepareStatement(sql);
|
|
|
|
|
|
|
|
// 4. 设置预编译语句中的参数,即将userid值绑定到SQL中的第一个问号处。
|
|
|
|
|
|
|
|
prestm.setString(1, userid);
|
|
|
|
|
|
|
|
// 5. 执行删除操作,并通过executeUpdate()方法获取受影响的行数,即删除了多少行数据。
|
|
|
|
|
|
|
|
rowsAffected = prestm.executeUpdate(); // 执行删除操作并获取影响的行数
|
|
|
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
|
|
|
// 6. 捕获并打印SQLException,用于调试和问题追踪
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
// 7. 确保在方法结束前,数据库资源(PreparedStatement、Connection)被正确关闭。
|
|
|
|
|
|
|
|
closeResources(null, prestm, conn);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 8. 返回受影响的行数,调用者可以通过这个值判断删除操作是否成功。
|
|
|
|
|
|
|
|
return rowsAffected;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 关闭数据库操作所使用的资源,包括ResultSet、PreparedStatement和Connection。
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param rs 结果集对象
|
|
|
|
|
|
|
|
* @param prestm 预编译的SQL语句对象
|
|
|
|
|
|
|
|
* @param conn 数据库连接对象
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
private void closeResources(ResultSet rs, PreparedStatement prestm, Connection conn) {
|
|
|
|
|
|
|
|
// 方法功能:关闭数据库操作中使用的资源,包括ResultSet、PreparedStatement和Connection。
|
|
|
|
|
|
|
|
// 目的:确保每次数据库操作后,占用的资源能够被及时释放,避免资源泄露。
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
// 1. 如果ResultSet不为null,尝试关闭它。ResultSet用于存储查询结果,占用内存资源。
|
|
|
|
|
|
|
|
if (rs != null) rs.close();
|
|
|
|
|
|
|
|
// 2. 如果PreparedStatement不为null,尝试关闭它。PreparedStatement用于执行预编译的SQL语句。
|
|
|
|
|
|
|
|
if (prestm != null) prestm.close();
|
|
|
|
|
|
|
|
// 3. 如果Connection不为null,尝试关闭数据库连接。Connection是数据库操作的基础,是非常宝贵的资源。
|
|
|
|
|
|
|
|
if (conn != null) conn.close();
|
|
|
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
|
|
|
// 4. 在关闭资源过程中,如果遇到SQLException(如资源已被关闭或其他问题),打印堆栈跟踪。
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|