码迷,mamicode.com
首页 > 数据库 > 详细

JDBC——PreparedStatement执行SQL的对象

时间:2020-02-28 13:40:28      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:没有   子类   预编译   oid   connect   red   获取   步骤   cep   

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;
    }
}

技术图片

 

JDBC——PreparedStatement执行SQL的对象

标签:没有   子类   预编译   oid   connect   red   获取   步骤   cep   

原文地址:https://www.cnblogs.com/rijiyuelei/p/12376793.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!