使用 next.jdbc 连接数据库
学习使用 `next.jdbc` 库建立数据库连接并执行 SQL 查询。
使用 next.jdbc 连接数据库 是 CoddyKit 上的免费 Clojure Functional Programming & JVM Backend Development 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Clojure Functional Programming & JVM Backend Development 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Clojure Functional Programming & JVM Backend Development 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Database Access in Clojure
Welcome to connecting Clojure with databases! Most real-world applications need to store and retrieve data, and databases are central to this.
In this lesson, you'll learn how to use next.jdbc, Clojure's popular library, to interact with various databases.
Meet next.jdbc
next.jdbc is a modern, idiomatic Clojure wrapper for JDBC (Java Database Connectivity). JDBC is the standard Java API for connecting to relational databases.
- It simplifies database operations.
- It provides a clean, functional interface.
- It's fast and efficient.
- It supports a wide range of databases (PostgreSQL, MySQL, H2, SQLite, etc.).
Adding Dependencies
Before we write any code, we need to add next.jdbc and a database driver to our project's dependencies. We'll use H2, an in-memory database, for easy examples.
Add these to your deps.edn file:
{:deps {org.clojure/clojure {:mvn/version "1.11.1"}
seancorfield/next.jdbc {:mvn/version "1.3.909"}
com.h2database/h2 {:mvn/version "2.2.220"}}}The Connection String (JDBC URL)
To connect to a database, you need a JDBC URL. This string tells next.jdbc (and the underlying JDBC driver) how to find and connect to your database.
For an in-memory H2 database, a common URL looks like this:
jdbc:h2:mem:testdb: Connects to an H2 database named 'testdb' in memory.jdbc:sqlite:my-data.db: Connects to a SQLite file.jdbc:postgresql://localhost/mydb: Connects to a PostgreSQL database.
Establishing a Datasource
A datasource is an object that represents a connection pool or factory for database connections. It's usually created once and reused.
next.jdbc's get-datasource function takes a map of connection parameters, including the JDBC URL.
Getting a Connection with <code>with-open</code>
After getting a datasource, you can obtain a connection. It's crucial to close connections after use to free up resources.
Clojure's with-open macro is perfect for this. It ensures that resources like database connections are automatically closed when they go out of scope.
Runnable: Connect & Disconnect
Let's see how to establish and close a database connection using next.jdbc and an in-memory H2 database. Run this code:
(ns my-app.core
(:require [next.jdbc :as jdbc]))
(defn -main
"Connects to an H2 in-memory database and closes the connection."
[]
(let [db-spec {:dbtype "h2" :dbname "mem:testdb"}]
(println "Attempting to connect...")
(with-open [conn (jdbc/get-connection db-spec)]
(println "Successfully connected to H2!\nConnection object:")
(println conn))
(println "Connection closed.")))
(-main)Executing Simple SQL Queries
Once connected, you can execute SQL queries. next.jdbc provides functions like jdbc/execute! for DDL (Data Definition Language) and DML (Data Manipulation Language) operations, and jdbc/execute-one! for queries expecting a single row result.
Queries are passed as vectors, with the SQL string followed by any parameters.
Runnable: Execute a Query
Now, let's create a table and insert some data into our in-memory H2 database, then query it. Notice how execute! returns a vector of maps.
(ns my-app.core
(:require [next.jdbc :as jdbc]))
(defn -main
"Connects, creates a table, inserts data, and queries it."
[]
(let [db-spec {:dbtype "h2" :dbname "mem:testdb"}]
(with-open [conn (jdbc/get-connection db-spec)]
(println "Connected. Creating table...")
(jdbc/execute! conn ["CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name VARCHAR(255))"])
(println "Table created. Inserting data...")
(jdbc/execute! conn ["INSERT INTO users (id, name) VALUES (?, ?)" 1 "Alice"])
(jdbc/execute! conn ["INSERT INTO users (id, name) VALUES (?, ?)" 2 "Bob"])
(println "Data inserted. Querying data...")
(let [result (jdbc/execute! conn ["SELECT id, name FROM users"])]
(println "Query Result:")
(doseq [row result] (println row))))
(println "Operations complete. Connection closed.")))
(-main)Quick Check on Connections
What is the primary purpose of using with-open when dealing with database connections in Clojure?
Recap: Connecting to Databases
You've taken the first step into database interaction with Clojure!
- We introduced
next.jdbcas a powerful library for database access. - You learned how to add necessary dependencies (
next.jdbcand a JDBC driver like H2). - We covered JDBC URLs and how to establish a datasource and connection.
- You saw how
with-openensures connections are properly managed. - Finally, we executed basic DDL and DML queries using
jdbc/execute!.
Next, we'll dive deeper into CRUD operations!
用 AI 导师学习 Clojure — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 12
- 课程
- 48
常见问题解答
「使用 next.jdbc 连接数据库」课时是免费的吗?
是的 — 「使用 next.jdbc 连接数据库」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Clojure Functional Programming & JVM Backend Development 课程的其余内容,请升级到 CoddyKit PRO。 Clojure Functional Programming & JVM Backend Development 课程共包含 4 节课。
「使用 next.jdbc 连接数据库」这节课中我会学到什么?
学习使用 `next.jdbc` 库建立数据库连接并执行 SQL 查询。 你通过在浏览器中直接运行的动手代码来练习 Clojure Functional Programming & JVM Backend Development,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Clojure Functional Programming & JVM Backend Development 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Clojure Functional Programming & JVM Backend Development 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「使用 next.jdbc 连接数据库」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Clojure Functional Programming & JVM Backend Development 课中编写并运行代码吗?
能。每节 Clojure Functional Programming & JVM Backend Development 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 next.jdbc 连接数据库
- 执行 CRUD 操作
- 数据库迁移与架构管理
- 连接池与事务