本章记录PreparedStatement屏蔽SQL注入问题和PreparedStatement的效率问题!
0,SQL注入问题
1,PreparedStatement效率问题
0,SQL注入问题
使用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"); } }
结果
1,PreparedStatement效率
向User表里插入10000条数据
(了解)使用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(一)–认识JDBC
IT江湖iOS 客户端正式上线。你想要看IT资讯,精彩趣文,你想要分享,下载IT江湖iOS客户端。 IT江湖,每一个IT人的江湖。点击链接下载:
欢迎来到IT江湖,加入我们官方群 383126909,学习更多,共同发展.
关注“IT江湖”微信公众号,每日推送优质文章,丰富大家的知识.
微信扫一扫或者搜索 “itjh0223” IT江湖,每一个IT人的江湖!