Clojure - 数据库

为了使用数据库功能,请确保首先从以下网址下载 jdbc 文件l − https://codeload.github.com/clojure/java.jdbc/zip/master

您将找到一个 zip 文件,其中包含 Clojure 连接数据库所需的驱动程序。 解压缩 zip 文件后,请确保将解压缩的位置添加到类路径中。

用于数据库连接的主文件是一个名为 jdbc.clj 的文件,位于 clojure/java 位置。

clojure jdbc 连接器支持多种数据库,其中一些数据库如下。

  • H2Database
  • Oracle
  • Microsoft SQL Server
  • 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"是为连接指定的名称。 "subprotocol"是用于连接的协议。 默认情况下我们将使用 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 插入数据的语法。 这是通过使用'insert!'函数来完成的。

语法

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。

交易

事务是确保数据一致性的机制。 交易具有以下四个属性 −

  • 原子性 − 要么事务完成,要么什么都不发生。

  • 一致性 − 事务必须以一致状态开始并使系统保持一致状态。

  • 隔离 − 事务的中间结果在当前事务之外不可见。

  • 耐用性 − 一旦事务被提交,其影响就会持续存在,即使在系统出现故障后也是如此。

示例

以下示例展示了如何在 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])))