PreparedStatement vs Statement

来源:互联网 发布:餐饮软件破解版 编辑:程序博客网 时间:2024/06/04 18:23

 SQL 注入攻击:
SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令,从而利用系统的 SQL 引擎完成恶意行为的做法
对于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement 取代 Statement 就可以了

PreparedStatement可以通过调用 Connection 对象的 preparedStatement() 方法获取PreparedStatement 对象PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的

setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值

PreparedStatement vs Statement:
代码的可读性和可维护性. PreparedStatement 能最大可能提高性能:DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.(语法检查,语义检查,翻译成二进制命令,缓存)
PreparedStatement 可以防止 SQL 注入 .这个我们就不列出程序了,就说说用什么语句可以对SQL 进行注入吧 !
       复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1  这样的句子在Statement下是很不安全的!而在preparedStatement下是很安全的!外面读不到用户名密码只类的数据的!

      下面是关于2者在ORCALE下测试的速度的:

package cn.itcast.jdbc.preparedStatement;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

public class TestPreparedStatement {

 public static void main(String[] args) throws ClassNotFoundException, SQLException {
  // TODO Auto-generated method stub
  String user = "system";
  String password = "itcast";
  String driver = "oracle.jdbc.driver.OracleDriver";
  String url = "jdbc:oracle:thin:@192.168.1.10:1521:orcl";
  
  Class.forName(driver);
  Connection conn = DriverManager.getConnection(url, user, password);
  
  System.out.println(conn);
  
  
  
  //2. PreparedStatement
  
  PreparedStatement ps = null;
  String sql = "INSERT INTO customer(name, password) VALUES(?, ?)";
  ps = conn.prepareStatement(sql);
  
  long startTime = System.currentTimeMillis();
  for(int i = 0; i < 10020; i++){
   ps.setString(1, "name_" + i);
   ps.setString(2, "password_" + i);
   
   //"积攒"
   ps.addBatch();
   
   if((i + 1) % 200 == 0 || i == 10020 - 1){
    //执行
    ps.executeBatch();
    //清空
    ps.clearBatch();
   }
  }
  long endTime = System.currentTimeMillis();
  
  
  System.out.println("time: " + (endTime - startTime)); //7922   ---  218
  
 }

}

很明显PreparedStatement比Statement速度要快很多,但是有个问题,在MYSQL中并不能体现出两者的差别,这样子我们可以作出一种合理的解释,ORACLE比MYSQL的性能要好,或许是好很多的吧 !

原创粉丝点击