首页 > 其他分享 >JDBC:Statement和PreparedStatement的区别分析

JDBC:Statement和PreparedStatement的区别分析

时间:2024-10-20 11:16:54浏览次数:16  
标签:语句 JDBC String SQL PreparedStatement Statement sql import password

Statement

Statement 用于执行静态的 SQL 查询,通常在 SQL 语句不会频繁变化的情况下使用。

特点

  1. 不支持参数化查询:SQL 语句直接嵌入在代码中,在语句中添加参数较为麻烦。
  2. 存在 SQL 注入风险:由于直接拼接字符串,容易受到 SQL 注入攻击。
  3. 性能较低:每次执行 SQL 语句时,数据库都需要重新编译和优化语句。也就是说Statement适合只执行一次的SQL语句

示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class StatementExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/your_database";
        String user = "your_username";
        String password = "your_password";

        String userNameInput = "exampleUser";
        String passwordInput = "examplePass";

        // SQL 语句直接拼接
        String sql = "SELECT * FROM users WHERE username = '" + userNameInput + "' AND password = '" + passwordInput + "'";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement statement = conn.createStatement();
             ResultSet resultSet = statement.executeQuery(sql)) {

            while (resultSet.next()) {
                String username = resultSet.getString("username");
                String userPassword = resultSet.getString("password");
                System.out.println("Username: " + username + ", Password: " + userPassword);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

PreparedStatement

PreparedStatement 用于执行带参数的预编译 SQL 查询,通常在 SQL 语句包含参数时使用。

特点

  1. 支持参数化查询:SQL 语句中的参数使用占位符 ?,参数在执行时动态设置。
  2. 防止 SQL 注入:通过参数化查询有效防止 SQL 注入攻击。
  3. 性能较高:SQL 语句只需编译和优化一次,之后可以重复使用,提高性能,适合需要多次重复执行的SQL语句。

示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class PreparedStatementExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/your_database";
        String user = "your_username";
        String password = "your_password";

        String sql = "SELECT * FROM users WHERE username = ? AND password = ?";

        String userNameInput = "exampleUser";
        String passwordInput = "examplePass";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            // 创建 PreparedStatement 对象
            PreparedStatement preparedStatement = conn.prepareStatement(sql);
            
            // 设置 SQL 参数
            preparedStatement.setString(1, userNameInput);
            preparedStatement.setString(2, passwordInput);

            // 执行查询
            ResultSet resultSet = preparedStatement.executeQuery();

            // 处理查询结果
            while (resultSet.next()) {
                String username = resultSet.getString("username");
                String userPassword = resultSet.getString("password");
                System.out.println("Username: " + username + ", Password: " + userPassword);
            }

            // 关闭 ResultSet 对象
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

主要区别

特性StatementPreparedStatement
使用场景静态 SQL 语句动态 SQL 语句
参数化查询不支持支持
SQL 注入风险低(防止 SQL 注入)
性能每次执行都要编译和优化预编译一次后可重复使用,性能较高
代码复杂度较低略高(需要设置参数)
适用性简单的、一次性的查询复杂的、多参数的、重复执行的查询

总结

  • Statement 适用于简单的一次性查询,但存在 SQL 注入风险,性能较低,且参数化查询编写代码不方便。同时安全性较低,容易受到SQL注入攻击。
  • PreparedStatement 适用于复杂的多次查询,编写参数化查询时较为方便,可以使用占位符来设置参数,同时可以防止SQL注入,安全性较高。

标签:语句,JDBC,String,SQL,PreparedStatement,Statement,sql,import,password
From: https://blog.csdn.net/weixin_73423463/article/details/143086365

相关文章

  • Sharding-JDBC标准模式详解
    Sharding-JDBC标准模式详解一.为什么要使用标准模式?Sharding-JDBC的标准模式就配置而言比inline模式繁琐多了,那为什么要使用标准模式呢Sharding-JDBC作为ApacheShardingSphere生态中的一款轻量级Java框架,提供了数据分片、读写分离、分布式事务和数据库治理等核心功......