ひよっこSEの備忘録

20卒の未経験エンジニアの日々の備忘録です。

【参照系】Javaをデータベースに接続する

研修の復習です。突っ込み・修正大歓迎です。

 

データベースについてはこちら

nekomurasan.hatenablog.com

***

 

JDBC

Java Database Connectivity

JavaのプログラムをRDBへ接続する専用のAPIです。

複数のDBMSの差異をなくし、1つに集約します。

 

DBへ接続

細かく手順で区切って書き残しておきます。

今回は参照系の場合です。

 

接続の流れとしては、

  1. データベースへの接続
  2. SQL文を実行後、結果を取得するためのステートメントを作る
  3. データベースから返ってきた結果を格納する

となります。

SQLへ接続

まずはSQLへ接続をします。

データベース操作用のJDBCを利用し、接続したいDBのURL,USER,PASSWORDを入力して接続します。(接続の認証が不要な場合、userとpassは要りません。)

JDBC URLは、データベース接続先を指定する文字列です。文字列は、各DBMSによって違います。(ex.MySQLの場合 jdbc:mysql://サーバ名/DB名)

Connection con = DriverManager.getConnection(JDBC url, user,password); 

Connection:DBMSへの接続・切断時に利用します。

DriverManager:DBMSへの接続準備に利用します。

getConnection:指定されたDBへの接続を試みます。このメソッドにはthrows宣言に例外が指定されていますので、最後にcatchで受け取る必要があります。(SQLException)

 

ここでは、データベースに接続するためのConnectionオブジェクトを作成しています。接続準備に必要なDriverManagerクラスの.getConnection()メソッドを用いて指定した接続先へ接続をします。

ステートメントの作成

ステートメントは、データベースと情報をやり取りするのに必要な土台のようなものです。

土台を作ることで、SQL文をデータベースに送ったり、そこから返ってきたものを受け取ることができます。

 

PreparedStatement pstmt = con.prepareStatement(sql);){

 

statementオブジェクトとPreparedStatementオブジェクトの違い

statement:実行時に解析を行います。

preparedStatement:実行時ではなく、オブジェクトの生成時に解析を行います。そのためstatementより高速に作動します。

実行結果を格納

ResultSet res = pstmt.executeQuery();

先ほど作成した土台を使ってexecuteQuery()メソッドを実行すると、データベースから結果が返ってくる場合にResultSetのインターフェースとしてresに格納されます。

 

ここまでで、データベースから指定した情報を取り出すことができました。

ここから、その情報が入っているresを使って処理をしていきます。

 

DBを使った処理

while(res.next()){
System.out.println(res.getXXX("任意の変数"));
}

データベース内の、任意の変数の値を全て表示します。

ResultSetオブジェクト(res)を使用して値の取得をしています。

resのみだと最初の行の前にカーソルが指している状態なのでnext()メソッドを使い次行へ移動させます。

変数のデータ型に合わせた型をXXXに入力することで、.getXXX()メソッドで欲しいフィールド値を取り出すことができます。

(ex.名前の場合はgetString("name")等)

例外をcatchする

} catch (SQLException e) {
System.out.println("異常が発生しました");
}

.getConnection()は上で書いたとおり例外が指定されているので、try文後にcatchします。

 

リソース付きtry文

以前書いた例外の記事では、tryの後すぐに{}があったと思います。

しかし今回出てきているtry文は、{}の前に(Connection con...)が続いています。

try後に()で変数宣言ができるのは、変数宣言時にAutoCloseableが継承されているインターフェースが使われているからです。リソース付きtry文(try-with-resources statement)と呼びます。

今回し用したインターフェースはConnectionです。

AutoCloseable: try-with-resources statementが閉じられるとき、自動的にclose()を呼ぶ

これは、変数(リソース)の型がAutoCloseableを継承しているインターフェースの場合のみ使えます。これを継承していることで、自動的にclose()が呼ばれます。

継承されていないインターフェースを実装した場合は、コンパイラエラーとなります。

 

コード一覧 

数行割愛しています。

//フィールド宣言
String url = "任意のurl名";
String user = "任意のユーザ名";

String password = "任意のパスワード";
String sql = "select * from testrecord;

//データベースへ接続
try(Connection con = DriverManager.getConnection(url, user,password);
PreparedStatement pstmt = con.prepareStatement(sql);){
//SQLステートメントの実行
ResultSet res = pstmt.executeQuery();
//結果の取得
while(res.next()){
System.out.println(res.getXXX("任意の変数"));
}

} catch (SQLException e) {
System.out.println("異常が発生しました");
}