数据库 Databases
为了使用数据库功能,请确保首先从以下URL下载jdbc files - https://codeload.github.com/clojure/java.jdbc/zip/master
您将找到一个zip文件,其中包含Clojure可以连接到数据库的必要驱动程序。 解压缩zip文件后,请确保将解压缩的位置添加到类路径中。
数据库连接的主文件是位于clojure/java中的名为jdbc.clj的文件。
clojure jdbc连接器支持各种各样的数据库,其中一些数据库如下。
- H2Database
- Oracle
- Microsoft SQL Server
- MySQL
- PostgreSQL
在我们的示例中,我们将使用MySQL DB作为示例。
关于数据库,Clojure可以进行以下操作。
数据库连接 (Database Connection)
在连接MySQL数据库之前,请确保以下内容 -
您已经创建了一个数据库TESTDB。
您已在TESTDB中创建了一个表EMPLOYEE。
此表包含FIRST_NAME,LAST_NAME,AGE,SEX和INCOME字段。
用户ID“testuser”和密码“test123”设置为访问TESTDB。
确保已下载“mysql jar文件”并将该文件添加到类路径中。
您已经通过MySQL教程来了解MySQL基础知识 。
语法 (Syntax)
以下是在Clojure中创建连接的语法。
(def connection_name {
:subprotocol “protocol_name”
:subname “Location of mysql DB”
:user “username” :password “password” })
Parameters - 'connection_name'是要为连接指定的名称。 'subprotocol'是用于连接的协议。 默认情况下,我们将使用mysql协议。 'subname'是连接到mysql数据库的URL以及数据库名称。 'user'是用于连接数据库的用户名。 'password'是用于连接数据库的密码。
Return Value - 这将提供一个连接字符串,可用于后续的mysql操作。
以下示例显示如何连接到信息架构中的表并检索表中的所有数据。
例子 (Example)
(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查询数据的语法。
语法 (Syntax)
clojure.java.jdbc/query dbconn
["query"]
:row-fn :sequence
Parameters - 'dbconn'是用于连接数据库的连接的名称。 'query'是用于从数据库中获取数据的查询字符串。 ':sequence'默认为从数据库中提取的所有数据行,并作为序列返回。 然后可以对序列进行必要的操作以查看已获取的数据。
Return Value - 这将返回一个序列,该序列将包含查询操作中的数据行。
以下示例显示如何连接到employee表并获取表中行的first_name列。
例子 (Example)
(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)))
从上面的代码中,我们可以看到
“select first_name from employee”的查询作为查询字符串传递。
:first_name是序列,它是作为获取操作的结果返回的。
如果我们假设我们的数据库中只有一行包含John的first_name值,则以下将是上述程序的输出。
(John)
插入数据
当您想要将记录创建到数据库表中时,它是必需的。 以下是使用Clojure插入数据的语法。 这是通过使用'insert!'来完成的'insert!' 功能。
语法 (Syntax)
clojure.java.jdbc/insert!
:table_name {:column_namen columnvalue}
Parameters - ':table_name'是需要进行插入的表的名称。 '{:column_namen columnvalue}'是所有列名称和值的映射,需要在表中作为一行添加。
Return Value - 如果插入成功,则返回nil。
以下示例显示如何将记录插入testdb数据库中的employee表。
例子 (Example)
(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数据库和employee表,您将看到上面的行将成功插入表中。
删除数据
可以使用'delete!'从表中'delete!' 功能。 以下是有关如何执行此操作的语法。
语法 (Syntax)
clojure.java.jdbc/delete!
:table_name [condition]
Parameters - ':table_name'是需要进行插入的表的名称。 'condition'是用于确定需要从表中删除哪一行的条件。
Return Value - 这将返回已删除的行数。
以下示例说明如何从testdb数据库中的employee表中删除记录。 该示例根据年龄等于30的条件从表中删除一行。
例子 (Example)
(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!'从表中'update!' 功能。 以下是有关如何执行此操作的语法。
语法 (Syntax)
clojure.java.jdbc/update!
:table_name
{setcondition}
[condition]
Parameters - ':table_name'是需要进行插入的表的名称。 'setcondition'是需要根据地图提到的更新的列。 'condition'是用于确定需要从表中删除哪一行的条件。
Return Value - 这将返回更新的行数。
以下示例说明如何从testdb数据库中的employee表中删除记录。 该示例根据年龄等于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。
事务 (Transactions)
事务是确保数据一致性的机制。 交易具有以下四个属性 -
Atomicity - 事务完成或根本没有任何事情发生。
Consistency - 事务必须以一致状态启动,并使系统保持一致状态。
Isolation - 在当前事务之外不可见事务的中间结果。
Durability - 提交事务后,即使系统出现故障,影响也会持续存在。
例子 (Example)
以下示例显示如何在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])))