- Clojure 教程
- Clojure - 主页
- Clojure - 概述
- Clojure - 环境
- Clojure - 基本语法
- Clojure-REPL
- Clojure - 数据类型
- Clojure - 变量
- Clojure - 运算符
- Clojure - 循环
- Clojure - 决策
- Clojure - 函数
- Clojure - 数字
- Clojure - 递归
- Clojure - 文件 I/O
- Clojure - 字符串
- Clojure - 列表
- Clojure - 集
- Clojure - 向量
- Clojure - 地图
- Clojure - 命名空间
- Clojure - 异常处理
- Clojure - 序列
- Clojure - 正则表达式
- Clojure - 谓词
- Clojure - 解构
- Clojure - 日期和时间
- Clojure - 原子
- Clojure - 元数据
- Clojure - 结构映射
- Clojure - 代理
- Clojure - 观察者
- Clojure - 宏
- Clojure - 参考值
- Clojure - 数据库
- Clojure - Java 接口
- Clojure - 并发编程
- Clojure - 应用程序
- Clojure - 自动化测试
- Clojure - 库
- Clojure 有用资源
- Clojure - 快速指南
- Clojure - 有用的资源
- Clojure - 讨论
Clojure - 数据库
为了使用数据库功能,请确保首先从以下网址下载jdbc 文件- https://codeload.github.com/clojure/java.jdbc/zip/master
您将找到一个 zip 文件,其中包含 Clojure 连接数据库所需的驱动程序。解压缩 zip 文件后,请确保将解压缩的位置添加到类路径中。
数据库连接的主文件是位于 clojure/java 位置的名为jdbc.clj的文件。
clojure jdbc 连接器支持多种数据库,其中一些数据库如下。
- H2数据库
- 甲骨文
- 微软SQL服务器
- MySQL
- PostgreSQL
在我们的示例中,我们将使用 MySQL DB 作为示例。
Clojure 中可以对数据库进行以下操作。
数据库连接
在连接到 MySQL 数据库之前,请确保以下事项 -
您已经创建了一个数据库 TESTDB。
您已在 TESTDB 中创建了一个表 EMPLOYEE。
该表包含字段 FIRST_NAME、LAST_NAME、AGE、SEX 和 INCOME。
设置用户ID“testuser”和密码“test123”来访问TESTDB。
确保您已下载“mysql jar 文件”并将该文件添加到类路径中。
您已完成 MySQL 教程以了解MySQL 基础知识。
句法
以下是在 Clojure 中创建连接的语法。
(def connection_name { :subprotocol “protocol_name” :subname “Location of mysql DB” :user “username” :password “password” })
参数- 'connection_name' 是为连接指定的名称。“子协议”是用于连接的协议。默认情况下我们将使用 mysql 协议。'subname' 是连接到 mysql 数据库的 url 以及数据库名称。'user' 是用于连接数据库的用户名。'password' 是用于连接数据库的密码。
返回值- 这将提供一个连接字符串,可在后续 mysql 操作中使用。
以下示例演示如何连接到信息模式中的表并检索表中的所有数据。
例子
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "//127.0.0.1:3306/information_schema" :user "root" :password "shakinstev"}) (println (sql/query mysql-db ["select table_name from tables"] :row-fn :table_name)))
查询数据
查询任何数据库上的数据意味着从数据库中获取一些有用的信息。建立数据库连接后,您就可以对该数据库进行查询。以下是使用 Clojure 查询数据的语法。
句法
clojure.java.jdbc/query dbconn ["query"] :row-fn :sequence
参数- 'dbconn' 是用于连接到数据库的连接的名称。'query' 是用于从数据库获取数据的查询字符串。':sequence' 默认情况下是从数据库获取的所有数据行,并作为序列返回。然后可以对序列进行必要的操作以查看已获取哪些数据。
返回值- 这将返回一个序列,其中包含查询操作中的数据行。
以下示例演示如何连接到员工表并获取表中行的first_name 列。
例子
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "//127.0.0.1:3306/testdb" :user "root" :password "shakinstev"}) (println (sql/query mysql-db ["select first_name from employee"] :row-fn :first_name)))
从上面的代码我们可以看出
“selectfirst_namefromemployee”的查询作为查询字符串传递。
:first_name 是序列,作为获取操作的结果返回。
如果我们假设数据库中只有一行包含 John 的first_name 值,以下将是上述程序的输出。
(John)
插入数据
当您想要将记录创建到数据库表中时,这是必需的。以下是使用 Clojure 插入数据的语法。这是通过使用“插入!”来完成的。功能。
句法
clojure.java.jdbc/insert! :table_name {:column_namen columnvalue}
参数- ':table_name' 是需要插入的表的名称。'{:column_namen columnvalue }' 是所有列名称和值的映射,需要将其添加为表中的一行。
返回值- 如果插入成功,将返回 nil。
以下示例显示如何将记录插入到 testdb 数据库中的员工表中。
例子
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "//127.0.0.1:3306/testdb" :user "root" :password "shakinstev"}) (sql/insert! mysql-db :employee {:first_name "John" :last_name "Mark" :sex "M" :age 30 :income 30}))
如果您现在检查 MySQL 数据库和员工表,您将看到上面的行将成功插入到表中。
删除数据
可以使用“delete!”从表中删除行。功能。以下是有关如何执行此操作的语法。
句法
clojure.java.jdbc/delete! :table_name [condition]
参数- ':table_name' 是需要插入的表的名称。'condition' 是用于确定需要从表中删除哪一行的条件。
返回值- 这将返回删除的行数。
以下示例显示如何从 testdb 数据库中的员工表中删除一条记录。该示例根据年龄等于 30 的条件从表中删除一行。
例子
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "//127.0.0.1:3306/testdb" :user "root" :password "shakinstev"}) (println (sql/delete! mysql-db :employee ["age = ? " 30])))
如果您有一条记录,其中一行的年龄等于 30,则该行将被删除。
更新数据
可以使用“update!”从表中更新行。功能。以下是有关如何执行此操作的语法。
句法
clojure.java.jdbc/update! :table_name {setcondition} [condition]
参数- ':table_name' 是需要插入的表的名称。“setcondition”是需要更新的列,如地图中所述。'condition' 是用于确定需要从表中删除哪一行的条件。
返回值- 这将返回更新的行数。
以下示例显示如何从 testdb 数据库中的员工表中删除一条记录。该示例根据年龄等于 30 岁的条件更新表中的一行,并将收入值更新为 40。
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "//127.0.0.1:3306/testdb" :user "root" :password "shakinstev"}) (println (sql/update! mysql-db :employee {:income 40} ["age = ? " 30])))
如果您有一条记录,其中一行的年龄值等于 30,则该行将被更新,其中收入值将设置为 40。
交易
事务是确保数据一致性的机制。交易具有以下四个属性 -
Atomics性- 事务要么完成,要么什么也没有发生。
一致性- 事务必须以一致的状态开始并使系统处于一致的状态。
隔离- 事务的中间结果在当前事务之外不可见。
持久性- 一旦事务被提交,即使在系统发生故障之后,其影响也是持久的。
例子
以下示例展示了如何在 Clojure 中实现事务。需要在事务中执行的任何操作都需要嵌入“with-dbtransaction”子句中。
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "//127.0.0.1:3306/testdb" :user "root" :password "shakinstev"}) (sql/with-db-transaction [t-con mysql-db] (sql/update! t-con :employee {:income 40} ["age = ? " 30])))