【参照系】Javaをデータベースに接続する
研修の復習です。突っ込み・修正大歓迎です。
データベースについてはこちら
***
JDBC
Java Database Connectivity
複数のDBMSの差異をなくし、1つに集約します。
DBへ接続
細かく手順で区切って書き残しておきます。
今回は参照系の場合です。
接続の流れとしては、
となります。
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("異常が発生しました");
}