
相同点: Statement和PreparedStatement都是JDBC执行SQL语句的接口。JDBC注册好驱动,建立了连接之后,就可以使用连接获取Statement或者PreparedStatement对象,然后使用该对象设置具体的sql语句,然后执行sql语句。
区别: Statement不可以预编译,是直接拼接的SQL字符串,意思就是在定义Statement的时候就得把sql语句写好,然后一次性地交给mysql进行编译执行。实现起来简单,而且因为没有预编译的原因,对于临时性的,执行次数少的语句性能很高。
PreparedStatement会执行一次预编译,sql语句中有?占位符,会先把带有占位符的sql语句编译好,之后用具体的值填充占位符然后直接执行。这种方式可以避免sql注入,更加安全,对于频繁执行的sql语句性能更高,因为一个sql语句只需要编译一次。
Statement示例
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示例
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 注入原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。