【JDBC ①】JavaからSQLite3のデータベースにアクセスしてみた。

今回、ソフト開発の過程でJavaからのデータベースアクセスを勉強していて、データベースの読み出しに成功したので記事にしてみました。
JDBCを使ってのデータベースアクセスはほぼ初めての経験なので、SQLite3の復習も兼ねて順を追ってやっていきたいと思います。

SQLite3の使い方については、[Qiita:SQLite3操作コマンド関連まとめ](https://qiita.com/tsweblabo/items/8fa21f3e9e30885be034)の記事でまとめてありますのでご参照ください。

## 環境
今回の開発環境については以下のとおりです。

- Ubuntu 18.04.5LTS
- OpenJDK 11.0.8 
- SQLite3 3.22.0

---

## データベースを作っておく
既存のデータベースから要素を読み出すために、予めデータベースを作っておきます。

```shell:データベースを作成
sqlite3 test.db
```
```sql:table1を定義
CREATE TABLE table1(id INTEGER PRIMARY KEY, name TEXT NOT NULL);
```
この時点で、ディレクトリにデータベースファイルが作成されます。
<img width = "400" alt = "testJDBC_Qiita.png" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150278/a090f761-988e-d6c0-585a-d861ce676f1e.png">

INSERT文でいくつかのデータの入れておいたので、SELECT文で見てみます。

```sql
SELECT * FROM table1;
id          name      
----------  ----------
1           satou     
2           suzuki    
3           tanaka    
4           katou     
5           takahashi 
```
データベースの確認が取れました。

---
## JDBCのダウンロード
JavaからSQLite3にアクセスするには、JDBCドライバーが必要になります。
[JDBCのリポジトリ](https://bitbucket.org/xerial/sqlite-jdbc/downloads/)からJDBCをダウンロードしましょう。
バージョンは、任意のものでいいと思いますが、今回は執筆時点で最新の`sqlite-jdbc-3.30.1.jar`をダウンロードします。

JDBCがダウンロードできたら、先程作成したデータベースを格納してあるディレクトリにコピーしておきましょう。

---
## Javaプログラミング作成
今回は参考にさせていただいたサイトのコードを元に適宜変更を加えて、javaファイルを作成しました。

```java:TestDAtabaseDriver.java
import java.sql.*;

public class TestDatabaseDriver {
    public static void main(String[] args) {
 
        Connection connection = null;
        Statement statement = null;
 
        try {
            Class.forName("org.sqlite.JDBC");

            // データベースのPATHを指定。相対パスでも絶対パスでも行けるようです
            connection = DriverManager.getConnection("jdbc:sqlite:test.db");
            statement = connection.createStatement();
            String sql = "select * from table1";
            ResultSet rs = statement.executeQuery(sql);
            while (rs.next()) {
                System.out.println(rs.getString(1));
            }
        } catch (ClassNotFoundException e) {
          e.printStackTrace();
        } catch (SQLException e) {
          e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
```
```shell:コンパイルして実行
javac *.java && java -classpath .:sqlite-jdbc-3.30.1.jar TestDatabaseDriver
```
```shell:実行結果
1
2
3
4
5
```
この結果から、TestDAtabaseDriver.javaの`System.out.println(rs.getString(1));`の部分で読み出す部分が決まるようなので、少し変更を加えてみましょう。

```java:変更前
System.out.println(rs.getString(1));
```
```java:変更後
System.out.println(rs.getString(1) + "|" + rs.getString(2));
```

実行してみます。

```shell:コンパイルして実行
javac *.java && java -classpath .:sqlite-jdbc-3.30.1.jar TestDatabaseDriver
```
```shell:実行結果
1|satou
2|suzuki
3|tanaka
4|katou
5|takahashi
```

### まとめ
無事にデータベースを読み出すことができました。
今回は初めてのJDBCに挑戦ということで、ほとんどがコピペで終始してしまいましたが、これを元に幅を広げて、再利用性の高いものにしていきたいと思います。

---

### 本記事目次ページ
[【データベース】SQLite3・JDBCまとめ](https://qiita.com/tsweblabo/items/8fa21f3e9e30885be034)

---
### 参考サイト
- [SQLite用JDBCのリポジトリ](https://bitbucket.org/xerial/sqlite-jdbc/src/default/)
- [TECHSCORE BROG/3分で構築！SQLiteを色々な環境で動かしてみる](https://www.techscore.com/blog/2015/03/27/3%E5%88%86%E3%81%A7%E6%A7%8B%E7%AF%89%EF%BC%81sqlite%E3%82%92%E8%89%B2%E3%80%85%E3%81%AA%E7%92%B0%E5%A2%83%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)