
- 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 - StructMaps
- 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 資料庫
- Oracle
- Microsoft SQL Server
- MySQL
- PostgreSQL
在我們的示例中,我們將使用 MySQL 資料庫作為示例。
在 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”是要賦予連線的名稱。“subprotocol”是用於連線的協議。預設情況下,我們將使用 mysql 協議。“subname”是要連線到的 mysql 資料庫的 url,以及資料庫名稱。“user”是用於連線到資料庫的使用者名稱。“password”是用於連線到資料庫的密碼。
返回值 - 這將提供一個連線字串,可在後續的 mysql 操作中使用。
以下示例演示如何連線到 information_schema 中的表並檢索表中的所有資料。
示例
(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”預設情況下是所有從資料庫中獲取的資料行,並作為序列返回。然後可以對序列執行必要的運算以檢視已獲取的資料。
返回值 - 這將返回一個序列,其中包含查詢操作的資料行。
以下示例演示如何連線到 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)))
從上面的程式碼中,我們可以看到
“select first_name from employee”查詢作為查詢字串傳遞。
“:first_name”是作為獲取操作的結果返回的序列。
如果我們假設我們的資料庫中只有一行包含 first_name 值為 John,則上述程式的輸出如下。
(John)
插入資料
當您想將記錄建立到資料庫表中時,需要這樣做。以下是使用 Clojure 插入資料的語法。這是透過使用‘insert!’函式完成的。
語法
clojure.java.jdbc/insert! :table_name {:column_namen columnvalue}
引數 - “:table_name”是要進行插入操作的表的名稱。“{:column_namen columnvalue}”是所有列名和值的對映,需要將其作為一行新增到表中。
返回值 - 如果插入成功,則返回 nil。
以下示例演示如何將記錄插入 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 "shakinstev"}) (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 "shakinstev"}) (println (sql/delete! mysql-db :employee ["age = ? " 30])))
如果您有一條年齡等於 30 的記錄,則該行將被刪除。
更新資料
可以使用‘update!’函式更新表中的行。以下是執行此操作的語法。
語法
clojure.java.jdbc/update! :table_name {setcondition} [condition]
引數 - “:table_name”是要進行更新操作的表的名稱。“setcondition”是要更新的列,以對映的形式提及。“condition”是用於確定要從表中刪除哪一行的條件。
返回值 - 這將返回已更新的行數。
以下示例演示如何從 testdb 資料庫的 employee 表中刪除記錄。該示例根據年齡等於 30 的條件更新表中的一行,並將 income 的值更新為 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 的記錄,則該行的 income 值將被設定為 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 "shakinstev"}) (sql/with-db-transaction [t-con mysql-db] (sql/update! t-con :employee {:income 40} ["age = ? " 30])))