clojure.java.jdbc とは
clojure.java.jdbcは名前の通り、JDBCをclojureから使いやすくするためのライブラリです。
がんばってごりごり書かなければならないところを隠ぺいしてくれます。
Install
leiningenを使用しているならば:dependencies
に[org.clojure/java.jdbc "0.3.6"]
追加するだけです。
project.clj
(defproject sample-project "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.6.0"]
[org.clojure/java.jdbc "0.3.6"]])
Example
require
してdb-spec
を書きます。
db-spec
はコネクションを作成するためのものでいろいろな書き方ができます(後述)
(ns clojurejdbcsample.core
(:require [clojure.java.jdbc :as sql]))
(def db-spec {:subprotocol "sqlite"
:subname "target/test_db.sqlite"})
DMLのサンプル
(defn sample-dml []
;; 次のINSERT文と同じ意味合い
;; INSERT INTO languages VALUES
;; (1 ,"clojure"),
;; (2 ,"scala"),
;; (3 ,"ruby);
(sql/insert! db-spec :languages nil
[1 "clojure"]
[2 "scala"]
[3 "ruby"])
;; 次のDELETE文と同じ意味合い
;; DELETE FROM languages WHERE langid = 1;
(sql/delete! db-spec :languages ["langid = ?" 1])
;; 次のUPDATE文と同じ意味合い
;; UPDATE languages SET
;; name = "RUBY"
;; WHERE langid = 3
(sql/update! db-spec :languages {:name "RUBY"} ["langid = ?" 3])
;; SELECT結果はmapのvectorとして返る
(sql/query db-spec
["SELECT * FROM languages WHERE langid = ?" 2])
;; => [{:langid 2 :name "scala"}]
)
db-specの書き方
以下が参考になります
http://clojure.github.io/java.jdbc/#clojure.java.jdbc/get-connection
https://github.com/clojure/java.jdbc/blob/master/src/test/clojure/clojure/java/test_jdbc.clj
Oracleにつなぐ場合の注意点
OracleのJdbcドライバにはリポジトリがないため、ローカルのMavenリポジトリを作る、:resource-path
に追加する実行時にクラスパスに追加する
等の対策が必要。