この記事は公開されてから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を紹介しました。 なお、トランザクションの制御もマクロを使用してスマートに使用できるようになっているので、確認してみてください。