おはようございます。
筆者の本業の方がだいぶ忙しくなり、投稿期間が空いてしまいました、、、良くないですね!
言い訳せずにちゃんと解説を垂れ流し続けます!!!!失踪はしません!笑
今回は、
java 8 gold資格試験の出題範囲からJDBC関連APIについて解説します!
はじめに
JDBC(Java Database Connectivity)は、javaを用いてデータベースアクセスをする際に必要なAPIです。
用途が明確であり、java使いの方がwebアプリを作ると言った状況下では重要な知識になってきます。
使用に際して必要となるJDBCドライバ というものが必要になりますが、ドライバはOracleやPostgreSQLなどの各データベースベンダーから提供されているので、JDBC使用に際したすべての情報が試験範囲になるわけではありません。
java側のスコープを見極めて、効率よく勉強を進めていきましょう。
【対象者】本記事は、Oracle Certified Java Programmer, Gold SE 8 認定資格試験の出題分野の解説をいたします。特に以下のような方には読んでいただければ幸いです。
- 当該試験を受ける方
- java 11 Goldの試験を受ける方でJDBCの理解を深めたい方
- 受験の有無にかかわらず、JDBCの使い方をおさらいしたい方
- ちょうど今サーブレット やjspを用いるようなwebアプリを開発し始めるという方
- 普通にド忘れしたプログラマーの方
出題範囲の確認
公式ページの出題内容は以下の通りです。
【JDBC によるデータベース・アプリケーションの作成】
- Predicate、Consumer、Function、Supplier など、java.util.function パッケージに含まれている組込みインタフェースを使用する
- プリミティブ型を扱う関数型インタフェースを使用する
- 2つの引数を扱う関数型インタフェースを使用する
- UnaryOperator インタフェースを使用するコードを作成する
参考(https://education.oracle.com/ja/java-se-8-programmer-ii/pexam_1Z0-809)
前回は上記の項目をまず読み解くのに必要なクラスの一部を紹介しました。
今回も引き続き残りのクラスを解説するとともに、上記の内容の意味するところを読み解いていければと思います!
なので、今回は
- JDBCと、接続、命令に必要なクラス(前半)
- 結果取得に必要なクラスと例外(後半)
という流れで進めていきましょう!
それでは、内容をどうぞ。
内容
JDBCとドライバ
概要
まず、JDBCとは何か?と言うところから確認していきましょう。
JDBCはjavaアプリケーションからリレーショナルデータベースを利用するための技術です。以下の2つの構成物からなります。
- JDBC API :特に準備等はいらない
- JDBCドライバ :DBのサイト等から入手し、設定しないといけない
javaアプリケーションからはJDBC APIの機能を呼び出して、
呼び出されたJDBC APIの機能がJDBCドライバにアクセスし、
JDBCドライバは指示通りのDBアクセスを行う、と言う流れです。
1番のJDBCドライバこそ製品固有のものを用意する必要はありますが、
ソースコード 状ではJDBCドライバにアクセスする行を1~2行書き換えれば、
他のロジック部分のソースは製品ごとに変える必要はない、と言うのが特徴になります。
つまり、製品が変わってもソースはほぼ弄らずに使い回し可能と言ったところです。
今時の言語だとだいたいそうなってる気もしますが、、、笑
それでは、構成物の説明に入らせて頂きますね。
JDBC API
上で述べたJDBC APIはJDKの標準ライブラリにおける
java.sqlパッケージや、
javax.sqlパッケージ(JDBC拡張パッケージ。どうやら試験範囲からは外れるようです)
において機能が提供されています。
特にJDBCAPIに関しては新たにクラスを入手してきたり、設定をしたりの必要はありません。あくまで標準ライブラリに含まれるもの、と言う位置付けです。
JDBCドライバ
こちらは、上記のとおりDBの本家サイト等から拾ってくる必要があります。
このJDBCドライバですが、製品ごとに物が違うので、例えばDBがpostgresならpostgres用の、Mysqlならそれ専用の、、、と言った風に用意しないといけません。
また、ちょっと前述しましたがDBの種類が変わると、ソースコード の中で変わる部分があります。
それは、DBアクセスを行うための情報を記載する、“接続URL“と呼ばれる部分です。
以下のようになります。
"①jdbc:②データベース製品名//③ホストマシンのアドレス[:④ポート]/⑤データベース名[⑥オプション]" //[]のついているものは、書かなくても大丈夫。[]は便宜上ここで使っているだけで、実際は書きません。
それぞれの内容は、以下のようになります。
- ① 通信プロトコルなのですが、jdbc固定なので変えることはありません。
- ② データベース製品の名前です。mysql とかです。
- ③ データベースのプロセスが動いているマシンのアドレスを書きましょう。手元のPCで動いているならlocalhost,とかですね。
- ④ 接続ポートです。基本的に、データベースが待ち受けるポートを自分で変えていなければここで指定しなくても動きます。
- ⑤ データベース名、と言うのは自分で作成した”データベース”というデータ保存の単位に設定した名前を書きます。詳しくは割愛しますが、DBにデータを保存する際、まず”データベース”,その下に”テーブル”を作ってテーブルの中に”レコード”と言う形でデータをしまいます。この欄に入るのはその意味での”データベース”の名前です。
- ⑥ オプションです。つけてもつけなくても動きます。
と言った形で、ごちゃごちゃ書きましたがようはここは一回書いて仕舞えば製品が変わらなければもう触ることはありません笑
ただ、試験対策にこう言う構成であることは覚えておきましょう。
※なんでデータベース名がいるの?みたいなことを考えたときに、
DBを使うときには最初に作成したデータベース名を入力してアクセスして、
その後にクエリを書くので、
全部アクセスの段階に必要な情報なんだよ、という風に考えることができます。
やばい!内容飛んだ!と思っても、
リモートマシンのデータベースプロセスにクエリを送りたいとき、
どんな前情報必要だっけ?と考えると自ずと思いつくので、
順番だけ間違えなければ大丈夫かと思います。
さらに、当然ですがこのJDBCドライバだけでDB機能が完成するわけでもなく、
DBそのもののインストールも必要になります。
その辺の設定の方が初心者には辛いと思いますので
今度拙作のコードを載せて解説、と言う形にさせてください。
java.sql.DriverManagerクラス
getConnectionで接続~java.sql.Connectionインタフェース
JDBCを用いてDBアクセスを行うときには、java.sql.DriverManagerクラスのgetConnectionメソッドを使います。
getConnectionメソッドには、以下のようなオーバーロードがあり、引数にはいずれも前述の”接続URL”が必要になります。
メソッド名 | 動作 |
static Connection getConnection(String url) | 接続URLに従ってDB接続をし、接続インスタンスを返します。 |
static Connection getConnection(String url, Properties info) | 接続に関わる詳細設定をプロパティとして受け取り、接続して接続情報インスタンスを返します。 |
static Connection getConnection(String url, String user,String pass) | ユーザ名とパスワードを指定した上で接続して接続情報インスタンスを返します。(これが一番使うかも、、、) |
基本的にDBでの操作はこのメソッドが返す接続インスタンスを介して行われます。
上記メソッドに失敗すると、SQLExceptionがスローされます。
また、closeしないとメモリリークでアプリケーションが正常に動作しなくなる可能性もあるので、Connectionオブジェクトをもらって、操作が終わったらcloseメソッドで閉じるか、try-with-resource文で安全に閉じておくようにしましょう。
try(Connection con = DriverManager.getConnection(URL)){ //操作 } catch (SQLException se) { //例外処理 }
java.sql.Statementインタフェース
概要と取得方法
接続したデータベースに対して、SQL文を発行するにはこのインタフェースのオブジェクトを持ちいます。
Statementインタフェースのオブジェクトの取得は、
上記のConnectionオブジェクトの
createStatementメソッドを使用します。
Statement stmt = con.createStatement();
このオブジェクトも基本的に使用後のリソース解放が必要なオブジェクトのため、
try-with-resource文か、closeメソッドの呼び出しを忘れないようにしましょう。
クエリ用メソッド
メソッド名 | 動作 |
boolean execute(String sql) | 複数の結果を返す可能性のある クエリを発行する際に使います。 |
ResultSet executeQuery(String sql) | SELECT文でレコードを取得する といった用途で場合に使います。 |
int execteUpdate(String sql) | INSERT,DELETE,DELETE,DDL文といった、 データ取得ではなくデータ操作を行う クエリの時に使います。 |
主に使うのはexecuteQueryと executeUpdateです。
executeQueryでは取得したレコードをResultSetというオブジェクトの形式で返し、
executeUpdateではクエリで変更の発生した行数をintで返します。
ちなみに、execute()メソッドはどんなクエリでも実行することができ、
実行したクエリが実行結果(ResultSetオブジェクト)を伴うものだった場合はtrue,
そうでない場合はfalseを返します。
また、このStatementオブジェクトの内部にもResultSet形で結果を保存しておく機能があり、
getResultSet()メソッドを用いることで、実行済みのステートメントオブジェクトから
ResultSetオブジェクトを取得することが可能です。
まとめ
今回はjava 8 Gold試験対策として、JDBCの分野について解説しました。
データベースアクセスの機能に関して、
サーブレット 等だと、ruby on rails やdjango等に比べて隠蔽される機能が少ないため、
実装者がコーディングをすることが多くなります。
(Spring等のフレームワークを使えば結局隠蔽されるのですが。。。)
しかし、これは逆に中身の処理が実際の操作と紐づいて分かり安いというメリットにはなります。
jdbcでデータベースアクセスについて理解した方が、のちのち楽なフレームワークが出てきた時も理解のスピードが早まるはずです。
ですので、他の章に比べても特にこの章は、実際に手を動かして知識の定着を図っていただければと思います!
それでは、次回またお会いしましょう〜。
コメント