mirror of
https://gitee.com/many2many/java-web.git
synced 2025-01-11 14:40:55 +08:00
add c6
This commit is contained in:
parent
0d43c4ce53
commit
b68b5fe2fd
202
docs/chapter06.md
Normal file
202
docs/chapter06.md
Normal file
@ -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 是一个开源的键值存储系统,支持多种数据结构。
|
||||
- **特点**: 高性能、低延迟、持久化支持。
|
||||
- **使用**: 存储会话数据、缓存、计数器等。
|
@ -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. 项目实践
|
||||
|
||||
|
BIN
docs/resources/JDBC.pptx
Normal file
BIN
docs/resources/JDBC.pptx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user