為了使用數(shù)據(jù)庫的功能,請確保首先從以下網(wǎng)址下載JDBC文件 - https://codeload.github.com/clojure/java.jdbc/zip/master
你會發(fā)現(xiàn)一個zip文件,它有必要的驅(qū)動程序,Clojure有能力連接到數(shù)據(jù)庫。 提取zip文件后,請確保將解壓縮的位置添加到類路徑中。
數(shù)據(jù)庫連接的主文件是位于clojure / java中的名為jdbc.clj的文件。
clojure jdbc連接器支持各種各樣的數(shù)據(jù)庫,其中一些如下。
在我們的示例中,我們將使用MySQL DB作為示例。
在Clojure中有關(guān)數(shù)據(jù)庫的以下操作是可能的。
在連接到MySQL數(shù)據(jù)庫之前,請確保以下內(nèi)容
以下是在Clojure中創(chuàng)建連接的語法。
(def connection_name { :subprotocol “protocol_name” :subname “Location of mysql DB” :user “username” :password “password” })
參數(shù) - 'connection_name'是要給連接的名稱。 'subprotocol'是用于連接的協(xié)議。 默認情況下我們將使用mysql協(xié)議。 'subname'是連接到mysql數(shù)據(jù)庫的URL以及數(shù)據(jù)庫名稱。 'user'是用于連接到數(shù)據(jù)庫的用戶名。 'password'是用于連接到數(shù)據(jù)庫的密碼。
返回值 -這將提供一個連接字符串,可以在后續(xù)的mysql操作中使用。
以下示例顯示如何連接到信息模式中的表并檢索表中的所有數(shù)據(jù)。
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "http://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)))
在任何數(shù)據(jù)庫上查詢數(shù)據(jù)意味著從數(shù)據(jù)庫獲取一些有用的信息。 一旦建立了數(shù)據(jù)庫連接,就可以對該數(shù)據(jù)庫進行查詢。
以下是使用Clojure查詢數(shù)據(jù)的語法。
clojure.java.jdbc/query dbconn ["query"] :row-fn :sequence
參數(shù) -'dbconn'是用于連接到數(shù)據(jù)庫的連接的名稱。 'query'是用于從數(shù)據(jù)庫提取數(shù)據(jù)的查詢字符串。 ':sequence'默認情況下從數(shù)據(jù)庫獲取的所有數(shù)據(jù)行,并作為序列返回。 然后可以對序列執(zhí)行必要的操作,以查看已提取了哪些數(shù)據(jù)。
返回值 -這將返回一個序列,它將具有來自查詢操作的數(shù)據(jù)行。
以下示例顯示如何連接到employee表并獲取表中行的first_name列。
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "http://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是作為fetch操作結(jié)果返回的序列。
如果我們假設(shè)在我們的數(shù)據(jù)庫中只有一行包含first_name值為John,則以下將是上述程序的輸出。
(John)
當您要將記錄創(chuàng)建到數(shù)據(jù)庫表中時需要。 以下是使用Clojure可以插入數(shù)據(jù)的語法。 這是通過使用'insert!'函數(shù)完成的。
clojure.java.jdbc/insert! :table_name {:column_namen columnvalue}
參數(shù) - ':table_name'是需要插入的表的名稱。 '{:column_namen columnvalue}'是所有列名稱和值的映射,需要在表中作為一行添加。
返回值 -如果插入成功,這將返回nil。
以下示例顯示如何將記錄插入到testdb數(shù)據(jù)庫中的employee表中。
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "http://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}))
如果現(xiàn)在檢查MySQL數(shù)據(jù)庫和employee表,您將看到上面的行將成功插入表中。
可以使用'delete!'函數(shù)從表中刪除行。 以下是如何執(zhí)行此操作的語法。
clojure.java.jdbc/delete! :table_name [condition]
參數(shù) -':table_name'是需要插入的表的名稱。 'condition'是用于確定需要從表中刪除哪一行的條件。
返回值 -這將返回刪除的行數(shù)。
以下示例顯示如何從testdb數(shù)據(jù)庫中的employee表中刪除記錄。 示例根據(jù)年齡等于30的條件從表中刪除一行。
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "http://127.0.0.1:3306/testdb" :user "root" :password "shakinstev"}) (println (sql/delete! mysql-db :employee ["age = ? " 30])))
如果您有一條記錄包含年齡等于30的行,則該行將被刪除。
可以使用'update!'函數(shù)從表中更新行。 以下是如何執(zhí)行此操作的語法。
clojure.java.jdbc/update! :table_name {setcondition} [condition]
參數(shù) - ':table_name'是需要插入的表的名稱。 'setcondition'是需要根據(jù)映射提到的更新的列。 'condition'是用于確定需要從表中刪除哪一行的條件。
返回值 -這將返回更新的行數(shù)。
以下示例顯示如何從testdb數(shù)據(jù)庫中的employee表中刪除記錄。 該示例根據(jù)年齡等于30的條件更新表中的行,并將收入值更新為40。
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "http://127.0.0.1:3306/testdb" :user "root" :password "shakinstev"}) (println (sql/update! mysql-db :employee {:income 40} ["age = ? " 30])))
如果您有一條記錄,其中的行的年齡等于值30,那行將被更新,其中收入的值將設(shè)置為40。
事務是確保數(shù)據(jù)一致性的機制。 事務具有以下四個屬性
原子性 -事務完成或根本沒有任何事情發(fā)生。
一致性 -事務必須以一致的狀態(tài)開始,并使系統(tǒng)保持一致狀態(tài)。
隔離性 -事務的中間結(jié)果在當前事務外部不可見。
耐用性 -一旦事務提交,即使在系統(tǒng)故障后,影響仍然是持久的。
以下示例顯示如何在Clojure中實現(xiàn)事務。 任何需要在事務中執(zhí)行的操作都需要嵌入到'with-dbtransaction'子句中。
(ns test.core (:require [clojure.java.jdbc :as sql])) (defn -main [] (def mysql-db { :subprotocol "mysql" :subname "http://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])))
更多建議: