0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JDBCの扱い

Last updated at Posted at 2023-06-28

Javaでデータベースを扱う

Javaデータベースを扱うには各データベースベンダーから提供されているJDBCドライバを管理するJDBCドライバマネージャーをJavaプログラム内でimportして使用する。

提供されているJDBCドライバはJavaが規定したJDBC APIインタフェースを実装しているためJDBCドライバマネージャーを用いれば異なるデータベースでも同じ方法でコーディングを行うことが出来るのである。

JDBCはjava.sql.内に存在しているので使用する際には

Importsql.java
import java.sql.* ;

が必要になる。

JDBCでできることは

1.データベースに接続(DriverManagerクラスのメソッド)
2.SQL文の作成(Connectionオブジェクトのメソッド)
3.SQL文の実行(PrepareStatementオブジェクトのメソッド)
4.実行した結果得られたDBの操作(ResultSetクラスのメソッド)
5.データベースの接続切断(Connectionオブジェクトのメソッド)

基本的にDBを扱うのだが項目に分けた理由としては()内にも記述した通り各手順で扱うオブジェクトが異なっているためである。

1.データベースに接続

まず第一にデータベースに接続することから始まる。
JDBCでデータベースに接続するにはDriverManagerクラスにあるgetConnetion()メソッドを使用する。
getConnetion()は引数に接続先情報,接続するユーザー名,パスワード の3つを入れ,問題がなければデータベースに接続することが出来る。問題があった場合はSQLExceptionがthrowされる。

他にも
getConnection(String url)
指定されたデータベースの URL への接続を試みる。

getConnection(String url, Properties info)
指定されたデータベースの URL への接続を試みる。
といった接続方法がある。

このメソッドは戻り値の型がConnectionである.
今後指定しログインしたデータベースに接続してあるConnectionオブジェクトの上でSQL文を作成するオブジェクトや操作をするオブジェクトを作成する。

2.SQL文の作成

SQL文を作成するにはConnectionオブジェクトSQL文を作成できるオブジェクトをもらう必要がある。
ConnectionメソッドにはSQL文を作成できるオブジェクトを受け取るprepareStatement(String sql)メソッドがある。
引数sqlにはパラメータを?にしたSQL文を入れる。
?を入れる理由としてSQLインジェクション対策where句以下を指定するため等がある。

?のままではsql文を実行した際SQLExceptionが発生してしまうのでその後の操作で?に値を入れる必要がある。prepareStatementオブジェクトsetXXXメソッドを用いることで?に値を入れることが出来る。setXXXメソッドでsql文を完成させprepareStatementオブジェクトで実行を行う。
prepareStatement(String sql)は戻り値がPreparedStatementオブジェクトなのでオブジェクトの宣言が必要になる。

Sample.java

String url = "jdbc:mysql://localhost:3306/sampledb";
String userName = "sample";
String password = "mysql";

con = DriverManager.getConnection(url, userName, password);

// SQL文の作成
String sql = "SELECT * FROM sample_table WHERE sample_column = ?";
stmt = con.prepareStatement(sql);
stmt.setInt(1,20);

3.SQL文の実行

完成したsql文を実行を行うには,PreparedStatementオブジェクトexecuteQuery()executeUpdate()を使用する。executeQuery()メソッドは戻り値にResultSetオブジェクトが返却され、executeUpdate()メソッドは戻り値にint型が返却される。executeQuery()ではResultSetにデータベースが返却されているイメージである。
データがなかった場合でもcolumnの行は返却されている。

Sample.java
// SQL文の作成
String sql = "SELECT * FROM sample_table WHERE sample_column = ?";
stmt = con.prepareStatement(sql);
stmt.setInt(1,20);

//SQL文の実行
ResultSet res = null;
res = stmt.executeQuery();

イメージとしてデータがあった場合は

column1 column2 column3
~~~ ~~~ ~~~

データがない場合では

column1 column2 column3

といったデータが返却されている。

4.実行した結果得られたDBの操作

このような図が返却され最初はcolumnの行を選択している。そのためデータを取得するには次の行を選択する必要がある。次の行に移るにはnext()メソッドを使用する。返却される値はboolean型のため次の行(データ)がある場合はtrue,(データが)無い場合はfalseが返却される。
next()メソッドtrueの場合ではresインスタンス次の行に移行し、データの行を扱っている。データの行を扱っている場合ResultSetオブジェクトのgetXXX("DBのcolumn")を呼び出すことが出来る。引数にはDBのcolumn名を入れることで必要な値を得ることが出来る。XXX部分にはStringintといった型を指定できる。

5.データベースの接続切断

最後にDBの接続を切断する場合、DBを扱うオブジェクトすべてをDBから切断する必要がある。切断する順番は作成した最後から順に切断を行う。
実際にPreparedStatementとResultSetはデータベースへのアクセスを行うクラスを作り、そのクラスを通してデータベースへアクセスするDAOと呼ばれるクラスで作成しそのクラス内でcloseをする必要がある。

Sample.java
// データベースの接続切断
// 結果セットのクローズ
if (res != null) {
	res.close();
}
// ステートメントのクローズ
if (stmt != null) {
	stmt.close();
}
// 接続のクローズ
if (con != null) {
	con.close();
}

JDBCの扱いは異常である。
最後にサンプルプログラムを載せる。

サンプルプログラム

Sample.java
package sample;

import java.sql.*;


public class Samples {
	public static void main(String args[]) {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet res = null;

		String url = "jdbc:mysql://localhost:3306/sampledb";
		String userName = "sample";
		String password = "mysql";

		try {
			// データベースに接続
			con = DriverManager.getConnection(url, userName, password);

			// SQL文の作成
			String sql = "SELECT employee_id, employee_name, department_id, phone "
						+ "FROM employee WHERE department_id = ?";
			stmt = con.prepareStatement(sql);
			stmt.setInt(1,20);

			// SQL文の実行
			res = stmt.executeQuery();

			System.out.println("Result------------------------");

			// 結果セットから情報を取り出す
			while (res.next()) {
				System.out.print(res.getInt("employee_id") + ",");
				System.out.print(res.getString("employee_name") + ",");
				System.out.print(res.getInt("department_id") + ",");
				System.out.print(res.getString("phone"));
				System.out.println();
			}
			System.out.println("-------------------------------End");
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				// 結果セットのクローズ
				if (res != null) {
					res.close();
				}
				// ステートメントのクローズ
				if (stmt != null) {
					stmt.close();
				}
				// 接続のクローズ
				if (con != null) {
					con.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?