为了使用数据库函数,请确保首先从以下网址下载 jdbc文件 https://codeload.github.com/clojure/java.jdbc/zip/master
您会找到一个zip文件,其中包含Clojure具备连接数据库的必要驱动程序,解压缩zip文件后,请确保将解压缩的位置添加到您的类路径中。
数据库连接的主要文件是位于clojure/ java 位置的名为 jdbc.clj 的文件。
clojure jdbc连接器支持各种数据库,以下是其中一些。
在我们的示例中,我们将以MySQL DB为示例。
连接到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 - 是要赋予连接的名称。
subprotocol - 是用于连接的协议。默认情况下,我们将使用mysql协议。
subname - 是与数据库名称一起连接到mysql db的URL。
user - 是用于连接数据库的用户名。
password - 是用于连接数据库的密码。
以下示例显示如何连接到信息模式中的表并检索表中的所有数据。
(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 "learnfk.com"}) (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"是从数据库中提取的所有数据行,并作为序列返回。然后可以对序列进行必要的操作,以查看已获取的数据。
下面的示例显示如何连接到employee表并获取表中行的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)))
从上面的代码,我们可以看到
链接:https://www.learnfk.comhttps://www.learnfk.com/clojure/clojure-databases.html
来源:LearnFk无涯教程网
"select first_name from employee"的查询作为查询字符串传递。
:first_name是序列,它是通过提取操作返回的。
如果我们假设数据库中只有一行包含John的first_name值,则将是上述程序的输出。
(John)
要在数据库表中创建记录时需要它,以下是使用Clojure可以插入数据的语法,这是通过使用"insert!" 函数完成的。
clojure.java.jdbc/insert! :table_name {:column_namen columnvalue}
:table_name - 是需要在其中插入表的名称。
{:column_namen columnvalue} - 是所有列名称和值的映射,需要将它们作为表格的一行添加。
下面的示例显示如何将记录插入到testdb数据库的employee表中。
(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 "learnfk.com"}) (sql/insert! mysql-db :employee {:first_name "John" :last_name "Mark" :sex "M" :age 30 :income 30}))
如果现在检查您的MySQL数据库和employee表,您将看到上面的行将成功插入到表中。
可以使用"delete!" 函数从表中删除行,以下是有关如何执行此操作的语法。
clojure.java.jdbc/delete! :table_name [condition]
:table_name - 是需要在其中插入表的名称。
condition - 是用于确定需要从表中删除哪一行的条件。
返回删除的行数。
下面的示例显示如何从testdb数据库中的employee表中删除记录,该示例根据年龄等于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 "learnfk.com"}) (println (sql/delete! mysql-db :employee ["age=? " 30])))
如果您有一条记录,其行的年龄等于30,则该行将被删除。
可以使用"update!" 函数从表中更新行,以下是有关如何执行此操作的语法。
clojure.java.jdbc/update! :table_name {setcondition} [condition]
:table_name - 是需要在其中插入表的名称。
setcondition - 是需要更新的列(如Map所示)。
condition - 是用于确定需要从表中删除哪一行的条件。
返回更新的行数。
下面的示例显示如何从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 "learnfk.com"}) (println (sql/update! mysql-db :employee {:income 40} ["age=? " 30])))
如果您有一条记录,其行的年龄等于30,则该行将被更新,其中收入值将设置为40。
事务是确保数据一致性的机制。 事务具有以下四个属性-
原子性 - 要么交易完成,要么什么都没有发生。
一致性 - 事务必须以一致的状态开始并使系统保持一致的状态。
隔离性 - 交易的中间输出在当前交易之外不可见。
持久性 - 提交事务后,即使在系统出现故障后,影响也将持久存在。
以下示例显示了如何在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 "learnfk.com"}) (sql/with-db-transaction [t-con mysql-db] (sql/update! t-con :employee {:income 40} ["age=? " 30])))
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)