[Clojure] clojure.java.jdbcでJDBCアクセスを行う

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

clojureでJDBCアクセス

今回紹介するclojure.java.jdbcとは、以前clojure.contrib.sqlと呼ばれていたライブラリで、
DBへ対してJDBCアクセスするためのClojureラッパーです。
今回はこのライブラリを使用して、MySQLにアクセスしてみましょう。
他の記事に比べて圧倒的に人気のないClojure記事ですが、がんばっていきます。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Clojure : 1.5.1
  • Leiningen : 2.1.2
  • MySQL : 5.5.15

今回はDBにMySQLを使用しました。
サンプル用DB、mydbを作成し、シンプルなUserテーブルを作成しましょう。
mysqlのコンソールで下記SQLを実行します。

mysql > create database mydb;
mysql > use mydb;
mysql > CREATE TABLE User (
    id int(11) NOT NULL AUTO_INCREMENT,
    name varchar(255) DEFAULT NULL,PRIMARY KEY (`id`));

DBができました。次はleiningenでClojure用プロジェクトを作成します。

clojure.java.jdbcでDBアクセス

まずはleiningenでbasicテンプレートを使用し、プロジェクトを作成します。

% lein new basic jdbc

 

次に依存するライブラリをjdbc/project.cljに記述しましょう。下記のように修正してください。
clojure.java.jdbcとMySQL用JDBCドライバを追加しています。

(defproject jdbc "HEAD"
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [org.clojure/java.jdbc "0.3.0-alpha1"]
                 [mysql/mysql-connector-java "5.1.6"]]
  :main jdbc.main)

project.cljを記述したらlein depsで依存ライブラリを取得しておきます。

% lein deps

次はsrc/jdbc/main.cljに、clojure.java.jdbcを使用するサンプルプログラムを記述しましょう。
まずは必要なクラスをrequireし、DB用オブジェクトを定義します。
:userと:passwordは、各々の環境のユーザー名、パスワードを設定しましょう。

(ns jdbc.main
(:require [clojure.java.jdbc :as j]
          [clojure.java.jdbc.sql :as s]))

;DBオブジェクトの定義
(def mysql-db {:subprotocol "mysql"
               :subname "//127.0.0.1:3306/mydb"
               :user "<username>"
               :password "<password>"})

最初は、insert用関数を定義します。insert!を使用すれば、データを登録することができる高レベルAPIです。
複数レコードを一括で登録することができます。

(defn insert []
  (j/insert!
    mysql-db
    :User
    {:name "taro"}
    {:name "hanako"}
    {:name "mike"}))

次はupdate用関数を定義します。update!関数を使用すればOKです。
更新するカラムとwhere条件を指定しています。

(defn update []
  (j/update!
    mysql-db
    :User
    {:name "update-hanako"}
   ["name=?" "hanako"]))

次はselect関数を定義します。最初はselect関数で、取得するカラム、テーブル、条件を指定しています。

(defn select[]
  (j/query mysql-db
  (s/select * :User (s/where {:name "taro"}))))

もう1つのselect関数では、queryという関数を使用し、SQLを直接指定しています。
:row-fnは取得した1行ごとに実行する関数ですね。

(defn query[]
  (j/query mysql-db
    [(str "SELECT id, name "
          "FROM User ")]
    :row-fn println))

最後に、上記関数たちを順番に使用するための記述です。
最初にデータのinsert、次にupdate、そしてqueryとselectで取得して結果を表示しています。

(defn -main [& args]
  (println "-- insert date --")
  (insert)
  (println "-- update date --")
  (update)
  (println "-- select all(query) --")
  (query)
  (println "-- select where --")
  (select))

lein runコマンドで、main.cljを実行してみましょう。
データの更新と取得ができています。

% lein run
-- insert date --
-- update date --
-- select all(query) --
{:name taro, :id 218}
{:name update-hanako, :id 219}
{:name mike, :id 220}
-- select where --
({:name "taro", :id 218})

まとめ

今回はclojureでJDBCプログラムを行うためのライブラリ、clojure.java.jdbcを紹介しました。
なお、トランザクションの制御もマクロを使用してスマートに使用できるようになっているので、確認してみてください。

参考サイトなど