Java 操作数据库完整教程(上篇・JDBC 零基础详解)

本篇为教程上半部分,完整讲解行业持久层技术选型、JDBC 全套底层原理、标准五步操作流程、DML 增删改、DQL 查询结果集、预编译 PreparedStatement 防注入,配套完整可运行代码、底层原理对比,吃透 JDBC 才能看懂 MyBatis 封装逻辑;下篇讲解 SpringBoot 整合 MyBatis、数据库连接池、注解 / XML 两种 CRUD、SpringBoot yml 配置文件。

一、Java 后端持久层主流技术市场分布

企业项目持久框架使用占比调研:

  1. MyBatis:46%(国内企业主流首选,轻量化灵活)
  2. MyBatis-Plus:24.2%(MyBatis 增强工具,简化 CRUD)
  3. Spring Data JPA:11.7%
  4. Hibernate:7.3%
  5. JDBC 原生、其他方案合计不足 10%

学习顺序建议:先吃透原生 JDBC 底层,再学习 MyBatis 等封装框架,理解框架本质是对 JDBC 做封装简化冗余代码。

二、JDBC 核心概念与底层运行机制

2.1 什么是 JDBC

JDBC 全称:**Java DataBase Connectivity(Java 数据库连接)**是 Sun 官方定义、统一规范的一套操作所有关系型数据库 API 接口。

2.2 分层运行原理

  1. 顶层:Java 业务代码,只依赖 JDBC 标准接口,不绑定任何数据库;
  2. 中间标准:统一 JDBC 接口规范(Connection、Statement、ResultSet 等);
  3. 底层实现:各数据库厂商根据 JDBC 规范开发专属驱动 jar 包(MySQL 驱动、Oracle 驱动、SQLServer 驱动);
  4. 最终交互:Java 代码调用标准接口,实际执行逻辑由驱动实现类完成。

优势:切换 MySQL/Oracle 仅替换驱动包,业务 Java 代码几乎无需改动。

2.3 MySQL8 驱动 Maven 依赖

Maven 项目 pom.xml 引入官方驱动包:

复制代码
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.33</version>
</dependency>

三、JDBC 标准五步入门程序(DML 修改示例)

需求

执行 SQL:update user set age = 25 where id = 1,修改指定用户年龄

固定 5 步执行流程

  1. 注册数据库驱动,加载驱动实现类;
  2. 通过驱动管理器获取数据库连接 Connection;
  3. 创建 SQL 执行对象 Statement;
  4. 执行 DML 增删改 SQL,获取受影响行数;
  5. 反向关闭所有资源(先执行对象、再连接),释放数据库链路。

完整可运行代码:

复制代码
// 1. 注册MySQL驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 定义连接信息,获取连接
String url = "jdbc:mysql://localhost:3306/web01";
String username = "root";
String password = "1234";
Connection connection = DriverManager.getConnection(url, username, password);
// 3. 创建SQL执行对象
Statement statement = connection.createStatement();
// 4. 执行更新语句,返回影响记录条数
int rows = statement.executeUpdate("update user set age = 25 where id = 1");
System.out.println("SQL执行成功,影响行数:" + rows);
// 5. 释放资源,逆序关闭
statement.close();
connection.close();

核心方法区分

  • executeUpdate ():用于 INSERT/UPDATE/DELETE 增删改 DML 语句,返回 int(受影响行数);
  • executeQuery ():用于 SELECT 查询 DQL 语句,返回 ResultSet 结果集对象。

四、JDBC 查询操作 & ResultSet 结果集解析

业务需求

根据用户名、密码查询用户数据:select * from user where username = 'daqiao' and password = '123456'

ResultSet 核心 API 说明

ResultSet 是存储查询返回表格数据的封装对象,内置光标遍历数据:

  1. next():光标向下移动一行,有有效数据返回 true,无数据返回 false;
  2. getXxx("字段名"):按字段名取值(推荐,可读性高,不易出错);
  3. getXxx(数字):按列序号取值(从 1 开始,不推荐维护)。

完整查询代码示例

复制代码
// 1.注册驱动+获取连接省略(同上)
Statement stmt = connection.createStatement();
// 执行查询,接收结果集
ResultSet rs = stmt.executeQuery("select * from user where username = 'daqiao'");
// 循环遍历所有查询行
while(rs.next()){
    int id = rs.getInt("id");
    String username = rs.getString("username");
    String name = rs.getString("name");
    int age = rs.getInt("age");
    System.out.println(id + " " + username + " " + name + " " + age);
}
// 关闭资源顺序:结果集 → Statement → 连接
rs.close();
stmt.close();
connection.close();

五、预编译 SQL PreparedStatement(重点必考点)

5.1 原生 Statement 两大致命缺陷

  1. SQL 注入漏洞:字符串拼接 SQL,恶意输入可篡改查询逻辑(登录绕过);
  2. 性能低下:每条 SQL 都会单独解析、语法校验、编译,批量执行重复 SQL 损耗数据库性能。

5.2 PreparedStatement 两大核心优势

  1. 安全防注入:使用?占位符分离 SQL 模板与参数,所有输入统一作为纯字符串处理,不会解析 SQL 关键字;
  2. 性能优化:相同模板 SQL 仅编译一次,后续仅替换参数,大幅减少数据库解析开销。

标准预编译代码模板

复制代码
// 1.带?占位符的预编译SQL模板
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 2.给占位符赋值,序号从1开始
pstmt.setString(1, "daqiao");
pstmt.setString(2, "123456");
// 3.执行查询,无需再次传入SQL字符串
ResultSet rs = pstmt.executeQuery();

SQL 注入场景举例

登录页面密码输入恶意值:' or '1'='1原生 Statement 拼接后 SQL 条件恒成立,无需正确密码即可登录;预编译会将单引号、or 全部当作普通文本,不会破坏 SQL 结构,彻底拦截注入攻击。

性能对比说明

批量删除 id=1、2、3 三条数据:

  • Statement:3 条 SQL,3 次语法解析 + 编译;
  • PreparedStatement:1 套模板仅编译 1 次,仅替换参数执行 3 次。

六、上篇全文完整总结

  1. 行业持久层主流框架 MyBatis 使用率最高,学习需先掌握底层 JDBC;
  2. JDBC 是 Java 操作数据库统一标准接口,各数据库提供专属驱动 jar;
  3. JDBC 固定五步开发:注册驱动 → 获取连接 → 创建执行对象 → 执行 SQL → 释放资源;
  4. executeUpdate 处理增删改、executeQuery 处理查询,ResultSet 存放表格数据;
  5. Result.next () 遍历行,getXxx (字段名) 获取对应列数据;
  6. PreparedStatement 预编译 SQL,解决 SQL 注入、提升重复 SQL 执行性能。

上篇实操练习

  1. 搭建 Maven 项目,导入 MySQL 驱动,编写 JDBC 修改用户 age 代码;
  2. 实现查询全部用户,循环 ResultSet 并打印每条信息;
  3. 使用 PreparedStatement 实现登录查询,模拟 SQL 注入测试效果。

上篇面试高频考点

  1. JDBC 的定义与底层运行原理;
  2. Statement 和 PreparedStatement 区别;3 SQL 注入产生原因与预编译解决方案;4 JDBC 标准五步操作流程;5 ResultSet 作用与 next () 方法功能。