Java 数据库prepareStatement的详细用法
想要全面掌握 PreparedStatement 的详细用法,它是 JDBC 中用于执行预编译 SQL 语句的核心接口,相比 Statement 更安全、高效,下面我会从「核心特性、完整用法、各类操作示例、高级技巧」四个维度详细拆解,内容覆盖新手所需的全部实操要点。
一、 先明确 PreparedStatement 核心基础
1. 什么是 PreparedStatement
PreparedStatement 是 java.sql 包下的接口,继承自 Statement,专门用于执行「带占位符(?)的预编译 SQL 语句」,是 JDBC 操作数据库的首选工具。
2. 核心优势(为什么优先用它)
- 防止 SQL 注入:参数与 SQL 骨架分离,自动转义特殊字符(如
'、--),这是最核心的优势。 - 执行效率更高:相同 SQL 语句只需预编译一次,后续执行仅需传递参数,避免重复编译 SQL(适合批量、高频执行相同逻辑的 SQL)。
- 代码更简洁:无需手动拼接 SQL 字符串,避免拼接错误(如引号遗漏、类型转换失误)。
- 支持批量操作:提供专门的批量执行 API,大幅提升批量插入 / 更新的效率。
3. 核心使用流程(通用骨架)
无论执行哪种数据库操作,PreparedStatement 的使用流程都固定为 5 步:
- 获取数据库连接(
Connection)。 - 编写预编译 SQL 语句(用
?作为参数占位符)。 - 创建
PreparedStatement对象(通过Connection.prepareStatement(sql))。 - 填充占位符参数(通过
setXxx()系列方法)。 - 执行 SQL 语句(根据操作类型选择
executeUpdate()/executeQuery()/execute())。 - 处理执行结果(增删改处理受影响行数,查询处理
ResultSet结果集)。 - 关闭资源(逆序关闭:
ResultSet→PreparedStatement→Connection)。
二、 核心 API 详解(必备基础)
1. 创建 PreparedStatement 对象
通过 Connection 的 prepareStatement() 方法创建,常用 2 个重载方法:
java
// 方法1:基础版,用于执行普通增删改查
PreparedStatement prepareStatement(String sql) throws SQLException;
// 方法2:支持自动生成主键(如插入数据后获取自增 ID),参数 Statement.RETURN_GENERATED_KEYS 表示需要返回生成的主键
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException;
示例:
java
// 普通创建
String sql = "INSERT INTO user(username, age) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 创建并要求返回自增主键
PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
2. 填充占位符:setXxx() 系列方法
用于为 SQL 中的 ? 占位符赋值,Xxx 对应 Java 数据类型(与数据库字段类型匹配),核心特点:
- 占位符 索引从 1 开始(不是 0,这是新手最容易踩坑的点)。
- 提供通用方法
setObject(int parameterIndex, Object x),支持所有数据类型,无需手动匹配setInt()/setString(),推荐通用封装时使用。
常用 setXxx() 方法列表(对应常见数据类型)
| Java 数据类型 | 数据库字段类型 | PreparedStatement 方法 |
|---|---|---|
int/Integer |
INT/TINYINT/SMALLINT |
setInt(int index, int value) |
long/Long |
BIGINT |
setLong(int index, long value) |
String |
VARCHAR/CHAR/TEXT |
setString(int |







