[Clojure] clojure.java.jdbcでJDBCアクセスを行う
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を紹介しました。 なお、トランザクションの制御もマクロを使用してスマートに使用できるようになっているので、確認してみてください。