MacOSでのPostgresSQLを用いたJDBCの始め方

## はじめに

JDBCを触る機会があったのですが、個人用の環境でも練習したいと思い、PostgreSQLを導入した際の手順です。基本的には備忘録です。

## 各種バージョン等

<pre>
- macOS : 10.15.4
- JDK : 13.0.1
- PostgreSQL : 12.2
- JDBC Driver : 42.4.12
- ターミナル : bash
</pre>

## Homebrewを用いてPostgreSQLをインストール

- [MacにPostgreSQLを導入する方法&初期設定をおこなう](http://vdeep.net/mac-postgresql)

上記の記事を参考にPostgreSQLをインストールします。
以下では、userとpasswordは`postgresql`として説明します。

## PostgreSQL JDBC Driverをダウンロード

- [PostgreSQL公式](https://jdbc.postgresql.org/download.html)

上記ページからJDBC Driverをダウンロードします。

## JDBC Driver(jarファイル)の設置とCLASSPATHの設定

MacOSかつ、JDKのバージョンが8以下であれば、Java外部ライブラリ(jarファイル等)を`/Library/Java/Extensions`に設置するとクラスローダーがコンパイル時にJDBCのクラスファイルを探してくれます。
しかし、今回はJDK13を用いているためCLASSPATHを設定する必要があります。

### 1. JDBC Driverの設置

ダウンロードした`postgresql-42.2.12.jar`を`/Library/Java/Extensions`に設置します。

### 2. CLASSPATHの設定

コンパイル時にクラスローダーに反応させるために、環境変数CLASSPATHを設定します。
ターミナルを起動し、以下コマンドを実行します。

```bash:CLASSPATHの設定及び再読み込み
echo 'export CLASSPATH=.:/Library/Java/Extensions/postgresql-42.2.12.jar:$CLASSPATH' >> .bash_profile
source ~/.bash_profile
```

1行目は`.bash_profile`へのCLASSPATHの書き込み
2行目は`.bash_profile`の再読み込み
をそれぞれ行っています。

## JDBCを用いたPostgreSQLへの接続テスト

最後に、テストテーブルの作成とデータベースへの接続及びデータの取得のデモを行います。

### 1. テスト用テーブルの作成

#### テストテーブル作成用SQLの作成

任意の場所に以下のファイルを作成します。
以下では~/Desktopに作成したものとします。

```sql:createTestTable.sql
create table test(
    id serial primary key,
    name varchar(255),
    point real
);
insert into test(name,point) values
('foo', 41.2),
('bar',55.1),
('baz', 10.7),
('qux', 98.0),
('quux', 22.2),
('foobar', 35.6);
```

#### PostgreSQLの起動とデータベースの作成

ターミナルを起動し、以下コマンドを実行します。

```bash:PostgreSQLの起動とデータベースの作成
brew services start postgresql
createdb test
psql test
```

#### テスト用テーブルの作成

PostgreSQLのコンソールが起動したら、以下コマンドを実行します。

```psql:テスト用テーブルの作成
\i ~/Desktop/createTestTable.sql
\q
```

### 2. JDBCからDBへの接続及びデータの取得

#### 呼び出し用のJavaファイルの作成

任意の場所に以下のファイルを作成します。
以下では~/Desktopに作成したものとします。

```java:Main.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost/test";
        String user = "postgresql";
        String password = "postgresql";
        String sql = "select * from test";

        try(Connection con = DriverManager.getConnection(url, user, password)){
            try(PreparedStatement ps = con.prepareStatement(sql)){
                ResultSet rs = ps.executeQuery();
                while (rs.next()){
                    System.out.print(rs.getString("name"));
                    System.out.print(" gets ");
                    System.out.println(rs.getInt("point"));
                }
            } catch(SQLException e){
                e.printStackTrace();
            }
        } catch(SQLException e){
            e.printStackTrace();
        }
    }
}
```

#### Javaファイルのコンパイルと実行

```bash:Javaファイルのコンパイルと実行
cd ~/Desktop
javac Main.java
java Main
```

#### 出力結果
<pre>
foo gets 41.2
bar gets 55.1
baz gets 10.7
qux gets 98.0
quux gets 22.2
foobar gets 35.6
</pre>

## おわりに

初めてJDBCを用いてデータベースアクセスを行う方の手助けになればと思います。
誤り等あればご指摘頂けると幸いです。

## 参考文献

- [MacにPostgreSQLを導入する方法&初期設定をおこなう](http://vdeep.net/mac-postgresql)
- [ドットインストール - PostgreSQL入門](https://dotinstall.com/lessons/basic_postgresql)