LoginSignup
2
2

【JavaGold】Statementインタフェース

Last updated at Posted at 2023-07-29

概要

JDBCでは、java.sql.Statementインタフェースをベースとして、java.sql.PreparedStatementjava.sql.CallableStatementの2つのサブインタフェースでSQLを扱う。

PreparedStatement

SQL文を事前に準備してデータベースに効率的に実行するためのインタフェースである。

主なメソッド

  • void setXxx(int parameterIndex, Xxx x)
    指定の型のパラメータを指定されたインデックスにセットする。
  • void getXxx(Xxx)
    実行後の出力パラメータの値を取得する。
    引数は以下のいずれかで渡す。
    • 列番号をint型で渡す。
      (例)getInt(1)
    • 列名をString型で渡す。
      (例)getString("name")

列番号は0からではなく1から始まる点に注意する。

  • ResultSet executeQuery()
    SELECTクエリを実行し、結果をResultSetとして返す。
  • int executeUpdate()
    INSERT、UPDATE、DELETEなどのSELECTクエリ以外を実行し、影響を受けた行数を返す。
  • boolean execute()
    実行結果が「検索した結果を保持するResultSet型オブジェクトか」をboolean型で返す。
    • trueの場合:検索のSQLと判断
    • falseの場合:挿入、更新、削除のいずれかのSQLと判断

これら3つのメソッドは以下のように使い分ける。

  • 挿入、更新、削除のいずれかの場合
    • executeUpdate()
  • 検索の場合
    • executeQuery()
  • 実行するSQLの種類が決まっていない場合
    • execute()
  • int[] executeBatch():一度に複数のクエリを実行できる。
    void addBatch()メソッドを使用して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/mydatabase";
        String user = "your_username";
        String password = "your_password";

        try (Connection connection = DriverManager.getConnection(url, user, password)) {
            String query = "SELECT * FROM employees WHERE department = ?";
            int departmentId = 123; // 仮に部署IDが123だとします

            // PreparedStatementを作成
            PreparedStatement preparedStatement = connection.prepareStatement(query);
            preparedStatement.setInt(1, departmentId); // パラメータを設定

            // クエリを実行し結果を取得
            ResultSet resultSet = preparedStatement.executeQuery();

            // 結果を処理
            while (resultSet.next()) {
                // レコードの処理
                int empId = resultSet.getInt("employee_id");
                String empName = resultSet.getString("employee_name");
                // 他のカラムも必要に応じて処理
                System.out.println("Employee ID: " + empId + ", Employee Name: " + empName);
            }

            // リソースをクローズ
            resultSet.close();
            preparedStatement.close();

        } catch (SQLException e) {
            System.err.println("データベース接続エラー: " + e.getMessage());
        }
    }
}

この例では、PreparedStatement クラスを使って、部署IDをパラメータとして受け取るSQLクエリを実行している。
setInt() メソッドを使用してパラメータの値を設定し、executeQuery() メソッドを呼び出して結果を取得している。

このように、パラメータ化されたクエリを実行することで、セキュリティが向上し、パフォーマンスも改善される。

CallableStatementインタフェース

PreparedStatement と同様にSQL文を実行するためインタフェースであるが、主な違いは、ストアド・プロシージャ1を実行することができる点である。

主なメソッド

  • registerOutParameter(int parameterIndex, int sqlType)
    ストアド・プロシージャが出力パラメータを持つ場合に、それらのパラメータを登録する。
  • prepareCall(String sql)
    呼び出すストアド・プロシージャ名を渡して取得する。
  • setXxx(int parameterIndex, Xxx value)
    ストアド・プロシージャに渡すパラメータを設定する。
  • execute():ストアド・プロシージャを実行する。
  • getXxx(int parameterIndex)
    実行後の出力パラメータの値を取得する。
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;

public class CallableStatementExample {

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

        try (Connection connection = DriverManager.getConnection(url, user, password)) {
            String procedureCall = "{call my_stored_procedure(?, ?)}";

            // CallableStatementを作成
            CallableStatement callableStatement = connection.prepareCall(procedureCall);
            callableStatement.setInt(1, 123); // ストアド・プロシージャに渡すパラメータを設定
            callableStatement.registerOutParameter(2, Types.INTEGER); // 出力パラメータを登録

            // ストアド・プロシージャを実行
            callableStatement.execute();

            // 出力パラメータの値を取得
            int result = callableStatement.getInt(2);

            System.out.println("ストアド・プロシージャの結果: " + result);

            // リソースをクローズ
            callableStatement.close();

        } catch (SQLException e) {
            System.err.println("データベース接続エラー: " + e.getMessage());
        }
    }
}

この例では、CallableStatement クラスを使って、my_stored_procedure という名前のストアド・プロシージャを呼び出しており、以下の順で処理している。

①:setInt() メソッドを使用して入力パラメータを設定
②:registerOutParameter() メソッドを使用して出力パラメータを登録
③:execute() メソッドでストアド・プロシージャを実行
④:getInt() メソッドで結果を取得

CallableStatement クラスを使用すると、ストアド・プロシージャを簡単に呼び出し、その結果を取得することができる。

PreparedStatementとCallableStatementの違い

主な違いとして、使用目的と用途が挙げられる。

使用目的

  • PreparedStatement:
    • パラメータ化されたSQLクエリを実行するためのインタフェース。
  • CallableStatement:
    • データベース内で定義されたストアド・プロシージャやストアド・ファンクションを呼び出すためのインタフェース。

用途

  • PreparedStatement:

    • 動的なパラメータを持つSQLクエリを事前に準備しておき、効率的に実行できる。
    • 主にSELECT、INSERT、UPDATE、DELETEなどの非ストアド・プロシージャクエリを実行する際に使用する。
  • CallableStatement:

    • 主にストアド・プロシージャやストアド・ファンクションの呼び出し時に使用する。

また、共通点は以下である。

  • ? を使ってパラメータを指定し、その後に setXXX() メソッドを使用してパラメータ値を設定する。
  1. SQL文や専用の言語を組み合わせて処理手順を記述し、データベースに対する連続した複数の処理を1つのプログラムにまとめ、DBMSに保存したもの。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2