【Java上級】JDBC PreparedStatementの詳細説明

ここに画像の説明を挿入します

Java では、リレーショナル データベースとの対話は最も一般的なタスクの 1 つです。JDBC (Java Database Connectivity) は、Java プラットフォームの標準 API であり、さまざまなリレーショナル データベースに接続して操作するために使用されます。中でも、PreparedStatementJDBC の重要なインターフェイスであり、プリコンパイルされた SQL ステートメントを実行するために使用されます。このブログでは、JDBC の基本概念、使用法、ベスト プラクティスを含めて、JDBC について詳しく紹介しますPreparedStatement

PreparedStatement とは何ですか?

PreparedStatementこれは、プリコンパイルされた SQL ステートメントを実行するために使用される JDBC のインターフェイスです。通常の SQL ステートメントとは異なりStatementPreparedStatementSQL ステートメントは実行前にコンパイルされるため、より効率的かつ安全であり、SQL インジェクション攻撃を防ぐことができます。PreparedStatement通常、複数の同様の SQL クエリまたは更新を実行するために使用され、一度コンパイルして複数回実行するだけで済みます。

プリペアドステートメントの作成

オブジェクトを作成するには、まずオブジェクトを取得し、次にメソッドを使用して SQL ステートメントに渡すPreparedStatement必要があります。以下に例を示します。ConnectionprepareStatement

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

public class PreparedStatementDemo {
    
    
    public static void main(String[] args) {
    
    
        // 获取数据库连接
        Connection connection = getConnection();

        try {
    
    
            // SQL 查询语句,使用 ? 作为占位符
            String sql = "SELECT * FROM users WHERE username = ?";

            // 创建 PreparedStatement 对象
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
    }
    
    // 获取数据库连接的示例方法
    private static Connection getConnection() {
    
    
        // 实现获取数据库连接的逻辑,这里省略具体代码
        return null;
    }
}

上の例では、PreparedStatementSQL クエリ ステートメントの?プレースホルダーとして使用されるオブジェクトを作成しました。後でsetXXXこのメソッドを使用して、これらのプレースホルダーに特定の値を設定できます。

パラメータの設定

PreparedStatementSQL ステートメントのプレースホルダーのパラメーター値を設定できます。などsetXXXさまざまなデータ型のパラメータ設定には多くの方法があります。パラメータ設定の例を次に示します。setIntsetStringsetDouble

try {
    
    
    String sql = "INSERT INTO users (username, age) VALUES (?, ?)";
    PreparedStatement preparedStatement = connection.prepareStatement(sql);

    // 设置第一个参数为字符串类型
    preparedStatement.setString(1, "Alice");

    // 设置第二个参数为整数类型
    preparedStatement.setInt(2, 30);

    // 执行 SQL 语句
    preparedStatement.executeUpdate();
} catch (SQLException e) {
    
    
    e.printStackTrace();
}

上記の例では、setStringおよびsetIntメソッドを使用して、SQL ステートメント内の 2 つのプレースホルダーに特定のパラメーター値を設定しました。

クエリの実行

executeQueryクエリ操作を実行するには、クエリ結果を保存するためのオブジェクトを返す メソッドを使用できますResultSet以下に例を示します。

try {
    
    
    String sql = "SELECT * FROM users WHERE age > ?";
    PreparedStatement preparedStatement = connection.prepareStatement(sql);

    // 设置参数
    preparedStatement.setInt(1, 25);

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

    // 处理查询结果
    while (resultSet.next()) {
    
    
        String username = resultSet.getString("username");
        int age = resultSet.getInt("age");
        System.out.println("Username: " + username + ", Age: " + age);
    }
} catch (SQLException e) {
    
    
    e.printStackTrace();
}

上記の例では、プレースホルダーを使用してクエリ操作を実行し、setIntメソッドを通じてプレースホルダーのパラメーター値を設定し、次にexecuteQueryメソッドを使用してクエリを実行し、最後にResultSetクエリ結果を取得するためにトラバースしました。

アップデートを実行する

executeUpdate更新操作 (挿入、更新、削除など) を実行するには、メソッドを使用できます。以下に例を示します。

try {
    
    
    String sql = "UPDATE users SET age = ? WHERE username = ?";
    PreparedStatement preparedStatement = connection.prepareStatement(sql);

    // 设置参数
    preparedStatement.setInt(1, 28);
    preparedStatement.setString(2, "Alice");

    // 执行更新
    int rowCount = preparedStatement.executeUpdate();

    // 输出更新的行数
    System.out.println("Updated " + rowCount + " rows.");
} catch (SQLException e) {
    
    
    e.printStackTrace();
}

上記の例では、プレースホルダーを使用して更新操作を実行し、setIntandメソッドを使用setStringしてプレースホルダーのパラメーター値を設定し、その後executeUpdate、 メソッドを使用して更新操作を実行し、更新された行の数を出力します。

バッチ処理を実行する

PreparedStatementバッチ処理もサポートされており、複数の SQL ステートメントを一度に実行できます。これは、同様の SQL ステートメントを頻繁に実行する必要がある場合に役立ち、パフォーマンスを向上させることができます。バッチ処理の例を次に示します。

try {
    
    
    String insertSql = "INSERT INTO users (username, age) VALUES (?, ?)";
    String updateSql = "UPDATE users SET age = ? WHERE username = ?";

    // 创建 PreparedStatement 对象
    PreparedStatement insertStatement = connection.prepareStatement(insertSql);
    PreparedStatement updateStatement = connection.prepareStatement(updateSql);

    // 设置参数并添加到批处理中
    for (int i = 1; i <= 3; i++) {
    
    
        insertStatement.setString(1, "User" + i);
        insertStatement.setInt(2, 25 + i);
        insertStatement.addBatch();

        updateStatement.setInt(1, 30 + i);
        updateStatement.setString(2, "User" + i);
        updateStatement.addBatch();
    }

    // 执行批处理
    int[] insertResult = insertStatement.executeBatch();
    int[] updateResult = updateStatement.executeBatch();

    // 输出批处理结果
    System.out.println("Inserted rows: " + Arrays.toString(insertResult));
    System.out.println("Updated rows: " + Arrays.toString(updateResult));
} catch (SQLException e) {
    
    
    e.printStackTrace();
}

上記の例では、2 つのPreparedStatementオブジェクトを作成し、addBatchメソッドを使用して複数の SQL ステートメントをバッチに追加し、次にexecuteBatchメソッドを使用してバッチ内のすべての SQL ステートメントを一度に実行しました。

PreparedStatement を閉じる

使用後はPreparedStatementすぐに閉じてリソースを解放する必要があります。メソッドを使用してclose閉じることができますPreparedStatement終了の例は次のとおりですPreparedStatement

try {
    
    
    // 创建 PreparedStatement 对象
    PreparedStatement preparedStatement = connection.prepareStatement(sql);

    // 设置参数...
    
    // 执行操作...
    
    // 关闭 PreparedStatement
    preparedStatement.close();
} catch (SQLException e) {
    
    
    e.printStackTrace();
}

要約する

PreparedStatementこれは、プリコンパイルされた SQL ステートメントを実行するための JDBC の重要なインターフェイスであり、効率、セキュリティ、保守性の利点があります。実際のアプリケーションでは、これを使用するとPreparedStatementSQL インジェクション攻撃を効果的に防止し、データベース操作のパフォーマンスを向上させることができます。この記事の導入により、 のPreparedStatement基本概念と使用法をより明確に理解できるようになります。データベース関連の Java アプリケーションを作成する場合は、PreparedStatementSQL 操作を実行するために を使用することを検討してください。

著者情報

著者:Fanyi
CSDN: https: //techfanyi.blog.csdn.net
Nuggets:https://juejin.cn/user/4154386571867191

おすすめ

転載: blog.csdn.net/qq_21484461/article/details/133531760