预处理 PreparedStatement和JDBC API

本文详细介绍了JDBC中PreparedStatement的使用方法,包括参数设置、预处理查询与DML操作,以及其在防止SQL注入和提高效率方面的优势。通过实例演示了如何利用PreparedStatement进行管理员登录验证和数据操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次博客带领大家学习JDBC中的预处理 PreparedStatement 的查询和DML的使用和JDBC API。

预处理 PreparedStatement的基本介绍

  1. PreparedStatement 对象执行的SQL语句中的参数用问号(?)来表示,调用PreparedStatement 对象的 setXXX()方法来设置这些参数,setXXX()方法有两个参数,第一个参数是要设置的SQL语句中的参数的索引(从1开始),第二个是设置的SQL语句中的参数的值。
  2. 调用 executeQuery(),返回 ResultSet对象。
  3. 调用 executeUpdate(),执行更新,包括增、删、修改。

预处理 PreparedStatement的好处

  1. 不再使用 + 拼接sql语句,减少语法错误。
  2. 有效的解决了sql注入问题!
  3. 大大减少了编译次数,效率较高。

预处理查询操作

  • 预处理查询可以有效的解决了sql注入问题。
 public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入管理员的名字:");
        String admin_name =scanner.nextLine();
        System.out.println("请输入管理员的密码");
        String admin_pwd=scanner.nextLine();
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properites"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        Class.forName(driver);
        Connection connection = DriverManager.getConnection(url, user, password);

        // 得到PrepareStatement
        //组织SQL,sql 语句的? 就相当于占位符
        String sql = "select name,pwd from admin where name =? and pwd =?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        // 给?赋值
        preparedStatement.setString(1,admin_name);
        preparedStatement.setString(2,admin_pwd);

        ResultSet resultSet = preparedStatement.executeQuery();
        if(resultSet.next()){
            System.out.println("恭喜登录成功!");
        }else{
            System.out.println("对不起,登陆失败");
        }
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }

预处理的DML操作

public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入添加的名字");
        String admin_name =scanner.nextLine();
        System.out.println("请输入添加的密码");
        String admin_pwd=scanner.nextLine();
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properites"));
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        Class.forName(driver);
        Connection connection = DriverManager.getConnection(url, user, password);

        // 得到PrepareStatement
        //组织SQL,sql 语句的? 就相当于占位符
        //添加记录
        String sql = "insert into admin VALUES(?,?)";
        //修改记录
        String sql = "UPDATE admin set pwd=? where name=?";
        //删除记录
        String sql = "DELETE from admin where name = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        // 给?赋值
        preparedStatement.setString(1,admin_name);

        int row = preparedStatement.executeUpdate();
        if(row > 0){
            System.out.println("修改成功!");
        }else{
            System.out.println("修改失败!");
        }
        preparedStatement.close();
        connection.close();
    }

JDBC API

请添加图片描述

JDBCJava Database Connectivity)是一种用于存取数据库的标准API,它允许Java应用程序与各种类型的数据库交互。非预处理语句是指在SQL查询中直接拼接字符串形式的数据,这种方式存在安全性问题,因为如果数据来自用户输入,可能会导致SQL注入攻击。 插入操作在非预处理模式下通常是这样的: ```java Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password"); String sql = "INSERT INTO table_name (column1, column2) VALUES (?, ?)"; PreparedStatement statement = null; try { statement = conn.prepareStatement(sql); statement.setString(1, userInput1); statement.setInt(2, userInput2); // 假设这里输入的是整数 int rowsInserted = statement.executeUpdate(); if (rowsInserted > 0) { System.out.println("Data inserted successfully."); } else { System.out.println("Failed to insert data."); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (statement != null) statement.close(); if (conn != null) conn.close(); } catch (SQLException ex) { ex.printStackTrace(); } } ``` 在这个例子中,我们没有使用`?`占位符,而是直接将值插入到SQL字符串中,这降低了程序的安全性维护性。相比之下,使用预处理语句更为推荐: ```java // 使用预处理语句 String sql = "INSERT INTO table_name (column1, column2) VALUES (?, ?)"; PreparedStatement preparedStatement = conn.prepareStatement(sql); preparedStatement.setString(1, userInput1); preparedStatement.setInt(2, userInput2); int rowsInserted = preparedStatement.executeUpdate(); ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值