java-web/docs/chapter06.md
2024-08-07 03:05:35 +08:00

7.5 KiB
Raw Blame History

6. 数据库访问

参考jdbc(ppt)

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操作数据库的例子

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实现数据库连接池

  • 配置: 设置连接池的参数。
    HikariConfig config = new HikariConfig();
    config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
    config.setUsername("username");
    config.setPassword("password");
    config.setMaximumPoolSize(10);
    config.setConnectionTimeout(30000);
    
  • 创建连接池:
    HikariDataSource ds = new HikariDataSource(config);
    
  • 获取连接:
    Connection conn = ds.getConnection();
    

6.3 SQL注入的预防措施(掌握)

  • 定义: SQL注入是一种常见的安全攻击通过在SQL语句中插入恶意代码来破坏数据库。
  • 预防: 使用预编译语句PreparedStatement来防止SQL注入。
    • 创建PreparedStatement对象:
      PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE name = ?");
      pstmt.setString(1, "John Doe");
      
    • 执行SQL查询:
      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 是一个开源的键值存储系统,支持多种数据结构。
  • 特点: 高性能、低延迟、持久化支持。
  • 使用: 存储会话数据、缓存、计数器等。