基于Java JDBC的数据库增删改查实现详解
JDBC(Java Database Connectivity)是Java平台用于连接和操作关系型数据库的标准API。它为应用程序提供了与数据库交互的能力,包括建立连接、执行SQL语句以及处理查询结果等核心功能。
JDBC的主要优势在于:
- 直接使用标准SQL语言,无需学习额外的查询语法;
- 能够充分利用数据库的全部特性,如存储过程、事务控制和特定函数;
- 提供细粒度的数据访问能力,允许开发者精确控制每一步操作,适合对性能或数据处理逻辑有严格要求的应用场景。
尽管JDBC提供了强大的底层控制能力,但其缺点也较为明显:需要手动管理资源、处理异常,并且实体类与数据库表之间的映射需自行实现。以下通过一个示例展示如何使用JDBC完成基本的CRUD操作。
实体类定义与数据库表结构对应
假设存在一个用户实体UserAccount,包含ID、用户名和密码字段:
public class UserAccount {
private Long id;
private String userName;
private String credentials;
// getter 和 setter 方法省略
}
对应的数据库表为user_account,结构如下:
CREATE TABLE user_account (
id BIGINT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(100)
);
插入记录(Insert)
使用PreparedStatement防止SQL注入,动态设置参数值:
public void insertRecord(UserAccount account) {
Connection connection = null;
PreparedStatement stmt = null;
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append("INSERT INTO user_account (username, password) VALUES (?, ?)");
int paramIndex = 1;
try {
connection = DataSourceConfig.getConnection(); // 获取数据库连接
stmt = connection.prepareStatement(sqlBuilder.toString());
// 设置参数
if (account.getUserName() != null) {
stmt.setString(paramIndex++, account.getUserName());
} else {
stmt.setNull(paramIndex++, java.sql.Types.VARCHAR);
}
if (account.getCredentials() != null) {
stmt.setString(paramIndex++, account.getCredentials());
} else {
stmt.setNull(paramIndex++, java.sql.Types.VARCHAR);
}
stmt.executeUpdate(); // 执行插入
} catch (SQLException ex) {
// 异常处理,例如日志记录
} finally {
closeQuietly(stmt);
closeQuietly(connection);
}
}
更新记录(Update)
根据主键更新指定字段:
public void updateRecord(UserAccount account) {
Connection connection = null;
PreparedStatement stmt = null;
String sql = "UPDATE user_account SET username = ?, password = ? WHERE id = ?";
int paramIndex = 1;
try {
connection = DataSourceConfig.getConnection();
stmt = connection.prepareStatement(sql);
stmt.setString(paramIndex++, account.getUserName());
stmt.setString(paramIndex++, account.getCredentials());
stmt.setLong(paramIndex++, account.getId());
stmt.executeUpdate();
} catch (SQLException ex) {
// 错误处理
} finally {
closeQuietly(stmt);
closeQuietly(connection);
}
}
删除记录(Delete)
按ID删除单条数据:
public void removeById(Long recordId) {
Connection conn = null;
PreparedStatement ps = null;
String sql = "DELETE FROM user_account WHERE id = ?";
try {
conn = DataSourceConfig.getConnection();
ps = conn.prepareStatement(sql);
ps.setLong(1, recordId);
ps.executeUpdate();
} catch (SQLException e) {
// 处理异常
} finally {
closeQuietly(ps);
closeQuietly(conn);
}
}
查询记录(Select)
支持单条记录和列表查询,并将结果集转换为Java对象:
public UserAccount findById(Long recordId) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
UserAccount user = null;
String sql = "SELECT id, username, password FROM user_account WHERE id = ?";
try {
conn = DataSourceConfig.getConnection();
ps = conn.prepareStatement(sql);
ps.setLong(1, recordId);
rs = ps.executeQuery();
if (rs.next()) {
user = mapRowToEntity(rs);
}
} catch (SQLException e) {
// 异常捕获
} finally {
closeQuietly(rs);
closeQuietly(ps);
closeQuietly(conn);
}
return user;
}
批量查询返回集合:
List<UserAccount> userList = new ArrayList<>();
while (rs.next()) {
userList.add(mapRowToEntity(rs));
}
将结果集映射为实体对象的方法:
private UserAccount mapRowToEntity(ResultSet resultSet) throws SQLException {
UserAccount user = new UserAccount();
user.setId(resultSet.getLong("id"));
user.setUserName(resultSet.getString("username"));
user.setCredentials(resultSet.getString("password"));
return user;
}
资源释放辅助方法:
private void closeQuietly(AutoCloseable resource) {
if (resource != null) {
try {
resource.close();
} catch (Exception ignored) { }
}
}