• 【Java 进阶篇】JDBC Statement:执行 SQL 语句的重要接口


    在这里插入图片描述

    在Java应用程序中,与数据库进行交互是一项常见的任务。为了执行数据库操作,我们需要使用JDBC(Java Database Connectivity)来建立与数据库的连接并执行SQL语句。Statement接口是JDBC中的一个重要接口,它用于执行SQL语句并与数据库进行交互。本文将详细介绍Statement接口的使用,包括如何创建Statement对象、执行SQL语句、处理结果等内容。

    什么是 JDBC Statement?

    Statement接口是JDBC的一部分,它允许我们向数据库发送SQL查询和更新语句,并从数据库中获取结果。Statement接口有多个子接口和实现类,常用的有以下几种:

    • Statement:用于执行普通的SQL语句,不带有参数。

    • PreparedStatement:用于执行预编译的SQL语句,可以带有参数,防止SQL注入攻击。

    • CallableStatement:用于执行数据库存储过程。

    在本文中,我们将主要关注Statement接口及其用法。

    创建 JDBC Statement 对象

    在执行SQL语句之前,首先需要创建Statement对象。Statement对象通常与Connection对象关联,通过Connection对象的createStatement()方法创建。下面是创建Statement对象的示例代码:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class StatementExample {
        public static void main(String[] args) {
            // JDBC连接参数
            String url = "jdbc:mysql://localhost:3306/mydatabase";
            String username = "root";
            String password = "password";
            
            // 创建Connection对象
            try (Connection connection = DriverManager.getConnection(url, username, password)) {
                // 创建Statement对象
                Statement statement = connection.createStatement();
                
                // 在此处执行SQL语句
                
                // 关闭Statement
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在上述代码中,我们首先创建了一个Connection对象,然后使用createStatement()方法创建了一个Statement对象。需要注意的是,我们在try-with-resources块中创建了ConnectionStatement对象,这样在退出块时会自动关闭这些资源,无需手动关闭。

    执行 SQL 查询语句

    一旦创建了Statement对象,我们可以使用它来执行SQL查询语句。以下是一个简单的示例,演示如何执行SELECT查询并处理查询结果:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class SelectExample {
        public static void main(String[] args) {
            // JDBC连接参数
            String url = "jdbc:mysql://localhost:3306/mydatabase";
            String username = "root";
            String password = "password";
            
            try (Connection connection = DriverManager.getConnection(url, username, password)) {
                // 创建Statement对象
                Statement statement = connection.createStatement();
                
                // 执行SQL查询语句
                String sql = "SELECT * FROM employees";
                ResultSet resultSet = statement.executeQuery(sql);
                
                // 处理查询结果
                while (resultSet.next()) {
                    int id = resultSet.getInt("id");
                    String name = resultSet.getString("name");
                    double salary = resultSet.getDouble("salary");
                    System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary);
                }
                
                // 关闭ResultSet和Statement
                resultSet.close();
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在上述代码中,我们使用executeQuery()方法执行SELECT查询语句,然后使用ResultSet对象遍历查询结果。最后,我们关闭了ResultSetStatement对象,释放资源。

    执行 SQL 更新语句

    除了查询,Statement对象还可以用于执行SQL更新语句,如INSERTUPDATEDELETE。以下是一个示例,演示如何执行INSERT语句来插入新数据:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class InsertExample {
        public static void main(String[] args) {
            // JDBC连接参数
            String url = "jdbc:mysql://localhost:3306/mydatabase";
            String username = "root";
            String password = "password";
            
            try (Connection connection = DriverManager.getConnection(url, username, password)) {
                // 创建Statement对象
                Statement statement = connection.createStatement();
                
                // 执行SQL更新语句
                String sql = "INSERT INTO employees (name, salary) VALUES ('John', 50000)";
                int rowsAffected = statement.executeUpdate(sql);
                
                if (rowsAffected > 0) {
                    System.out.println("Insertion successful. Rows affected: " + rowsAffected);
                } else {
                    System.out.println("Insertion failed.");
                }
                
                // 关闭Statement
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在上述代码中,我们使用executeUpdate()方法执行INSERT语句,并检查受影响的行数来确定是否插入成功。

    防止 SQL 注入攻击

    在使用Statement执行SQL语句时,要注意防止SQL注入攻击。SQL注入攻击是一种常见的网络安全威胁,它可以通过恶意构造的输入来破坏数据库操作。为了防止SQL注入攻击,应该使用PreparedStatement而不是Statement来执行带有参数的SQL语句。PreparedStatement允许将参数绑定到SQL语句中,从而避免直接拼接用户输入,如下所示:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class PreparedStatementExample {
        public static void main(String[] args) {
            // JDBC连接参数
            String url = "jdbc:mysql://localhost:3306/mydatabase";
            String username = "root";
            String password = "password";
            
            try (Connection connection = DriverManager.getConnection(url, username, password)) {
                // 创建PreparedStatement对象
                String sql = "INSERT INTO employees (name, salary) VALUES (?, ?)";
                PreparedStatement preparedStatement = connection.prepareStatement(sql);
                
                // 设置参数
                preparedStatement.setString(1, "Alice");
                preparedStatement.setDouble(2, 60000);
                
                // 执行SQL更新语句
                int rowsAffected = preparedStatement.executeUpdate();
                
                if (rowsAffected > 0) {
                    System.out.println("Insertion successful. Rows affected: " + rowsAffected);
                } else {
                    System.out.println("Insertion failed.");
                }
                
                // 关闭PreparedStatement
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在上述代码中,我们使用PreparedStatement来执行INSERT语句,并使用setString()setDouble()方法设置参数值。这样可以确保用户输入不会被误解为SQL代码,提高了安全性。

    总结

    Statement接口是JDBC中执行SQL语句的关键接口之一。通过创建Statement对象,我们可以执行查询和更新等各种数据库操作。然而,为了提高安全性,建议在执行SQL语句时使用PreparedStatement,尤其是涉及用户输入的情况下。希望本文能够帮助您更好地理解JDBC中的Statement接口以及如何使用它来与数据库进行交互。

    作者信息

    作者 : 繁依Fanyi
    CSDN: https://techfanyi.blog.csdn.net
    掘金:https://juejin.cn/user/4154386571867191
  • 相关阅读:
    【计算机网络基础实验】实验二 有线IP互通网络实践
    Juniper SRX300系列 —— 防火墙常用命令
    【Java开源项目】消息推送平台发送一条短信
    双向门控循环单元BIGRU时序预测的matlab实现【源代码】
    kubernetes调度
    PXE高效批量网络装机
    BERT: 面向语言理解的深度双向Transformer预训练
    PMP证书真的有用吗?
    Android开启HTTP服务
    【21天python打卡】第15天 python经典案例(1)
  • 原文地址:https://blog.csdn.net/qq_21484461/article/details/133467613