• JavaEE学习中,PreparedStatement 的简单使用 和 介绍(java 学习中的小记录)


    JavaEE学习中,PreparedStatement的简单使用和介绍(java 学习中的小记录)作者:王可利(Star·星星)

    PreparedStatement

    它是 Statement 的子类,分支。PreparedStatement 继承于 Statement

    数据库情况如图:

    帐号:liubei

    密码:123

    先看代码演示问题所在:

     1 package TwoDay;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.ResultSet;
     6 import java.sql.Statement;
     7 import java.util.Scanner;
     8 
     9 public class StarOne {
    10     public static void main(String[] args){
    11         Connection conn = null;
    12         Statement stmt = null;
    13         ResultSet rs  = null;
    14         
    15         //根据控制台提示输入用户名和密码
    16         Scanner input = new Scanner(System.in);
    17         
    18         System.out.println("	宠物主人登录");
    19         System.out.println("请输入用户名:");
    20         String name =input.next();
    21         System.out.println("请输入密码:");
    22         String password =input.next();
    23         
    24         try {
    25             Class.forName("com.mysql.jdbc.Driver");
    26             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/starstudy", "root", "123456");
    27             stmt = conn.createStatement();
    28             String sql = "SELECT *FROM `master` WHERE `name`= '"+name+"' AND `password`='"+password+"'";//加入参数的时候是:'"+变量+"'
    29             System.out.println(sql);
    30             //发现问题,把输入的密码注入到这个 sql语句里面去了,如:我输入的密码是:123'or'1'='1'   
    31             //sql的语句就变成  :   SELECT *FROM `master` WHERE `name`= 'liubei' AND `password`='123'or'1'='1'
    32             //这种现象我们都叫做 使用Statment安全性差,存在SQL注入隐患(原因他用的是拼装的语句)
    33             
    34             rs = stmt.executeQuery(sql);
    35             if (rs.next()) {
    36                 System.out.println("登陆成功!");
    37             }else{
    38                 System.out.println("登录失败!");
    39             }
    40             
    41         } catch (Exception e) {
    42             // TODO: handle exception
    43         }finally{
    44             try {
    45                 if (null!=rs) {
    46                     rs.close();
    47                 }
    48                 if (null!=stmt) {
    49                     stmt.close();
    50                 }
    51                 if (null!=conn) {
    52                     conn.close();
    53                 }
    54             } catch (Exception e2) {
    55                 // TODO: handle exception
    56             }
    57         }
    58     }
    59 }

     

    出错总结:

    如:当我输入的密码是:123'or'1'='1'   ,它把输入的密码注入到这个 sql语句里面去了

    于是  SQL的语句就变成  :   SELECT *FROM `master` WHERE `name`= 'liubei' AND `password`='123'or'1'='1'

    程序运行成功,'1'='1' 是默认一定成立的。

    这种现象我们都叫做 使用 Statment 安全性差,存在SQL注入隐患(原因它用的是拼装的语句)

    于是就有了 PreparedStatement 用来解决这个问题:

    PreparedStatement 的使用步骤实例:

    代码的使用如下:

     1 package TwoDay;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 
     7 public class StarTwo {
     8     public static void main(String[] args){
     9         Connection conn = null;
    10         PreparedStatement pstmt= null;
    11         
    12         String sql = "UPDATE pet SET health=?,love=? WHERE id=?";//不知道的都给他占位符 问号?
    13         
    14         try {
    15             Class.forName("com.mysql.jdbc.Driver");
    16             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/starstudy", "root", "123456");
    17             pstmt = conn.prepareStatement(sql);//执行SQL语句,预编译
    18             
    19             pstmt.setInt(1,1234); //这里第几个问号 就是 第几个索引(第一个参数)
    20             pstmt.setInt(2, 88);
    21             pstmt.setInt(3, 2);
    22             
    23             pstmt.executeUpdate();//修改的方法
    24             
    25         } catch (Exception e) {
    26             
    27         }finally{
    28             try {
    29                 if (null!=pstmt) {
    30                     pstmt.close();
    31                 }
    32                 if (null!=conn) {
    33                     conn.close();
    34                 }
    35             } catch (Exception e2) {                
    36             }
    37         }
    38     }
    39 }
  • 相关阅读:
    *ecshop 首页促销价显示倒计时
    *ecshop 限制文章帮助文章显示条数
    maven编码 gbk 的不可映射字符
    Java通过httpclient获取cookie模拟登录
    分布式系统session一致性问题
    分布式Session的几种实现方式
    httpclient 登录成功后返回的cookie值访问下一页面
    HttpClient使用GET方式通过代理服务器读取页面的例子
    HTTP请求如何带参
    JAVA的array中indexOf
  • 原文地址:https://www.cnblogs.com/StarKL/p/6178764.html
Copyright © 2020-2023  润新知