diff --git a/docs/chapter06.md b/docs/chapter06.md new file mode 100644 index 0000000..31cdf6c --- /dev/null +++ b/docs/chapter06.md @@ -0,0 +1,202 @@ + +## 6. 数据库访问 + +参考[jdbc(ppt)](./resources/JDBC.pptx) + +### 6.1 JDBC +#### 6.1.1 什么是JDBC? +- **定义**: JDBC (Java Database Connectivity) 是Java中用于连接和操作关系型数据库的标准API。 +- **用途**: JDBC允许Java应用程序与各种关系型数据库进行交互,包括执行SQL语句、处理查询结果等。 +- **优势**: 提供了一个统一的接口,使得开发者可以使用相同的API来操作不同的数据库。 + +#### 6.1.2 JDBC常用API +- **Driver接口**: 定义了数据库驱动必须实现的方法。 +- **DriverManager类**: 提供了加载驱动、获取数据库连接等静态方法。 +- **Connection接口**: 代表与数据库的连接,用于创建Statement对象。 +- **Statement接口**: 用于发送SQL语句到数据库。 +- **PreparedStatement接口**: 继承自Statement,用于预编译SQL语句并设置参数。 +- **ResultSet接口**: 用于处理查询结果。 +- **SQLException类**: JDBC中所有异常的基类,用于表示数据库访问过程中出现的问题。 + +#### 6.1.3 实现第一个JDBC程序 + +下面是一个使用JDBC API操作数据库的例子: + +```java +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class JdbcCrudExample { + + private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase"; + private static final String USER = "root"; + private static final String PASS = "password"; + + public static void main(String[] args) { + Connection conn = null; + try { + // 加载MySQL驱动 + Class.forName("com.mysql.cj.jdbc.Driver"); + + // 获取数据库连接 + conn = DriverManager.getConnection(DB_URL, USER, PASS); + + // 创建表 + createTable(conn); + + // 插入记录 + insertUser(conn, "Alice", 28); + insertUser(conn, "Bob", 32); + + // 查询记录 + queryUsers(conn); + + // 更新记录 + updateUser(conn, "Alice", 29); + + // 删除记录 + deleteUser(conn, "Bob"); + + // 再次查询记录 + queryUsers(conn); + + } catch (ClassNotFoundException | SQLException e) { + e.printStackTrace(); + } finally { + if (conn != null) { + try { + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } + + private static void createTable(Connection conn) throws SQLException { + String sql = "CREATE TABLE IF NOT EXISTS users (" + + "id INT AUTO_INCREMENT PRIMARY KEY," + + "name VARCHAR(255) NOT NULL," + + "age INT)"; + PreparedStatement stmt = conn.prepareStatement(sql); + stmt.executeUpdate(); + stmt.close(); + } + + private static void insertUser(Connection conn, String name, int age) throws SQLException { + String sql = "INSERT INTO users (name, age) VALUES (?, ?)"; + PreparedStatement pstmt = conn.prepareStatement(sql); + pstmt.setString(1, name); + pstmt.setInt(2, age); + pstmt.executeUpdate(); + pstmt.close(); + } + + private static void queryUsers(Connection conn) throws SQLException { + String sql = "SELECT * FROM users"; + PreparedStatement pstmt = conn.prepareStatement(sql); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + int id = rs.getInt("id"); + String name = rs.getString("name"); + int age = rs.getInt("age"); + System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age); + } + rs.close(); + pstmt.close(); + } + + private static void updateUser(Connection conn, String name, int age) throws SQLException { + String sql = "UPDATE users SET age = ? WHERE name = ?"; + PreparedStatement pstmt = conn.prepareStatement(sql); + pstmt.setInt(1, age); + pstmt.setString(2, name); + int rowsUpdated = pstmt.executeUpdate(); + System.out.println(rowsUpdated + " row(s) updated."); + pstmt.close(); + } + + private static void deleteUser(Connection conn, String name) throws SQLException { + String sql = "DELETE FROM users WHERE name = ?"; + PreparedStatement pstmt = conn.prepareStatement(sql); + pstmt.setString(1, name); + int rowsDeleted = pstmt.executeUpdate(); + System.out.println(rowsDeleted + " row(s) deleted."); + pstmt.close(); + } +} +``` + +### 6.2 数据库连接池 +#### 6.2.1 什么是数据库连接池? +- **定义**: 数据库连接池是一种管理数据库连接的技术,用于提高性能和减少资源消耗。 +- **优势**: 减少了创建和销毁连接的开销,提高了应用程序的响应速度。 + +#### 6.2.2 DataSource接口 +- **定义**: JDBC 4.0 引入的`javax.sql.DataSource`接口,用于创建数据库连接池。 +- **使用**: 通过`getConnection()`方法获取连接。 + +#### 6.2.3 常见数据库连接池实现 +- **Apache Commons DBCP**: 早期的数据库连接池实现。 +- **C3P0**: 一个免费的开源连接池实现。 +- **HikariCP**: 一个高性能的数据库连接池实现。 +- **DBUtils**: 一个轻量级的数据库工具类,支持连接池管理。 + +#### 6.2.4 使用HikariCP实现数据库连接池 +- **配置**: 设置连接池的参数。 + ```java + HikariConfig config = new HikariConfig(); + config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase"); + config.setUsername("username"); + config.setPassword("password"); + config.setMaximumPoolSize(10); + config.setConnectionTimeout(30000); + ``` +- **创建连接池**: + ```java + HikariDataSource ds = new HikariDataSource(config); + ``` +- **获取连接**: + ```java + Connection conn = ds.getConnection(); + ``` + +### 6.3 SQL注入的预防措施 +- **定义**: SQL注入是一种常见的安全攻击,通过在SQL语句中插入恶意代码来破坏数据库。 +- **预防**: 使用预编译语句(PreparedStatement)来防止SQL注入。 + - **创建PreparedStatement对象**: + ```java + PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE name = ?"); + pstmt.setString(1, "John Doe"); + ``` + - **执行SQL查询**: + ```java + ResultSet rs = pstmt.executeQuery(); + ``` + +### 6.4 ORM +#### 6.4.1 ORM基本概念 +- **定义**: ORM (Object-Relational Mapping) 是一种编程技术,用于将对象模型映射到关系型数据库模型。 +- **目的**: 简化数据库操作,提高开发效率。 +#### 6.4.2 常见ORM框架介绍 +- **JPA (Java Persistence API)** + - **定义**: JPA 是Java EE标准的一部分,提供了一种对象持久化机制。 + - **特点**: 支持实体管理和生命周期管理。 +- **Hibernate** + - **定义**: Hibernate 是一个流行的ORM框架,实现了JPA规范。 + - **特点**: 提供了强大的映射能力和缓存机制。 +- **MyBatis** + - **定义**: MyBatis 是一个半自动的ORM框架,提供了SQL查询的灵活性。 + - **特点**: 支持动态SQL和存储过程。 + +### 6.5 NoSQL数据库 +#### 6.5.1 MongoDB介绍 +- **定义**: MongoDB 是一个文档型NoSQL数据库,使用JSON-like文档存储数据。 +- **特点**: 高性能、高可用性、易于水平扩展。 +#### 6.5.2 Redis介绍 +- **定义**: Redis 是一个开源的键值存储系统,支持多种数据结构。 +- **特点**: 高性能、低延迟、持久化支持。 +- **使用**: 存储会话数据、缓存、计数器等。 diff --git a/docs/index.md b/docs/index.md index a703d4b..18acda7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -173,20 +173,24 @@ #### 5.6.3 使用@Transactional进行声明式事务管理 #### 5.6.4 使用编程式事务管理 -### 6. 数据库技术 +## 6. 数据库访问 +### 6.1 JDBC +#### 6.1.1 什么是JDBC? +#### 6.1.2 JDBC常用API +#### 6.1.3 实现第一个JDBC程序 +### 6.2 数据库连接池 +#### 6.2.1 什么是数据库连接池? +#### 6.2.2 DataSource接口 +#### 6.2.3 常见数据库连接池实现 +#### 6.2.4 使用HikariCP实现数据库连接池 +### 6.3 SQL注入的预防措施 +### 6.4 ORM +#### 6.4.1 ORM基本概念 +#### 6.4.2 常见ORM框架介绍 +### 6.5 NoSQL数据库 +#### 6.5.1 MongoDB介绍 +#### 6.5.2 Redis介绍 -#### 6.1 JDBC编程 -- JDBC API的基本使用 -- 连接池的配置与管理 -- SQL注入的预防措施 - -#### 6.2 ORM框架介绍 -- ORM基本概念 -- 常见ORM框架介绍:JPA、Hibernate、MyBatis等 - -#### 6.3 NoSQL数据库介绍 -- MongoDB介绍 -- Redis介绍和使用 ### 7. 项目实践 diff --git a/docs/resources/JDBC.pptx b/docs/resources/JDBC.pptx new file mode 100644 index 0000000..ce1ccc5 Binary files /dev/null and b/docs/resources/JDBC.pptx differ