参考文章:https://en.wikibooks.org/wiki/Clojure_Programming/Examples/JDBC_Examples#Oracle
逆旅过客:http://blog.chinaunix.net/uid/298861.html
本文介绍Clojure如何使用JDBC访问Oracle数据库,我们会学习clojure.java.jdbc中的一些基本函数。
一、环境
OS: Oracle Linux Server release 6.6
Java:java version "1.7.0_79"
Lein:Leiningen 2.5.1 on Java 1.7.0_79 OpenJDK 64-Bit Server VM
Clojure:1.6.0
IDE:intellij IDEA 14.1.4
依赖软件:
- clojure.java.jdbc – 通用jdbc驱动:https://github.com/clojure/java.jdbc,最新版本:0.3.7
- 数据库连接池
一般情况下首选c3p0、dbcp,久经考验,比较成熟稳定。
- dbcp: [clojure.jdbc/clojure.jdbc-dbcp "0.3.2"]
官网:https://github.com/niwinz/clojure.jdbc-dbcp
- clojure.jdbc-c3p0 –[clojure.jdbc/clojure.jdbc-c3p0 "0.3.2"]
百度:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。 c3p0与dbcp区别: c3p0有自动回收空闲连接功能;dbcp没有自动回收空闲连接的功能; c3p0提供最大空闲时间;dbcp提供最大连接数。 c3p0当超过最大空闲连接时间时,当前连接就会被断掉;dbcp当超过最大连接数时,所有连接都会被断开 |
- com.jolbox.bonecp — 官网:http://jolbox.com/ 号称速度最快的连接池
BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 |
- oracle jdbc驱动:ojdbc7.jar,也可从下面url下载,我保存到 $HOME/repo 目录下
http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html
安装此驱动需要lein-localrepo 插件:https://github.com/kumarshantanu/lein-localrepo
- 除了oracle官网驱动外,也可以安装:[org.clojars.zentrope/ojdbc "11.2.0.3.0"]
二、创建一个project
$ lein new app jdbc-test; cd jdbc-test;lein pom
三、安装Oracle 驱动
参考文章:http://stackoverflow.com/questions/18249901/clojure-lein-cant-find-oracle-jdbc-driver
第一种方法:安装官网驱动
- 首先安装lein-localrepo 插件,有两种安装方式,我采用的第二种方式
- 作为全局插件安装,vi ~/.lein/profiles.clj (windows 下编辑 %USERPROFILE%\.lein\profiles.clj)
{:user {:plugins [[lein-localrepo "0.5.3"]]}}
- 作为project插件安装,vi jdbc-test/project.clj:
:plugins [[lein-localrepo "0.5.3"]]
运行 lein deps
- 添加本地 repo ,执行
$ cd jdbc-test;
$ lein localrepo install $HOME/repo/ojdbc7-12.1.0.2.jar oracle.jdbc/oracledriver "12.1.0.2"
以下指令可以查看localrepo
$ lein localrepo list # lists all artifacts, all versions
$ lein localrepo list -s # lists all artifacts with description
$ lein localrepo list -f # lists all artifacts and filenames
$ lein localrepo list -d # lists all artifacts with detail
- 安装 ojdbc7驱动,
$ vi jdbc-test/project.clj,添加 [oracle.jdbc/oracledriver "12.1.0.2"]
$ lein deps
第二种方法:安装 [org.clojars.zentrope/ojdbc "11.2.0.3.0"]
这种方式最简便,直接从clojars仓库就可以安装(本质上还是官网的驱动)
$ vi project.clj,添加依赖:[org.clojars.zentrope/ojdbc "11.2.0.3.0"]
$ lein deps
四、安装其他依赖软件:
修改 project.clj,添加依赖
$ vi project.clj :dependencies [[org.clojure/clojure "1.6.0"]] 修改为 :dependencies [[org.clojure/clojure "1.6.0"] [org.clojure/java.jdbc "0.3.7"] ;[com.mchange/c3p0 "0.9.5.1"] [clojure.jdbc/clojure.jdbc-c3p0 "0.3.2"] [oracle.jdbc/oracledriver "12.1.0.2"] ;[org.clojars.zentrope/ojdbc "11.2.0.3.0"] [com.jolbox/bonecp "0.8.0.RELEASE"]] $ lein deps
lein deps 会到如下网站进行搜素 https://repo1.maven.org/maven2/
手工可搜素如下网站
最终,软件会安装在如下目录 $HOME/.m2/repository/org/clojure/java.jdbc/0.3.7 $HOME/.m2/repository/clojure/jdbc/clojure.jdbc-c3p0/0.3.2/
$ lein classpath|tr ':' '\n' #查看下依赖路径 |
五、连接数据库
$ cd jdbc-test;vi src/jdbc_test/core.clj
|
$ lein run
六、复用数据库连接
参考文章:http://clojure-doc.org/articles/ecosystem/java_jdbc/home.html
我们不希望每次进行数据库操作都创建一个新的连接,因此需要对连接进行复用,有如下两种方案:
- 使用 with-db-connection 进行分组操作,这是一个宏,大致用法如下:
(ns dbexample |
- 数据库连接池:使用C3P0或BoneCP等,见下一节
七、使用DBCP连接池
参考:https://github.com/niwinz/clojure.jdbc-dbcp
$ vi project.clj,添加依赖:
[clojure.jdbc/clojure.jdbc-dbcp "0.3.2"]
$ vi jdbc-test/core.clj
|
八、使用C3P0连接池
参考:http://clojure-doc.org/articles/ecosystem/java_jdbc/connection_pooling.html
需要软件
C3P0: https://github.com/samphilipd/clojure.jdbc-c3p0
SLF4J:http://www.slf4j.org/download.html,version:1.7.12,用于日志记录,我们使用clojars.org网站提供的封装
$ vi project.clj,添加依赖:
[clojure.jdbc/clojure.jdbc-c3p0 "0.3.2"]
[com.revelytix.logbacks/slf4j-log4j12 "1.0.0"]
第一种方式:
$ vi jdbc-test/core.clj
|
第二种方式:
$ vi jdbc-test/core.clj
|
九、使用BoneCP连接池
略...
十、常用jdbc操作
java.jdbc API Reference http://clojure.github.io/java.jdbc/#clojure.java.jdbc/create-table-ddl
- DDl
create-table-ddl
drop-table-ddl
do-command
execute!
- DML
十一、HoneySQL
官网:https://github.com/jkk/honeysql
安装:[honeysql "0.6.1"]
使用:(require '[honeysql.core :as sql] '[honeysql.helpers :refer
:all])
参考资料:
Leiningen教程中文版 http://wiki.fnil.net/index.php?title=Leiningen_tutorial%E4%B8%AD%E6%96%87%E7%89%88