PreparedStatement:执行sql的对象

PreparedStatement:执行sql的对象

​ 1.SQL注入问题:在拼接sql时,在一些sql的关键字参与字符串的拼接。会造成安全性问题

  • ​ 1)输入用户随便,输入密码: a’ or ‘a’ = 'a;
  • ​ 2)sql:select * from user where username =
    ‘fghsasdfd’ and passwprd = a’ or ‘a’ = 'a;

在这里插入图片描述

​ 2.解决sql注入问题:使用PrepareStatement对象来解释

​ 3.预编译的sql:参数使用?作为占位符

​ 4.步骤:

  • ​(1)导入驱动包mysql-connection-java-5.1.37-bin.jar
  • ​(2)注册驱动
  • (3)获取数据库连接对象Connection
  • ​(4)定义sql
    *注意:sql的参数使用占位符:select * from user where username = ? and passwprd = ?;
  • ​(5)获取执行sql语句的对象PrepareStatement
  • (6)给?去赋值
    方法:setXxx(参数1,参数2)
    参数1:?的位置编号从1开始
    参数2:?的值
  • (7)执行sql,接收返回结果,不需要传递sql语句
  • ​(8)处理结果
  • ​(9)释放资源

​ 5.后期都会使用PreparedStatement来完成增删改查的所有操作

  • (1)可以防止SQL注入
  • ​(2)效率更高
package cn.laowang.jdbc;

import cn.laowang.util.JDBCUtils;

import java.sql.*;
import java.util.Scanner;

/**
 *需求:
 * ​  1.通过键盘录入用户名和密码
 *    2.判断用户是否登录成功
 */
public class JDBCDemo10 {

    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.调用方法
        boolean flag = new JDBCDemo10().login2(username, password);
        //3.判断结果,输出不同语句
        if (flag){
            System.out.println("登录成功!");
        }else {
            System.out.println("用户名或密码错误!");
        }
    }
    /**
     * 登录方法,使用PreparedStatement实现
     * @param username
     * @param password
     * @return
     */
    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);
            //4.给?赋值
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            //4.执行查询
            rs = pstmt.executeQuery();
            //5.判断
            return  rs.next();  // 如果有下一行,返回true
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs,pstmt,conn); //关闭资源
        }
        return false;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中的 PreparedStatement 可以用来执行 SQL 查询和更新操作。相比于 Statement,使用 PreparedStatement 可以提高 SQL 执行的效率和安全性。以下是通过 PreparedStatement 执行 SQL 的基本步骤: 1. 建立数据库连接 首先需要建立与数据库的连接,可以使用以下代码: ```java import java.sql.*; public class MySQLConnection { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "mypassword"; Connection conn = null; try { conn = DriverManager.getConnection(url, user, password); System.out.println("Connected to the database"); } catch (SQLException e) { System.out.println(e.getMessage()); } finally { try { if (conn != null) { conn.close(); System.out.println("Disconnected from the database"); } } catch (SQLException e) { System.out.println(e.getMessage()); } } } } ``` 在建立连接时,需要使用 DriverManager 类的 getConnection() 方法。 2. 创建 PreparedStatement 对象 在建立数据库连接之后,可以通过 Connection 对象创建 PreparedStatement 对象。PreparedStatement 对象可以通过 SQL 语句创建,例如: ```java PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM mytable WHERE id = ?"); ``` 在上述代码中,使用了带有占位符的 SQL 语句创建 PreparedStatement 对象。占位符用于动态设置 SQL 查询语句中的参数。 3. 设置参数值 在创建 PreparedStatement 对象之后,需要为占位符设置参数值。可以使用以下方法为参数设置值: ```java pstmt.setInt(1, 1); // 设置第一个占位符的值为 1 pstmt.setString(2, "hello"); // 设置第二个占位符的值为 "hello" ``` 在上述代码中,使用了 setInt() 和 setString() 方法分别设置占位符的值。需要注意的是,参数的索引从 1 开始。 4. 执行 SQL 查询语句 在设置完参数值后,可以使用 PreparedStatement 对象执行 SQL 查询语句,例如: ```java ResultSet rs = pstmt.executeQuery(); while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } ``` 在上述代码中,使用 executeQuery() 方法执行 SQL 查询语句,并使用 ResultSet 对象获取查询结果。通过 ResultSet 对象可以获取查询结果中的数据。 5. 执行 SQL 更新语句 另外,PreparedStatement 也可以用来执行 SQL 更新操作,例如: ```java PreparedStatement pstmt = conn.prepareStatement("UPDATE mytable SET name = ? WHERE id = ?"); pstmt.setString(1, "world"); pstmt.setInt(2, 1); int rowsAffected = pstmt.executeUpdate(); System.out.println(rowsAffected + " rows affected"); ``` 在上述代码中,使用 executeUpdate() 方法执行 SQL 更新语句,并使用返回值获取更新操作受影响的行数。 以上就是通过 PreparedStatement 执行 SQL 的基本步骤。需要注意的是,在使用 PreparedStatement 时,应该尽量避免使用拼接 SQL 语句的方式,而应该使用带有占位符的 SQL 语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值