Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Clojure 学习入门(7)—— 连接mysql

Clojure 学习入门(7)—— 连接mysql

作者头像
阳光岛主
发布于 2019-02-18 07:46:28
发布于 2019-02-18 07:46:28
1.2K00
代码可运行
举报
文章被收录于专栏:米扑专栏米扑专栏
运行总次数:0
代码可运行

Clojure的contrib包中实现了对现有JDBC的封装,在wiki上有连接,该页面上包含了对不同的数据库的连接方法和基本的操作,但是这个页面上没有提供足够的信息,足够一个初学者能够使用Clojure来完成一个SQL操作。本文中我们将利用Clojure和Lein工具,简介一下做开发的基础。当然网上也有非常多对Clojure的SQL操作进行封装的库,我们这里没有使用。

首先,配置你的MySQL数据库,创建数据库、表、数据。

其次,在和MySQL的操作中,我们需要两个库,一个是clojure.contrib,另外一个是mysql-connector-java-xxx.jar。为了管理和配置这两个库,我们需要配置一下project.clj文件,在depedencies中加上两条:org.clojure/clojure-contrib “1.2.0” 和 mysql/mysql-connector-java “5.1.6”。这样运行 lein deps,就会自动下载并且安装到Leiningen dependencies lib目录下。

接着,在需要使用sql库的地方要导入这些库

在ns宏中加载如下内容:(:use [clojure.contrib.sql :as sql :only ()]),这样在本文件中就可以直接使用sql作为前缀。需要主意的是,虽然我们并没有直接使用到mysql-connector-java,但是如果在lib目录下没有该文件,就会报错没有mysql的driver。

配置上两条之后,就可以进行sql连接了。

首先要定义一个database specification,这是一个map,几个必须配置的key包括了:classname, subprotocol, subname, user, password。

(def db {:classname "com.mysql.jdbc.Driver"             :subprotocol "mysql"             :subname "//127.0.0.1:3306/test"             :user "root"             :password "pass"})

这个db-spec在后面几乎所有的sql操作都是需要的。

接下来我们主要描述几个常用API的格式,具体的内容可以参考手册。

1,新建表

sql/create-table :table-name [:key :type “”] [:key :type “”])

(defn create-users []    (sql/create-table     :user     [:id :integer "PRIMARY KEY" "AUTO_INCREMENT"]     [:fname "varchar(25)"]))

2, 插入数据

两个api,一个是insert-rows,一个是insert-values。insert-rows需要形成一个完整的行数据插入到表中,insert-values可以按照key来插入值。

(defn insert-user [fname]    (sql/insert-values :users [:fname] [fname]))

使用insert-values可以利用primary-key的auto_increment的属性

(defn insert-rows   []   (sql/insert-rows :user [1 "Tim"] [2 "Tom"]))

3,丢弃表

(defn drop-user  []  (try    (sql/drop-table :fruit)    (catch Exception _)))

4, with-query-results 选择查询的数据

with-query-results 类似于 let 语句,会将查询结果绑定到rs上,rs是一个map构成的sequence。

(sql/with-query-results rs ["select * from user"]   (dorun (map #(println %) rs)))

5, 更新表

update-values 用来更新表的内容,使用该函数需要指定查询条件,如下图所示

(defn update-user [id attribute-map]    (sql/update-values :user ["id=?" id] attribute-map))

6, 删除行

(sql/delete-rows :user ["id=?" id])

7,SQL准备

clojure支持由用户输入构造sql语句,利用的是sql prepared语句,略

8. 示例

创建表 fruit,并插入两条记录,然后条件查询和全部查询 

1) 在project.clj 中,添加sql依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(defproject myClojure "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [
                 [org.clojure/clojure "1.5.1"]
                 [org.clojure/java.jdbc "0.0.6"]
                 [org.clojure/clojure-contrib "1.2.0"]
                 [mysql/mysql-connector-java "5.1.26"]
                 ])

2) mysql.cli 代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
; clojure connect to mysql
; ithomer.net
; 2013.12.10

(ns myClojure.mysql2
  (:require [clojure.java.jdbc :as sql]))

; 配置参数
(def mysql-db{
               :classname "com.mysql.jdbc.Driver"
               :subprotocol "mysql"
               :subname "//172.27.9.104:3306/tmptest"
               :user "root"
               :password "server2011"})

; 创建表
(defn create-fruit
  "Create a table" 
  []
   (sql/create-table
     :fruit
     [:name "varchar(32)" "PRIMARY KEY"]
     [:appearance "varchar(32)"]
     [:cost :int]
     [:grade :real]))

; 删除表
(defn drop-fruit
  "Drop a table" 
  []
  (try
    (sql/drop-table :fruit)
    (catch Exception _)))

; 连接数据库
(sql/with-connection
  mysql-db
  (drop-fruit)
  (create-fruit))

; 插入数据
(sql/with-connection mysql-db
  (sql/insert-records :fruit
                      {:name "Apple" :appearance "rosy" :cost 24 :grade 1.2}
                      {:name "Orange" :appearance "round" :cost 49}))

; 条件查询
(println (sql/with-connection mysql-db
           (sql/with-query-results rows
             ["SELECT * FROM fruit WHERE appearance = ?" "rosy"]
             (:cost (first rows)))))

; 全量查询
(println (sql/with-connection mysql-db
           (sql/with-query-results rows
             ["SELECT * FROM fruit"]
             (dorun (map #(println %) rows)))))

运行结果:

24 {:name Apple, :appearance rosy, :cost 24, :grade 1.2} {:name Orange, :appearance round, :cost 49, :grade nil} nil

创建的数据库表内容:

注:所有的sql操作都需要在with-connection宏下包裹着

参考推荐:

Clojure SQL 基础

Clojure 连接mysql

Connecting Clojure and MySQL

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013年12月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Clojure 学习入门(9)—— 连接redis
project.cli 添加redis依赖: [clj-redis "0.0.12"]
阳光岛主
2019/02/18
7740
Clojure 学习入门(9)—— 连接redis
Clojure 学习入门(8)—— 连接mongodb
project.clj 文件添加monger依赖: [com.novemberain/monger "1.5.0"]
阳光岛主
2019/02/18
1.1K0
Clojure 学习入门(8)—— 连接mongodb
Mysql介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。 MySQL使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。 提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。 MySQL 是开源的,所以不需要支付费用。 原生JSON支持(5.7 新增) 企业级的应用支持。
全栈程序员站长
2022/08/04
6380
Mysql介绍
MySQL数据库入门——备份数据库
一提到数据,大家神经都会很紧张,数据的类型有很多种,但是总归一点,数据很重要,非常重要,因此,日常的数据备份工作就成了运维工作的重点中的重点的重点.................
民工哥
2020/09/16
7720
Python数据库操作 初识mysql和mysql基本操作#学习猿地
Welcome to the MySQL monitor.  Commands end with ; or \g.
学习猿地
2020/03/20
3850
MySQL学习小结
MySQL学习小结 一、数据库:存储、维护和管理数据的集合。 DB、DBMS 二、SQL:结构化查询语言 SQL的分类 (1) DDL:数据定义语言,定义数据库对象,对对象进行操作的。 create alter drop (2) DML:数据管理语言,对数据库表中的数据进行操作的。 insert update delete (3) DQL:数据查询语言,对数据进行查
黑泽君
2018/10/11
5430
① MyBatis使用入门,解决IDEA中Mapper映射文件警告。
.29.
2024/03/13
5370
① MyBatis使用入门,解决IDEA中Mapper映射文件警告。
数据库MySQL学习——内含34道MySQL练习题及答案
DML(数据操作语言):insert delete update,对表中数据进行增删改
全栈程序员站长
2022/09/30
3.4K0
JDBC 详解
JDBC(Java Database Connectivety),主要是用来连接数和操作数据库的API,本片文章基于JDBC4.2。
代码拾遗
2018/07/24
6530
快速学习-Flume高级之自定义MySQLSource
Source是负责接收数据到Flume Agent的组件。Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy。官方提供的source类型已经很多,但是有时候并不能满足实际开发当中的需求,此时我们就需要根据实际需求自定义某些Source。
cwl_java
2020/02/19
9360
MySQL数据库入门
后台 (连接点:连接数据库JDBC,链接前端(控制,控制视图跳转,和给前端传递数据))
落寞的鱼丶
2022/02/21
6300
Clojure 学习入门(11)—— 宏 macro
clojure macro宏在运行之前机械展开,定义宏相当于给语言增加新特性,写宏的*原则*: 
阳光岛主
2019/02/18
1.1K0
Flume快速入门系列(10) | 如何自定义MySQLSource
  实时监控MySQL,从MySQL中获取数据传输到HDFS或者其他存储框架,所以此时需要我们自己实现MySQLSource。   官方也提供了自定义source的接口:   官网说明:https://flume.apache.org/FlumeDeveloperGuide.html#source
不温卜火
2020/10/28
6390
Flume快速入门系列(10) | 如何自定义MySQLSource
学习笔记0521----mysql管理
MySQL的安装路径为:/usr/local/mysql/,可执行文件在bin目录下,此目录并未添加到系统的环境变量中,所以要使用mysql命令,需要把 /usr/local/mysql/bin/ 目录添加到系统的环境变量中。
嘻哈记
2020/11/24
1.1K0
头歌MySQL数据库实训答案 有目录[通俗易懂]
数据库部分一条一条的写,可鼠标手动粘贴,除特定命令外未分大小写。 第1关:创建数据库
全栈程序员站长
2022/09/13
9K0
Openresty最佳案例 | 第6篇:OpenResty连接Mysql
该文章介绍了如何使用OpenResty和Lua实现一个基本的MySQL数据库操作,包括创建表、插入数据、修改数据、查询数据和删除数据。同时,文章还介绍了如何使用Lua Resty MySQL库来执行这些操作。
方志朋
2017/12/29
2.4K0
【JDBC】使用IDEA连接数据库,执行增删改操作。
【1】idea添加mysql-jar包 【2】使用IDEA连接数据库,执行增删改操作。 【3】IDEA连接数据库,执行查询操作,返回结果集并输出。
.29.
2022/11/15
1.7K0
【JDBC】使用IDEA连接数据库,执行增删改操作。
Python 连接MySQL
数据库技术(例如MySQL)在气象业务和其他商业行业中都有着广泛的应用,气象与电网结合的大项目甚至都用上了hadoop分布式存储,Hadoop中的Hive组件和数据库在语法上高度相似。
MeteoAI
2019/07/22
5.9K0
MySQL
删除有外键关系的表的时候,必须要先删除引用别人表的表(从表),再删除被引用的表(主表);
化羽羽
2022/10/28
1K0
MySQL进阶笔记-3(MySQL优化)
在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的 SQL 语句就成为整个系统性能的瓶颈,因此我们必须要对它们进行优化,本章将详细介绍在 MySQL 中优化 SQL 语句的方法。
千羽
2021/01/14
4920
MySQL进阶笔记-3(MySQL优化)
相关推荐
Clojure 学习入门(9)—— 连接redis
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验