EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

Javaのデータベース操作について

イートスマートの新人エンジニアが、JavaのDB操作について学んだ内容を振り返ってみたいと思います。

大まかなDB操作の流れ

①Connectionでデータベースとの接続を確立。
②Statement(PreparedStatement)でSQLを実行。
③ResultSetでSQLの実行した結果にアクセス。

以下、データベースの接続や操作について必要なパッケージ、インターフェースの説明です。

java.sqlについて

リレーショナルデータベースのデータへアクセスし、様々な処理をするAPIを提供。以下で具体的に説明するような機能が含まれている。

Connection

特定のデータベースとの接続を確立する。Connectionのオブジェクトは、自動コミットモードになっており、データベースへの変更が自動保存される。

Statement

SQLを実行し、実行結果を返す。パラメータなしのSQLの実行に用いられ、Connectionから、Statementオブジェクトを生成し、Statementのオブジェクト に対し、executeメソッドでSQLを実行する。

PreparedStatement

パラメータありのSQLの実行に用いられる。パラメータに実際の値を設定する際に、自動でエスケープシーケンスが行われるので、SQLインジェクションの対策になる。 引数として渡すSQLは事前にコンパイルされるため、SQL が多数回実行される場合にも、高速に実行できる。

ResultSet

ResultSetは、Statementの実行の結果、取得したデータへのアクセスができる。さらに、データ(表)の現在行を指すカーソルを保持しており、nextメソッドによって、 カーソルが次行へ移動する。

SQLException

データベースエラーなどの情報を提供(SQL文の誤りなどによって発生する)。

料理教室の先生情報を取得する

上記の説明を踏まえて、データベースへ接続しSQLを実行するコードを組み立てます。

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

public class SelectCookingTeacher {

public static void main(String[] args) {
    Connection conn = null;
    try {
      // JDBCドライバを読み込み(ここでは、PostgreSQLを使用する想定)
      Class.forName("org.postgresql.Driver");

      // データベースへ接続(接続先のurlを指定)
      conn = DriverManager.getConnection(
          "jdbc:DB接続先","userid","password");

      // 実行するSQLを定義(先生のID、名前、会員ステータスを取得するSQL)
      String sql = "SELECT TEACHER_ID,TEACHER_NAME,MEMBERSHIP_STATUS FROM COOKING_TEACHER";
      PreparedStatement pStmt = conn.prepareStatement(sql);

      // SQL(SELECT文)を実行し、ResultSetで実行結果を受け取る
      ResultSet rs = pStmt.executeQuery();

      // 結果に格納されたレコードをループ処理し、一覧表示(nextメソッドは、ResultSetが提供するメソッド)
      while (rs.next()) {

        BigDecimal teacherId = rs.getBigDecimal("TEACHER_ID");
        String teacherName = rs.getString("TEACHER_NAME");
        String membershipStatus = rs.getString("MEMBERSHIP_STATUS");

        // (例)料理教室の先生に関するデータを出力している
        System.out.println("先生ID:" + teacherId);
        System.out.println("先生の氏名:" + teacherName);
        System.out.println("会員区分:" +membershipStatus);
      }
    } catch (SQLException e) {
      e.printStackTrace();
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } finally {
      // データベース切断
      if (conn != null) {
        try {
          conn.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

以上となります。