Clojure - 数据库

Clojure - 数据库 首页 / Clojure入门教程 / Clojure - 数据库

为了使用数据库函数,请确保首先从以下网址下载 jdbc文件 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为示例

数据库连接

连接到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])))

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

邱岳的产品手记 -〔邱岳〕

技术管理实战36讲 -〔刘建国〕

从0开始学微服务 -〔胡忠想〕

数据结构与算法之美 -〔王争〕

玩转Spring全家桶 -〔丁雪丰〕

Java性能调优实战 -〔刘超〕

TensorFlow 2项目进阶实战 -〔彭靖田〕

遗留系统现代化实战 -〔姚琪琳〕

工程师个人发展指南 -〔李云〕

好记忆不如烂笔头。留下您的足迹吧 :)