Javaでデータベースを扱う

2025年 2月 6日 Posted 野々瀨(フロントエンドエンジニア)

今回はJavaでデータベースを扱う方法をご紹介します。

前提環境

この記事では次の環境を前提としています。

最小限の環境ですので、MavenやIDE(Eclipseなど)といったものは考慮していません。

ドライバーの設置

Javaでは、JDBC (Java Database Connectivity)というJavaとデータベースをつなぐ役割をするもので、標準のAPIとして搭載されています。JDBCはデータベースとの通信を可能にするために、データベースごとに用意されているドライバーというものが必要になります。今回の環境ではMySQLですので、MySQLのドライバーを使用します。

まず次のMySQLのページへアクセスします。https://www.mysql.com/jp/products/connector/

次に「JDBC Driver for MySQL (Connector/J)」という項目の「ダウンロード」ボタンを押します。

「Select Operating System:」を「Platform Independent」に選択します。

「ZIP Archive」と表記されている項目の「Download」ボタンを押します。

ダウンロードしたZIPファイルを開き、その中にある「mysql-connector-j-x.x.x.jar」というjarファイルを、Javaのインストールディレクトリーにある「lib」ディレクトリーに解凍・設置します。

これでドライバーの設置が完了しました。なお、jarファイルの設置場所はどこでもよいですが、ここでは分かりやすくJavaのインストールディレクトリーとしました。

クラスパスを指定

ドライバーファイルはクラスパスとして指定します。

Javaのプログラムを実行する際、クラスファイルを参照するため、その場所を指定する必要があります。コアである標準APIは自動で読み込まれますが、それ以外については指定して読み込ませる必要があります。このクラスファイルのパスを指定するのがクラスパスです。

クラスパスは次のいずれかで指定することができます。

今回は最小限の環境のため、-cpオプションで指定する方法で行います。javacコマンドまたはjavaコマンドに-cpオプションを付けて、続けてパスを指定します。

javac -cp クラスパス javaファイルパス
java -cp クラスパス 実行クラス名

複数指定する場合はセミコロン(;)で区切って指定します。

javac -cp クラスパス;クラスパス javaファイルパス
java -cp クラスパス;クラスパス 実行クラス名

また、クラスパスは自身の場所を含む必要がありますので、自身の場所を示すドット(.)も指定します。これがありませんと、javaコマンドで実行するクラス名が見つからず、「エラー: メイン・クラスxxxが見つからなかったかロードできませんでした」とエラーが表示されてしまいます。

javac -cp .;クラスパス javaファイルパス
java -cp .;クラスパス 実行クラス名

パスの中にスペースが含まれる場合はダブルクォーテーションで囲みます。

javac -cp ".;クラスパス" javaファイルパス
java -cp ".;クラスパス" 実行クラス名

実際にドライバーのパスを指定すると次のようになります。

javac -cp ".;C:\Program Files\Java\jdk1.8.0_xxx\lib\mysql-connector-j-x.x.x.jar" Example.java
java -cp ".;C:\Program Files\Java\jdk1.8.0_xxx\lib\mysql-connector-j-x.x.x.jar" Example

ドライバーの読み込み

Javaのコード内でドライバーを読み込みます。 ドライバーの読み込みはClass.forNameメソッドを使用します。

public class Example {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch(ClassNotFoundException e) {
            System.out.println("ドライバーの読み込みに失敗:" + e.getMessage());
            System.exit(0);
        }
    }
}

これで準備が整いました。

データベースの操作を行う

データベースの操作を行うためのJavaコードを試してみます。

データベースへ接続/切断

データベースへ接続するには、DriverManager.getConnectionメソッドを使用します。DriverManager.getConnectionメソッドは次の引数を指定することができます。

引数説明
第一引数 接続先のデータベースの種類とホスト名、ポート番号、データベース名を指定します。先頭に「jdbc:」を付けて指定します。jdbc:mysql://ホスト名:ポート番号/データベース名
第二引数 接続先データベースのアカウントのユーザー名を指定します。
第三引数 第二引数で指定したユーザー名に対するパスワードを指定します。

接続したデータベースを切断する場合は、Connection.closeメソッドを使用します。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Example {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch(ClassNotFoundException e) {
            System.out.println("ドライバーの読み込みに失敗:" + e.getMessage());
            System.exit(0);
        }

        try {
            // 接続
            Connection con = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test",
                "root",
                ""
            );

            System.out.println("データベースへの接続に成功");

            // 接続解除
            con.close();
        } catch(SQLException e) {
            System.out.println("データベースへの接続に失敗:" + e.getMessage());
        }
    }
}

クエリを実行

まずステートメントを作成します。 ステートメントの作成は、Connection.createStatementメソッドを使用します。

そしてクエリを実行するには、Statement.executeQueryメソッドを使用します。Statement.executeQueryメソッドは次の引数を指定することができます。

引数説明
第一引数 クエリを指定します。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

public class Example {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch(ClassNotFoundException e) {
            System.out.println("ドライバーの読み込みに失敗:" + e.getMessage());
            System.exit(0);
        }

        try {
            // 接続
            Connection con = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test",
                "root",
                ""
            );

            System.out.println("データベースへの接続に成功");

            // ステートメントを作成
            Statement stat = con.createStatement();

            // クエリの実行
            ResultSet rs = stat.executeQuery("SELECT * FROM users");

            // 接続解除
            con.close();
        } catch(SQLException e) {
            System.out.println("データベースへの接続に失敗:" + e.getMessage());
        }
    }
}

クエリの実行結果を取得

ResultSetオブジェクトは、クエリの実行結果を行単位で動かしながら処理を行うカーソルとなっています。ResultSet.nextメソッドを使用することで、現在のカーソル(行)位置を次の位置へ移動して処理します。ResultSet.nextメソッドはwhile文と組み合わせることで、クエリの実行結果を繰り返し処理することができます。

現在のカーソル(行)で特定のカラムの値を取得する場合は、ResultSet.getStringメソッドやResultSet.getIntメソッド、ResultSet.getBooleanを使用します。ResultSet.getStringメソッドは値を文字列として取得し、ResultSet.getIntメソッドは値を数値として取得、ResultSet.getBooleanメソッドは値をBoolean値として取得します。ResultSet.getStringメソッドやResultSet.getIntメソッド、ResultSet.getBooleanは次の引数を指定することができます。

引数説明
第一引数 取得したいカラム名を指定します。

例えばSELECT文によるデータの取得を行う場合、次のようなコードになります。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

public class Example {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch(ClassNotFoundException e) {
            System.out.println("ドライバーの読み込みに失敗:" + e.getMessage());
            System.exit(0);
        }

        try {
            // 接続
            Connection con = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test",
                "root",
                ""
            );

            System.out.println("データベースへの接続に成功");

            // ステートメントを作成
            Statement stat = con.createStatement();

            // クエリの実行
            ResultSet rs = stat.executeQuery("SELECT * FROM users");

            // 結果を繰り返す
            while(rs.next()) {
                String nameVal = rs.getString("name");
                int ageVal = rs.getInt("age");

                System.out.println("氏名:" + nameVal);
                System.out.println("年齢:" + ageVal);
            }

            // 接続解除
            con.close();
        } catch(SQLException e) {
            System.out.println("データベースへの接続に失敗:" + e.getMessage());
        }
    }
}

【おまけ】レコードの追加

Connection.prepareStatementメソッドでINSERT文を使用してレコードを追加します。Connection.prepareStatementメソッドはプレースホルダやエスケープ処理を行い、SQLインジェクション対策することのできるメソッドです。戻り値はPreparedStatementオブジェクトです。

引数説明
第一引数 クエリを指定します。

PreparedStatement.setStringメソッドやPreparedStatement.setIntメソッドで、プレースホルダに値を設定していきます。

引数説明
第一引数 設定するプレースホルダの番号を指定します。開始は1から始まります。
第二引数 設定する値を指定します。

そしてPreparedStatement.executeUpdateメソッドを実行することで、クエリが実行されます。

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

public class Example {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch(ClassNotFoundException e) {
            System.out.println("ドライバーの読み込みに失敗:" + e.getMessage());
            System.exit(0);
        }

        try {
            // 接続
            Connection con = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test",
                "root",
                ""
            );

            System.out.println("データベースへの接続に成功");

            // ステートメントを作成
            PreparedStatement preStat = con.prepareStatement("INSERT INTO users(name, kana, age, gender) VALUES(?, ?, ?, ?)");

            // 値を設定
            preStat.setString(1, "山田 太郎");
            preStat.setString(2, "やまだ たろう");
            preStat.setInt(3, 21);
            preStat.setString(4, "男");

            // クエリを実行
            preStat.executeUpdate();

            // 接続解除
            con.close();
        } catch(SQLException e) {
            System.out.println("データベースへの接続に失敗:" + e.getMessage());
        }
    }
}

最後に

いかがだったでしょうか。ドライバーやクラスパスなんかは、少しつまづきやすいところかなと思います。

今回は簡単な処理(コード)でしたが、他にもさまざまなメソッドなどが存在します。Oracleの公式ドキュメントにありますので、必要であればご覧くださいませ。

https://docs.oracle.com/javase/jp/8/docs/api/overview-summary.html