首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Statement和PreparedStatement之间的区别

Statement和PreparedStatement之间的区别

原创
作者头像
Eulogy
发布2025-07-29 14:38:30
发布2025-07-29 14:38:30
2390
举报
文章被收录于专栏:笔记本笔记本

Statement和PreparedStatement之间的区别

相同点: Statement和PreparedStatement都是JDBC执行SQL语句的接口。JDBC注册好驱动,建立了连接之后,就可以使用连接获取Statement或者PreparedStatement对象,然后使用该对象设置具体的sql语句,然后执行sql语句。

区别: Statement不可以预编译,是直接拼接的SQL字符串,意思就是在定义Statement的时候就得把sql语句写好,然后一次性地交给mysql进行编译执行。实现起来简单,而且因为没有预编译的原因,对于临时性的,执行次数少的语句性能很高。

PreparedStatement会执行一次预编译,sql语句中有?占位符,会先把带有占位符的sql语句编译好,之后用具体的值填充占位符然后直接执行。这种方式可以避免sql注入,更加安全,对于频繁执行的sql语句性能更高,因为一个sql语句只需要编译一次。

Statement示例

代码语言:java
复制
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();

String username = "admin";  // 假设是用户输入
String password = "123456";

String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
ResultSet rs = stmt.executeQuery(sql);

问题: SQL 语句是拼接出来的,容易受到 SQL 注入攻击。

效率: 每次执行都要重新编译 SQL。

PreparedStatement示例

代码语言:sql
复制
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);

ps.setString(1, "admin");      // 第一个占位符 ?
ps.setString(2, "123456");     // 第二个占位符 ?

ResultSet rs = ps.executeQuery();

优势:

  • 参数使用 ? 占位符自动绑定,防止 SQL 注入
  • 可预编译 SQL,适合重复执行,效率更高
  • 代码更清晰,维护方便

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Statement和PreparedStatement之间的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档