Javaでデータベースを扱う
2025年 2月 6日 Posted 野々瀨(フロントエンドエンジニア)
今回はJavaでデータベースを扱う方法をご紹介します。
前提環境
この記事では次の環境を前提としています。
- OSはWindows 11
- Java SE 8 (JDK 8u202)インストール済み
- データベースはMySQLでレコードデータ準備済み
最小限の環境ですので、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は自動で読み込まれますが、それ以外については指定して読み込ませる必要があります。このクラスファイルのパスを指定するのがクラスパスです。
クラスパスは次のいずれかで指定することができます。
- 環境変数「CLASSPATH」による指定
- javac/javaコマンドの
-cp
オプション - Eclipseの.classpathファイル
- Mavenのpom.xml
今回は最小限の環境のため、-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