1、PreparedStatement的定义
PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。如下:
Connection conn = DBConnection.getConnection(); //获得连接对象
String findByIDSQL = "select * from " +
"tb_employee where employeeID = ?"; //SQL语句
PreparedStatement pstmt = null; //声明预处理对象
ResultSet rs = null;
Employee employee = null;
try {
pstmt = conn.prepareStatement(findByIDSQL); //获得预处理对象并赋值
pstmt.setInt(1, employeeID); //设置参数
rs = pstmt.executeQuery(); //执行查询
…………
…………
2、预处理的优势
- PreparedStatement可以写动态参数化的查询
用PreparedStatement你可以写带参数的sql查询语句,通过使用相同的sql语句和不同的参数值来做查询比创建一个不同的查询语句要好,下面是一个参数化查询:
1
SELECT interest_rate FROM loan WHERE loan_type=?现在你可以使用任何一种loan类型如:”personal loan”,”home loan” 或者”gold loan”来查询,这个例子叫做参数化查询,因为它可以用不同的参数调用它,这里的”?”就是参数的占位符。
- PreparedStatement比 Statement 更快
使用 PreparedStatement 最重要的一点好处是它拥有更佳的性能优势,SQL语句会预编译在数据库系统中。执行计划同样会被缓存起来,它允许数据库做参数化查询。使用预处理语句比普通的查询更快,因为它做的工作更少(数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了)。为了减少数据库的负载,生产环境中德JDBC代码你应该总是使用PreparedStatement 。值得注意的一点是:为了获得性能上的优势,应该使用参数化sql查询而不是字符串追加的方式。
总结:这个功能一大优势就是能提高执行速度尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入。
例如学生表里有"学号"和"姓名"两个字段,(学号是是number(9),姓名是varchar2(20).Oracle数据库)
sql="insert into student values(?,?)";
PreparedStatement ps=conn.prepareStatement(sql); //conn是Connection
ps.setInt(1,202060510); //"1"对应第一个"?","2"对应第二个"?"
ps.setString(2,"fannge");
ps.executeUpdate();