关于PreparedStatement原理的理解

详细介绍:https://www.zybuluo.com/stefanlu/note/254899

参考链接:http://www.xuebuyuan.com/2021136.html

代码:

 1 public class Main {
 2     public static void main(String[] args){
 3         Connection connection = null;
 4         PreparedStatement preparedStatement = null;
 5         ResultSet resultSet = null;
 6         try {
 7             Class.forName("com.mysql.jdbc.Driver");
 8             connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user", "xxx", "xxx");
 9             String sql = "SELECT ROUND(member_price,10) as member_price  from member_price WHERE `month` = '2015-11' and data_type = ?";
10             preparedStatement = connection.prepareStatement(sql);
11             preparedStatement.setInt(1, 1);
12             resultSet = preparedStatement.executeQuery();
13             while(resultSet.next()){
14                 System.out.println("string: " + resultSet.getString("member_price"));  //通过String类型获取
15                 System.out.println("float: " + resultSet.getFloat("member_price"));    //通过Long类型获取
16                 System.out.println("============>next");
17             }
18         }catch (Exception e){
19             e.printStackTrace();
20         }finally {
21             try {
22                 if(resultSet != null){
23                     resultSet.close();
24                 }
25                 if(preparedStatement != null){
26                     preparedStatement.close();
27                 }
28                 if(connection != null){
29                     connection.close();
30                 }
31             } catch (SQLException e) {
32                 e.printStackTrace();
33             }
34         }
35 
36     }
37 }

 执行图解:

1. 使用PreparedStatement但不使用预编译


2. 使用PreparedStatement并使用预编译

3. 使用PreparedStatement,使用预编译和缓存

总结:
  java中PreparedStatement的好处:
  1. 代码阅读性更高
  2. 性能更好(mysql Prepared Statements语法),前提是必须声明使用预编译和缓存
  3. 更安全(mysql Prepared Statements语法),会给每个参数都加单引号
  mysql的Prepared Statements语法提供的好处:
  1. 缓存SQL来提高性能
  2. 参数化防止SQL注入

 mysql中执行sql语句:

select * from user where id = '1 or 1=1';

如果id字段是int,bigint或数字类型,则mysql会将上述查询语句翻译为: select * from user where id = 1 并给出一个warning

如果id字段是char或varchar类型,则mysql会将'1 or 1=1'来进行匹配,查看id有没有等于'1 or 1=1'的。

 

PreparedStatement防SQL注入的原理就是解析参数的每个字符,遇到特殊字符('或“就转义),并在参数的最前边和最后变分别添加一个单引号,利用的也是MySQL的上述特性。

 

posted @ 2015-12-28 16:27  桦沐  阅读(3802)  评论(0编辑  收藏  举报