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

JDBC:Statement和PreparedStatement的区别分析

时间:2024-10-20 11:16:54浏览次数:10  
标签:语句 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

相关文章

  • 2024/10/19日 日志--》关于MySQL中 JDBC的API 详解的整理简述
    今天进一步学习了JDBC中的API,已经可以初步连接数据库了,接下来继续进行学习。点击查看代码--JDBCAPI详解--DirverManager--DriverManager(驱动管理类)作用:1.注册驱动2.获取数据库连接--1.注册驱动--Class.forName("com.mysql.jdbc.Driver");--·需要注意的是:My......
  • 解决driverClassName: com.mysql.cj.jdbc.Driver报红问题
    为将项目从postgre库转为本地mysql数据库,需要将数据库驱动改为mysql1.在父工程的pom中引入数据库<!--Mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><v......
  • hive执行SQL提示:Error while processing statement:FAILED:Execution Error, return c
    遇到Hive执行SQL时提示Errorwhileprocessingstatement:FAILED:ExecutionError,returncode1fromorg.apache.hadoop.hive.ql.exec.tez.TezTask的错误,通常意味着在执行Tez任务时出现了问题。这个错误可能由多种原因引起,包括但不限于配置问题、资源限制、数据问......
  • java_day17_JDBC、登录注册修改案例
    一、JDBCJDBC编写六步走:1、注册驱动,告诉java程序我们要链接什么数据库【mysql为案例】5.1.x驱动包中的驱动类路径:【com.mysql.jdbc.Driver】8.x.x驱动包中的驱动类路径:【com.mysql.cj.jdbc.Driver】2、创建与数据库的链接对象......
  • Tomcat10JdbcPoolDemo
    packagecom.renguanyu.demo;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;importorg.apache.tomcat.jdbc.pool.DataSource;importorg.apache.tomcat.jdbc.pool.PoolProperties;publicclassTomcat10JdbcPoolDemo{ public......
  • 2024/10/18日 日志 --》关于MySQL中的 事务 以及JDBC的初步学习笔记与整理
    今天学习练习了事务的相关内容,并正式向连接数据库走近,进入到JDBC的学习。点击查看代码--事务--概念简介:是一种机制,一个操作序列,包含了一组数据库操作命令。-- 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,--即这一组数据库命令要么同时成功,要么同时失......
  • com.microsoft.sqlserver.jdbc.SQLServerException: Software caused connection abor
    报错原因今天新安装的SQLSERVER2012,于是ruoyi框架就测试多数据源,结果发现无法连接。奇怪的是navicat可以连接,SQLServerManagementStudio也可以正常连接。我们都知道SQLSERVER默认的端口是1433,结果我用1433连接不上。于是查询了端口,发现只有1434端口开着,这个端口一看就是......
  • Sharding-JDBC标准模式详解
    Sharding-JDBC标准模式详解一.为什么要使用标准模式?Sharding-JDBC的标准模式就配置而言比inline模式繁琐多了,那为什么要使用标准模式呢Sharding-JDBC作为ApacheShardingSphere生态中的一款轻量级Java框架,提供了数据分片、读写分离、分布式事务和数据库治理等核心功......
  • Loading class `com.mysql.jdbc.Driver’. This is deprecated. The new driver class
    原文链接:Loadingclass`com.mysql.jdbc.Driver’.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver’.–每天进步一点点(longkui.site)某日构建springboot项目时,报的错:Loadingclass`com.mysql.jdbc.Driver'.Thisisdeprecated.Thenewdriver......
  • c3p0数据库连接池出现Could not get JDBC Connection An attempt by a client to chec
    c3p0有些年头了,也曾红极一时。但你是否遇到过,明明并发并不高,连接池最大连接数也设的挺大了,还是报无法获取新连接。CouldnotgetJDBCConnectionAnattemptbyaclienttocheckoutaConnectionhastimedout.参考文章:https://cloud.tencent.com/developer/article/2319703......