关于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的上述特性。