JavaからDBへのアクセス処理を実装する際はMyBatis等のフレームワークを使用して実装することも多いと思います。フレームワークを使用せず、StatementクラスでDBへのアクセス処理を実装しているソースコードを目にする機会があり、Statementクラスはどのように実装されているのか?とふと疑問に思ったので調査してみました。
まずは、java.sqlパッケージのStatementクラスを見てみることにします。
jdkにも色々とありますが今回はAmazon Corretto 11にしました。
下記サイトのURLからjdkをダウンロードします。
https://docs.aws.amazon.com/ja_jp/corretto/latest/corretto-11-ug/downloads-list.html
「amazon-corretto-11-x64-windows-jdk.zip」というファイルをダウンロードして解凍します。
解凍すると以下の場所にsrc.zipというファイルがあるのでこれも解凍します。
amazon-corretto-11.0.19.7.1-windows-x64-jdk>jdk11.0.19_7>lib>src.zip
src.zipを解凍すると以下の場所にStatement.javaというファイルがあります。
src>java.sql>java>sql>Statement.java
では、Statement.javaを見てどのように実装されているのか見てみることにしましょう。
おや、これはinterfaceですね。
executeQueryやexecuteUpdateメソッドを見ても戻り値の型、メソッド名、引数といったことが書いてあるだけで実装は書かれていません。
では、これらのメソッドの実装はどこにあるのでしょうか。
調べてみたところ、Javaから各種ベンダーが提供するDBにアクセスする際はJDBCドライバというプログラムが必要で、DBに対応したJDBCドライバを各種ベンダーが提供しているようです。
どうやらそのJDBCドライバの中にexecuteQueryやexecuteUpdateメソッドの実装があるようです。見てみましょう。
DBはPostgreSQLを使用することが多いので、PostgreSQLのJDBCドライバを見てみます。
下記サイトのURLからPostgreSQLのJDBCドライバをダウンロードします。
(MySQLのJDBCドライバが欲しい場合は MySQL JDBCドライバ といったワードで検索していただければダウンロードサイトが見つかるかと思います)
https://jdbc.postgresql.org/download/
ダウンロードしたjdkのバージョンは11でしたが、JDBCはJava 8が最新のようですね。
Java 8のDownloadボタンを押下して「postgresql-42.6.0.jar」をダウンロードします。
ふむ、jarファイルですね。そのままでは見れなかったので、拡張子を「.jar」から「.zip」に変更してから解凍しました。解凍したzipの中には色々とファイルが入っています。
ただ、classファイルなのでもうひと手間かけないと中身が見れません。
(残念ながらバイナリを読む力は私にはありません・・・)
そこでclassファイルをデコンパイルするツールをダウンロードします。
下記サイトのURLから「Java Decompiler(jd-gui)」というデコンパイルツールをダウンロードします。
http://java-decompiler.github.io/
「jd-gui-windows-1.6.6.zip」をダウンロードして解凍します。
解凍するとjd-gui.exeという実行ファイルがあるので、ダブルクリックで実行します。
実行すると画像のような画面が表示されます。
こちらの画面にデコンパイルしたいclassファイルをドラッグ&ドロップします。
classファイル単位ではなく、jarファイルをそのままドラッグ&ドロップしても問題ありません。
話を少し戻して、解凍したJDBCドライバのpostgresql-42.6.0を探していくと以下のようなファイルが見つかりました。
org.postgresql.jdbcパッケージのPgStatementというクラスで、Statementクラスをimplementsしています。
executeQueryやexecuteUpdateメソッドの実装が書いてありました。
ふむ、ぱっと見よく分かりませんがこのソースコードを追っていけばStatementクラスの実装を理解することができそうです。
ソースコードはGitの方にもあるのでこっちを見る方がぶっちゃけ早いです。
https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/jdbc/PgStatement.java
このような感じで探していけばStatementクラス以外のConnectionやPreparedStatementクラスなどの実装も見ることができます。
普段何気なく使用しているAPIの実装を見てみるのもより理解が深まりますね。
コメント
Hey there, You have done an incredible job. I’ll definitely digg it and personally recommend to my friends.
I am sure they’ll be benefited from this website.
Thank you!!