eclipse使わずにJDBCでJavaアプリケーションとPostgreSQLの接続（コマンドプロンプトで実行）

## はじめに

プログラミング教育の講師という立場でもある私は、初学者に対して統合開発環境をあえて使わずにプログラミング言語の基礎を理解するよう伝えています。
そのため、eclipseを使わずにJavaアプリケーションを動作させる環境を用意する必要がありました。

## この記事を読んでできること

コマンドプロンプトでPostgreSQLのAPIを使ったJavaアプリケーションを実行することができるようになります。

## 実行環境

実行環境は以下を使っています。

* OS
  * Windows10
* Javaバージョン
  * OpenJDK 14.0.2
* データベースバージョン
  * PostgreSQL 12

## PostgreSQL用JDBCのjarファイルを追加する

PostgreSQLをインストールする際の付属アプリケーションである「スタックビルダー」を起動してください。

<img width="536" alt="スタックビルダ 4.2.0の起動画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680665/7563a30a-2669-5597-2d89-0483eed2797c.png">

インストールしたいアプリケーションから"pgJDBC vXX.X.XX"を選択してください。
これはインストーラーなので保存ディレクトリはどこでもOKです。（迷ったらダウンロードフォルダへ保存してください。）

<img width="536" alt="スタックビルダ 4.2.0のインストールしたいアプリケーションの選択画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680665/307b59a4-a1e8-b948-3481-ffce7a41b55e.png">

上記でダウンロードした"edb_pgjdbc.exe"を開いてjarファイルを追加します。
保存先はデフォルトのまま（"C:\Program Files (x86)\PostgreSQL\pgJDBC"）でインストールしてください。

## JDBCを使ってPostgreSQLとの接続を行う

私は最近、Javaプログラミングをする際は統合開発環境（eclipseなど）を使って開発する機会が増えて、滅多にサクラエディタなど簡単なエディタで実装することはなくなってきました。（大学などで学ぶ時はよく使っていました…。）
eclipseでのJDBC使用方法はよく見かけますがおさらいします。

eclipseでJDBCを使う際には、Javaプロジェクトを新規作成後、
プロジェクトを右クリックし以下の操作でJDBCのjarファイルを追加します。

<img width="647" alt="eclipse新規Javaプロジェクト作成画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680665/7151df11-b73a-20cc-62b3-aa47d2c5a4ed.png">

（英語）
"Build Path"→"Add External Archives..."→"postgresql-XX.X.XX.jar"を選択
（日本語）
"ビルド・パス"→"外部アーカイブの追加"

<img width="647" alt="ビルドパスの追加後" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680665/63967373-e5b8-2ce3-4a50-a2d88e117d79.png">

追加するとパッケージ・エクスプローラに表示されます。

<img width="400" alt="eclipseでビルドパスの追加方法" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680665/d73bfbe1-0aa2-6205-3395-d3a036bb4d5e.png">


## 実行したいソースコード

データベース（restaurantdb）にはすでにテーブル（menuitems）を生成しています。

```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class P5_1 {
   public static void main(String[] args) {

       String url = "jdbc:postgresql://127.0.0.1:5432/restaurantdb";
       String user = "postgres";
       String password = "postgres";
       String sql = "SELECT * FROM menuitems";

       try (Connection connection = DriverManager.getConnection(url, user, password);
           Statement statement = connection.createStatement();
           ResultSet resultSet = statement.executeQuery(sql)) {

           while(resultSet.next()) {
               String id = resultSet.getString(1);
               String name = resultSet.getString(2);
               int price = resultSet.getInt(3);
               String kindId = resultSet.getString(4);
               Boolean isDisabled = resultSet.getBoolean(5);

               System.out.println(id + " " + name + " " + price + " " + kindId + " " + isDisabled);
           }
       } catch (SQLException e) {
           e.printStackTrace();
       }
   }
}
```

## 本題：eclipseを使わずにJavaのプログラムからデータベース接続しようとするとエラーが発生する問題を解決したい

```
C:\java-programming\JDBCSample>javac P5_1.java

C:\java-programming\JDBCSample>java P5_1
java.sql.SQLException: No suitable driver found for jdbc:postgresql://127.0.0.1:5432/restaurantdb
       at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
       at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
       at P5_1.main(P5_1.java:15)
```

上記エラーを抑える方法は２つあるようです。
・環境変数へ「CLASSPATH」を追加する
・実行時に実行オプション「-cp」を付与する

## 環境変数へ「CLASSPATH」を追加する

１つ目に、環境変数へ「CLASSPATH」を追加するという選択肢があります。
"コントロール・パネル"→"システム"→"システムの詳細設定"→"環境変数"→"ユーザの環境変数"へ以下を追加してください。
変数名「CLASSPATH」
値「C:\Program Files (x86)\PostgreSQL\pgJDBC\postgresql-42.2.12.jar;.」
※値の最後にドット（.）が入っているので注意してください。ドットを入れ忘れるとデフォルトで設定されているカレントディレクトリへのクラスパスが無効となる場合があります。
※"postgresql-XX.X.XX.jar"は、格納場所やバージョンなどは適宜読み替えてください。
※すでに「CLASSPATH」が存在する場合、既存の値を消してしまうと他の環境が壊れる場合があるので、追記する形で編集してください。
　例えば、「C:\XXX\YYY.jar;」を設定していた場合は、「C:\XXX\YYY.jar;C:\Program Files (x86)\PostgreSQL\pgJDBC\postgresql-42.2.12.jar;.」となるように追記します。（セミコロンは区切り文字です。）

## 実行時に実行オプション「-cp」を付与する

何らかの理由で環境変数を変更できない場合、実行時にオプションをつけることができます。

例えば、「P5_1.java」をコンパイルし実行する場合、以下のコマンドを入力します。

```
> javac P5_1.java

> java -cp "C:\Program Files (x86)\PostgreSQL\pgJDBC\postgresql-42.2.12.jar;." P5_1
```

(実行結果が表示されます)
※値の最後にドット（.）が入っているので注意してください。ドットを入れ忘れるとデフォルトで設定されているカレントディレクトリへのクラスパスが無効となる場合があります。
※"postgresql-XX.X.XX.jar"は、格納場所やバージョンなどは適宜読み替えてください。

## まとめ

今回、eclipseを使わずにJavaプログラムからJDBCのAPIを呼び出しました。
あまりこれを使う機会は少ないかもしれませんが、仕組みを理解する上で試してみるのも良いかもしれません。

ありがとうございました。

## 参考

* JDBCインタフェース｜PostgreSQL  
https://www.postgresql.jp/document/7.4/html/jdbc.html