• JDBC——PreparedStatement执行SQL的对象


    Statement的子接口,预编译SQL,动态SQL

    功能比爹强大

    用来解决SQL注入的

    预编译SQL:参数使用?作为占位符,执行SQL的时候给?赋上值就可以了

    使用步骤:

    1.导入驱动jar包
      复制jar包,粘贴到libs文件夹下。文件名可以任意,一般就叫libs
      选择复制的jar包,右键,点击Add As Library
    2.注册驱动
    3.获取数据库的连接对象 Connection(本地的java代码和数据库的桥梁对象)
    4.定义SQL语句
      ①参数使用?作为占位符。例如:select * from user where username=? and password = ?;
    5.获取执行SQL语句的对象 PreparedStatement Connection.prepareStatement(String sql)
    6.给?赋值

    7.执行SQL,接收返回结果,不需要传递SQL语句了(传递SQL语句时它父类Statement的方法,这个是子类特有的)
    8.处理结果
    9.释放资源

     不使用Statement 

    prepareStatement(String sql)
    创建参数化的SQL语句发送到数据库的 PreparedStatement对象。


    SQL注入

    SQL注入:通过操作输入来修改SQL语句
    在上个练习中,会产生SQL注入问题

    ①用户名随便输

    ②密码输入

      

    例如:

     

    表中就没有那个用户名和密码

    查看SQL语句执行效果:

    (利用输入的bug,把输入的密码,转换为一个判断)
    会把所有的用户名密码查询出来

     

     解决上次练习的SQL注入

    package cn.itcast.jdbc;
    
    import cn.itcast.util.JDBCUtils;
    
    import java.sql.*;
    import java.util.Scanner;
    
    public class JdbcDemo11 {
    
        public static void main(String[] args) {
            //1.键盘录入,接收用户名和密码
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名");
            String username = sc.nextLine();
            System.out.println("请输入密码");
            String password = sc.nextLine();
    
            //2.调用方法login,因为不是静态方法,所以要创建对象
            boolean flag = new JdbcDemo11().login2(username, password);
    
            //3.判断结果,输出同语句
            if (flag){
                System.out.println("登录成功");
            }else {
                System.out.println("登录失败,用户名或密码错误");
            }
        }
    
        /**
         * 登录方法,PreparedStatement实现
         */
        public boolean login2(String username, String password) {
            if (username == null || password == null) {//如果有一个为空就不用去连接数据库,做操作
                return false;
            }
            //连接数据库是否判断成功
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            try {
                //1.获取数据库连接
                conn = JDBCUtils.getConnection();
                //2.定义SQL
                String sql = "select * from user where username= ? and password = ?;";
                //3.获取执行SQL的对象
                pstmt = conn.prepareStatement(sql);
                //给?赋值
                pstmt.setString(1,username);
                pstmt.setString(2,password);
    
                //4.执行查询,不需要传参数
                rs = pstmt.executeQuery();
                //5.判断
               /* if (rs.next()){//不用这样写rs.next()返回的就是true,false
                    return true;
                }else {
                    return false;
                }*/
                return rs.next();//如果有下一行返回true
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {//释放资源
                JDBCUtils.close(rs, pstmt, conn);
            }
    
            return false;
        }
    }

  • 相关阅读:
    什么是RESTFUL?REST的请求方法有哪些,有什么区别?
    post提交的数据有哪几种编码格式?能否通过URL参数获取用户账户密码
    什么是jsp?jsp的内置对象有哪些?
    Session和Cookie的区别
    全面系统讲解CSS工作应用+面试一步搞定
    CSS实例:翻转图片、滚动图片栏、打开大门
    【HTML5版】导出Table数据并保存为Excel
    通过HTML5的getUserMedia实现拍照功能
    Day 19: EmberJS 入门指南
    18个基于 HTML5 Canvas 开发的图表库
  • 原文地址:https://www.cnblogs.com/rijiyuelei/p/12376793.html
Copyright © 2020-2023  润新知