转载

通明讲JDBC(二)-SQL注入与PreparedStatement效率问题

本章记录PreparedStatement屏蔽SQL注入问题和PreparedStatement的效率问题!

0,SQL注入问题

1,PreparedStatement效率问题

0,SQL注入问题

通明讲JDBC(二)-SQL注入与PreparedStatement效率问题

使用PreparedStatement和Statement分别查询User数据,使用PreparedStatement可以避免使用Statement时的SQL注入问题

采用对特殊字符做判断方式很难彻底解决SQL注入问题

参考以下代码:

package jdbc;  import java.sql.*;  public class JdbcPrepareTest2 {   /**   * 使用Statement读user   */  public void readUsers(String name){   Connection connection = null;   Statement statement = null;   ResultSet resultSet = null;   try {    connection = JdbcUtils.getConnection();    statement = connection.createStatement();    resultSet = statement.executeQuery("select id,name,password from user where name = "+name+"");    while(resultSet.next()){     System.out.println(resultSet.getString("id")+"---->"+resultSet.getString("name")+"--->"+resultSet.getString("password"));    }   } catch (SQLException e) {    e.printStackTrace();   }finally {    JdbcUtils.close(resultSet,statement,connection);   }  }   /**   * 根据name读user:   * 使用PreparedStatement,可以为查询指定条件,完成一些预处理的工作   * 重要:使用PreparedStatement可以避免SQL注入的问题   */  public void readUsersByPre(String name){   Connection connection = null;   PreparedStatement pst = null;   ResultSet resultSet = null;   try {    connection = JdbcUtils.getConnection();    pst = connection.prepareStatement("select id,name,password from user where name = ? ");    pst.setString(1,name);    resultSet = pst.executeQuery();    while(resultSet.next()){     System.out.println(resultSet.getString("id")+"---->"+resultSet.getString("name")+"--->"+resultSet.getString("password"));    }   } catch (SQLException e) {    e.printStackTrace();   }finally {    JdbcUtils.close(resultSet,pst,connection);   }  }   public static void main(String[] args){   System.out.println("---------------Statement---------------");   new JdbcPrepareTest2().readUsers("'name1'");   System.out.println("---------------Statement---------------");   new JdbcPrepareTest2().readUsers("'name1' or 1=1");   System.out.println("---------------PreparedStatement---------------");   new JdbcPrepareTest2().readUsersByPre("name1");   System.out.println("---------------PreparedStatement---------------");   new JdbcPrepareTest2().readUsersByPre("name1 or 1=1");  }  }

结果

通明讲JDBC(二)-SQL注入与PreparedStatement效率问题

1,PreparedStatement效率

向User表里插入10000条数据

通明讲JDBC(二)-SQL注入与PreparedStatement效率问题

(了解)使用PreparedStatement总体上效率比Statement高, 但是受到驱动和数据库的影响,数据量少,执行次数少的情况下有可能效率低

测试代码如下

package jdbc;  import java.sql.*;  public class JdbcPrepareTest {   /**   * 读user   */  public void readUsers(){   Connection connection = null;   Statement statement = null;   ResultSet resultSet = null;   try {    connection = JdbcUtils.getConnection();    Long start = System.currentTimeMillis();    statement = connection.createStatement();    resultSet = statement.executeQuery("select id,name,password from user where name != '1' ");    Long end = System.currentTimeMillis();    System.out.println("Statement:"+(end-start));   } catch (SQLException e) {    e.printStackTrace();   }finally {    JdbcUtils.close(resultSet,statement,connection);   }  }   /**   * 根据Id读user   * 次要:使用PreparedStatement总体上效率比Statement高,但是受到驱动和数据库的影响,数据量少,执行次数少的情况下有可能效率低   */  public void readUsers(String id){   Connection connection = null;   PreparedStatement pst = null;   ResultSet resultSet = null;   try {    connection = JdbcUtils.getConnection();    /**     * 在查询之前完成预处理的工作     */    Long start = System.currentTimeMillis();    pst = connection.prepareStatement("select id,name,password from user where name != ?");    pst.setString(1,id);    resultSet = pst.executeQuery();    Long end = System.currentTimeMillis();    System.out.println("PreparedStatement:"+(end-start));   } catch (SQLException e) {    e.printStackTrace();   }finally {    JdbcUtils.close(resultSet,pst,connection);   }  }   public static void main(String[] args){   new JdbcPrepareTest().readUsers();   new JdbcPrepareTest().readUsers("1");  } }

结果

通明讲JDBC(二)-SQL注入与PreparedStatement效率问题

未完待续

通明讲JDBC(一)–认识JDBC 

IT江湖iOS 客户端正式上线。你想要看IT资讯,精彩趣文,你想要分享,下载IT江湖iOS客户端。

IT江湖,每一个IT人的江湖。点击链接下载:

http://url.cn/Ub94qF  

欢迎来到IT江湖,加入我们官方群 383126909,学习更多,共同发展.

关注“IT江湖”微信公众号,每日推送优质文章,丰富大家的知识.

微信扫一扫或者搜索 “itjh0223”   IT江湖,每一个IT人的江湖!

通明讲JDBC(二)-SQL注入与PreparedStatement效率问题

正文到此结束
Loading...