Salmon的全栈知识 Salmon的全栈知识
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • SpringCloud Gateway
  • Apollo
  • Eureka
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
首页
  • JavaSE
  • JavaWeb
  • Spring生态
  • JUC
  • JVM
  • Netty
  • Java各版本特性
  • 23种设计模式
  • Maven
  • Java常用框架
  • Dubbo
  • OpenFeign
  • Nacos
  • Zookeeper
  • Sentinel
  • Seata
  • SpringCloud Gateway
  • Apollo
  • Eureka
  • Go基础
  • Gin
  • SQL数据库

    • MySQL
    • Oracle
  • NoSQL数据库

    • Redis
    • MongoDB
    • ElasticSearch
  • 消息中间件

    • RabbitMQ
    • RocketMQ
    • Kafka
    • ActiveMQ
    • MQTT
    • NATS
  • 网关中间件

    • Nginx
  • Linux
  • Docker
  • Git
  • K8s
  • Solidity
  • Java
  • 计算机网络
  • 操作系统
GitHub (opens new window)
npm

(进入注册为作者充电)

  • JUnit单元测试
  • JDBC
    • 一、JDBC 基本概念
      • 1.1 概念
      • 1.2 工作原理
    • 二、快速入门步骤
      • 2.1 步骤流程
      • 2.2 示例代码(更新语句)
    • 三、JDBC 核心对象详解
      • 3.1 DriverManager:驱动管理类
      • 3.2 Connection:数据库连接对象
      • 3.3 Statement:执行 SQL 的对象
      • 3.4 ResultSet:结果集对象
      • 3.5 PreparedStatement:预编译执行对象
    • 四、JDBC 工具类封装:
    • JDBCUtils
      • 4.1 目的
      • 4.2 配置文件
      • 4.3 工具类结构
    • 五、实战示例:用户登录验证
      • 5.1 数据表结构
      • 5.2 登录验证代码
    • 六、JDBC 控制事务
      • 6.1 场景:
      • 6.2 步骤
      • 6.3 示例代码
    • ✅ 总结
  • JDBC连接池&JDBCTemplate
  • XML
  • Tomcat&Servlet
  • Servlet&HTTP&Request
  • Response
  • Cookie&Session
  • EL&JSTL
  • Filter&Listener
  • 《JavaWeb》笔记
Salmon
2025-07-21
目录

JDBC

# 一、JDBC 基本概念

# 1.1 概念

  • JDBC(Java Database Connectivity):Java 操作数据库的一套标准 API。
  • 本质:Sun 公司定义的一套操作关系型数据库的接口(规则)。数据库厂商提供实现(即数据库驱动 jar 包)。

# 1.2 工作原理

  • 开发时使用 JDBC 接口编程。
  • 实际运行时,由具体数据库厂商的实现类来执行操作。

# 二、快速入门步骤

# 2.1 步骤流程

  1. 导入驱动 jar 包(如:mysql-connector-java-5.1.37-bin.jar)
  2. 注册驱动(Class.forName(...))
  3. 获取数据库连接对象:Connection
  4. 定义 SQL
  5. 获取执行 SQL 的对象:Statement
  6. 执行 SQL,接收返回结果
  7. 处理结果
  8. 释放资源

# 2.2 示例代码(更新语句)

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
String sql = "UPDATE account SET balance = 500 WHERE id = 1";
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println(count);
stmt.close();
conn.close();

# 三、JDBC 核心对象详解

# 3.1 DriverManager:驱动管理类

  • 注册驱动:Class.forName("com.mysql.jdbc.Driver");
  • 获取连接:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");

# 3.2 Connection:数据库连接对象

  • 创建 SQL 执行对象:createStatement() / prepareStatement()

  • 管理事务:

    • 开启:setAutoCommit(false)
    • 提交:commit()
    • 回滚:rollback()

# 3.3 Statement:执行 SQL 的对象

  • 执行通用 SQL:execute(String sql)
  • 执行增删改:executeUpdate(String sql)
  • 执行查询:executeQuery(String sql)

# 3.4 ResultSet:结果集对象

  • 遍历数据:
while (rs.next()) {
    int id = rs.getInt(1);
    String name = rs.getString("name");
    double balance = rs.getDouble(3);
}
  • 获取数据:

    • getXxx(int columnIndex)
    • getXxx(String columnName)

# 3.5 PreparedStatement:预编译执行对象

  • 防止 SQL 注入。
  • 使用占位符 ?:
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "zhangsan");
pstmt.setString(2, "123");

# 四、JDBC 工具类封装:

# JDBCUtils

# 4.1 目的

  • 简化 JDBC 开发
  • 提供通用的连接获取与资源释放功能

# 4.2 配置文件

jdbc.properties

url=jdbc:mysql://localhost:3306/db3
user=root
password=root
driver=com.mysql.jdbc.Driver

# 4.3 工具类结构

public class JDBCUtils {
    static {
        Properties pro = new Properties();
        ClassLoader classLoader = JDBCUtils.class.getClassLoader();
        URL res = classLoader.getResource("jdbc.properties");
        pro.load(new FileReader(res.getPath()));

        url = pro.getProperty("url");
        user = pro.getProperty("user");
        password = pro.getProperty("password");
        driver = pro.getProperty("driver");

        Class.forName(driver);
    }

    public static Connection getConnection() {
        return DriverManager.getConnection(url, user, password);
    }

    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        // 分别关闭资源
    }
}

# 五、实战示例:用户登录验证

# 5.1 数据表结构

CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(32),
    password VARCHAR(32)
);
INSERT INTO user VALUES (NULL, 'zhangsan', '123');
INSERT INTO user VALUES (NULL, 'lisi', '234');

# 5.2 登录验证代码

public boolean login(String username, String password) {
    if (username == null || password == null) return false;

    String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
    try (Connection conn = JDBCUtils.getConnection();
         PreparedStatement pstmt = conn.prepareStatement(sql)) {

        pstmt.setString(1, username);
        pstmt.setString(2, password);

        ResultSet rs = pstmt.executeQuery();
        return rs.next();

    } catch (SQLException e) {
        e.printStackTrace();
    }
    return false;
}

# 六、JDBC 控制事务

# 6.1 场景:

转账操作(张三 -> 李四 500元)

# 6.2 步骤

  1. 开启事务:conn.setAutoCommit(false)
  2. 执行多个 SQL
  3. 如果全部成功:conn.commit()
  4. 如果异常:conn.rollback()

# 6.3 示例代码

conn.setAutoCommit(false); // 开启事务

PreparedStatement pstmt1 = conn.prepareStatement(sql1);
PreparedStatement pstmt2 = conn.prepareStatement(sql2);

// 设置参数 & 执行 SQL
pstmt1.setDouble(1, 500);
pstmt1.setInt(2, 1);
pstmt2.setDouble(1, 500); 
pstmt2.setInt(2, 2);

pstmt1.executeUpdate();
int error = 1 / 0; // 模拟异常
pstmt2.executeUpdate();

conn.commit(); // 成功后提交

// catch 中处理回滚
conn.rollback();

# ✅ 总结

对象 作用
DriverManager 管理驱动与数据库连接
Connection 表示数据库连接对象
Statement 执行 SQL 语句(不安全)
PreparedStatement 预编译语句,防注入
ResultSet 查询结果集

推荐:使用 PreparedStatement 完成所有 SQL 操作,安全高效。

上次更新: 2025/07/23, 01:37:33
JUnit单元测试
JDBC连接池&JDBCTemplate

← JUnit单元测试 JDBC连接池&JDBCTemplate→

Theme by Vdoing | Copyright © 2022-2025 Salmon's Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式