“整理自网络”
用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;}//mainpublic static void main(string[] args) throws sqlexception {mypreparedstatement jdbctest1 = new mypreparedstatement();jdbctest1.query();}}
浙公网安备 33010602011771号