“整理自网络”
用PreparedStatement替换Statement的作用主要是为了防止数据库注入式攻击(直接使用String作为sql的参数导致的潜在危险)。原理是用占位符作为实参定义sql语句,如:
String sql="select * from tuser where usernmae=? and password=?";
PreparedStatement pstm=conn.preparedStatement(sql);pstm.setString(1,name);pstm.setString(2,pwd);Result rs=psm.executeQuery();
《Statement和PreparedStatement之间的区别》:
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程。
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理。
4.普通的Statement对象代码段:
String updateString = "UPDATE COFFEES SET SALES = 75 "
+ "WHERE COF_NAME LIKE ′Colombian′";
stmt.executeUpdate(updateString);
使用PreparedStatement代码段:
PreparedStatement updateSales =con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75);updateSales.setString(2, "Colombian");
updateSales.executeUpdate();
PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。
这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。
最后贴一个PreparedStatement的完整的例子:
package jstarproject;
import java.sql.*;
public class mypreparedstatement {private final string db_driver="com.microsoft.jdbc.sqlserver.sqlserverdriver";private final string url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs";public mypreparedstatement()
{}public void query() throws sqlexception{connection conn = this.getconnection();
string strsql = "select emp_id from employee where emp_id = ?";
preparedstatement pstmt = conn.preparestatement(strsql);pstmt.setstring(1,"pma42628m");
resultset rs = pstmt.executequery();while(rs.next()){
string fname = rs.getstring("emp_id");
system.out.println("the fname is " + fname);
}rs.close();pstmt.close();conn.close();}private connection getconnection() throws sqlexception{// class.
connection conn = null;
try {
class.forname(db_driver);
conn = drivermanager.getconnection(url,"sa","sa");}catch (classnotfoundexception ex) {}
return conn;
}//main
public static void main(string[] args) throws sqlexception {mypreparedstatement jdbctest1 = new mypreparedstatement();
jdbctest1.query();}}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程