脱!プログラミング入門

このブログではプログラミング入門後にさらに能力を伸ばすための援助ができるようにしたいです

JavaからSqliteのデータベースを動かしてみる

 何らかのデータを貯蔵したり,データを取ってきたりする必要が生じた際にデータベースという技術を使うことになります.データの貯蔵はあらゆる場面で必要となる手順です.貯蔵の対象となるデータの例を挙げると,商品のリスト,プロフィール,図書館の本など,数えるとキリがありません.ということは,データベースを扱う場面が数え切れないほどあるということです.

 データベースのデータのやり取りはSQL文を入力することで可能です.しかし,毎回SQL文を打ってデータを取得するのは非効率的です.そこで,現在出回っているプログラミング言語の多くではプログラムからデータベースを扱うためのライブラリが用意されており,プログラムを通してデータベースからデータをやり取りすることができます.

 データベースを扱う場面が多いためプログラムからデータベースを操作することができることにこした事はありません.今回は数あるデータベースのソフトウェアの中で設定などをしなくて済むSqlite3を用いて,Javaからデータベースを操作する例を書いていきます.

Javaプログラムからデータベースを操作する

 今回はSqlite3を使うのでこのサイトからダウンロードしてインストールしてください.OSごとにインストール方法が違うのですが,お手元のPCのOSに合うインストーラをダウンロードしてインストールしてください.

 JavaでSqlite3を使えるようになるためにSqlite3用のJDBCをダウンロードしておいてください.ダウンロードできるサイトはこちらになります.ちなみにJDBCというのは,Javaからデータベースに接続するためのAPIです.最新のJDBCをダウンロードした後,ダウンロードしたJDBCJavaのコードを置くディレクトリに移動またはコピーしておいてください.

 Javaのコードや後ほど作成するSQLファイル,データベースファイルを置くディレクトリについてですが,特にどのディレクトリなのか指定しません.適当な場所に作業用ディレクトリを作っておいて,そこに置くようにすると作業しやすくなると思うのでおすすめします.

 Javaからデータベースを操作する前にSqlite3のテーブルを作成します.まずは以下のSQL文が書かれたファイルを作成します.ファイル名はprofile.sqlとします.

CREATE TABLE PROFILE (id integer,first_name text,last_name text,gender text);

INSERT INTO PROFILE VALUES(10,'taro','yamada','male');
INSERT INTO PROFILE VALUES(11,'yoko','hanada','female');

そして次のコマンドを実行します.

$ sqlite3 sample.db < profile.sql

このコマンドによってsample.dbというデータベースファイル内にprofile.sqlに記述された通りにPROFILEテーブルが作成されており,2件のレコードが入っています.現時点で作業用ディレクトリは以下のようになっていると思います.

$ ls
profile.sql               sample.db                 sqlite-jdbc-3.27.2.1.jar

次にJavaからデータベースを操作するプログラムの例を示します.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;

public class UseSqlite {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            Class.forName("org.sqlite.JDBC");

            conn = DriverManager.getConnection("jdbc:sqlite:sample.db");
            String sql = "select * from PROFILE";
            pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();

            while(rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("first_name") + " " + rs.getString("last_name");
                String gender = rs.getString("gender");
                System.out.println("id: " + id + ", name: " + name + ", gender: " + gender);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if (pstmt != null) {
                    pstmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

行数は例外処理のため少し大きくなりましたが,流れはそんなに複雑ではありません.重要な部分を抜き出すとすると,以下のようになります.

Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:sample.db");
String sql = "select * from PROFILE";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();

1行目の部分でどのJDBCを使うか指定します.2行目でデータベースsample.dbに接続します.3行目ではSQL文をString型の変数sqlに格納しておき,そのSQL文を4行目で実行します.5行目で実行結果を取得します.プログラムにあるwhile文のようにする事でrsに格納された結果を取り出すことができます.

 注意すべきなのはプログラム実行時です.コンパイルはいつも通りのコマンドでいいのですが,プログラム実行時は以下のようにする必要があります.

$ java -classpath sqlite-jdbc-3.27.2.1.jar: UseSqlite

UseSqliteというのは上記のコードを私が書いた時につけたjavaコードのファイル名です.実行結果は次のようになります.

id: 10, name: taro yamada, gender: male
id: 11, name: yoko hanada, gender: female

終わりに

 今回はJavaからデータベースを操作する簡単な手順を説明しました.プログラムからデータベースを操作する際は,プログラムの内容が分かりやすくなるために色々な工夫がなされることが多いです.今回はとりあえず最低限でもプログラムからデータベースを操作するために,そういった工夫を一切せずにデータベースを操作するプログラムを例としてあげました.どのような工夫がなされるかについては他の記事で書きたいと思います.