JDBC 入门大白话文档

(写给 Java 新手看的数据库操作指南)


一、JDBC 到底是啥?

简单说:JDBC 就是 Java 官方定的一套「规矩」,让 Java 代码能统一跟各种数据库(MySQL、Oracle、SQL Server 等)说话。

  • 数据库厂商会按这套规矩写好「驱动包」(比如 MySQL 的 mysql-connector-java-x.x.xx.jar
  • 我们写 Java 代码时,只要对着 JDBC 这套「规矩」写,不用管底层是哪种数据库,换数据库只换驱动就行,代码不用大改

二、JDBC 操作数据库 6 步走(背下来!)

不管是增删改查,核心都是这 6 步:

1. 加载驱动

告诉 Java:我要连 MySQL 啦,用这个驱动!

vbnet 复制代码
Class.forName("com.mysql.cj.jdbc.Driver");

注意:MySQL 8.x 版本用这个驱动名,5.x 版本是 com.mysql.jdbc.Driver


2. 获取数据库连接

相当于跟数据库「拨通电话」,需要 3 个关键信息:

  • url:数据库地址 + 库名 + 一堆解决乱码 / 时区的参数
  • username :数据库用户名(一般是 root
  • password:数据库密码(自己设的)
ini 复制代码
String url = "jdbc:mysql://127.0.0.1:3306/msb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);

url 里的参数解释(大白话版):

  • 127.0.0.1:3306:本机 MySQL 地址和默认端口
  • msb:要连接的数据库名字
  • useSSL=false:关掉安全验证,避免高版本 MySQL 报错
  • useUnicode=true&characterEncoding=UTF-8:保证中文不乱码
  • serverTimezone=Asia/Shanghai:设置时区为东八区,解决时间不对的问题

3. 创建会话对象

相当于「拿个话筒」,用来给数据库发 SQL 指令:

ini 复制代码
Statement sta = conn.createStatement();

注意:这个 Statement 有 SQL 注入风险,正式项目推荐用 PreparedStatement,但入门先学这个简单的


4. 发 SQL 指令并拿结果

分两种情况:增删改查询

情况 A:增 / 删 / 改(DML 操作)

executeUpdate(),返回「受影响的行数」,比如插入 1 条就返回 1

ini 复制代码
// 插入示例
int i = sta.executeUpdate("insert into t_book (id,name,author,price) values (3,'红高粱','莫言',49)");

情况 B:查询(DQL 操作)

executeQuery(),返回一个「结果集」ResultSet,里面装着查出来的所有数据

ini 复制代码
// 查询示例:查价格小于 40 的书
ResultSet rs = sta.executeQuery("select * from t_book where price < 40");

5. 处理结果

处理增删改结果

看返回的数字是不是 >0,大于 0 就代表成功了:

csharp 复制代码
if (i > 0) {
    System.out.println("操作成功!");
} else {
    System.out.println("操作失败!");
}

处理查询结果

ResultSet 像个「表格」,需要用循环一行行读数据:

ini 复制代码
// 循环往下读,直到没数据为止
while (rs.next()) {
    // 按列名拿数据,类型要跟数据库对应
    int id = rs.getInt("id");
    String name = rs.getString("name");
    String author = rs.getString("author");
    double price = rs.getDouble("price");
    // 打印看看
    System.out.println(id + "---" + name + "---" + author + "---" + price);
}

rs.next() 作用:把指针往下挪一行,有数据就返回 true,没数据就 false


6. 关闭资源(非常重要!)

相当于「挂电话 + 收话筒」,顺序不能乱:先关结果集 → 再关会话 → 最后关连接

go 复制代码
rs.close();   // 查询才需要关,增删改没有 ResultSet
sta.close();
conn.close();

不关闭会占着数据库连接,多了会把数据库「挤爆」,导致别人连不上进阶写法:用 try-with-resources,让 Java 自动帮你关,不用写 close()


三、完整代码示例(复制就能跑)

示例 1:插入数据

java 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class TestInsert {
    public static void main(String[] args) throws Exception {
        // 1. 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 2. 拿连接
        String url = "jdbc:mysql://127.0.0.1:3306/msb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
        Connection conn = DriverManager.getConnection(url, "root", "root");
        // 3. 拿会话
        Statement sta = conn.createStatement();
        // 4. 发 SQL
        int i = sta.executeUpdate("insert into t_book (id,name,author,price) values (3,'红高粱','莫言',49)");
        // 5. 看结果
        System.out.println(i > 0 ? "插入成功!" : "插入失败!");
        // 6. 关资源
        sta.close();
        conn.close();
    }
}

示例 2:查询数据

java 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class TestSelect {
    public static void main(String[] args) throws Exception {
        // 1. 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 2. 拿连接
        String url = "jdbc:mysql://127.0.0.1:3306/msb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
        Connection conn = DriverManager.getConnection(url, "root", "root");
        // 3. 拿会话
        Statement sta = conn.createStatement();
        // 4. 发查询 SQL
        ResultSet rs = sta.executeQuery("select * from t_book where price < 40");
        // 5. 遍历结果
        while (rs.next()) {
            System.out.println(rs.getInt("id") + "---" + rs.getString("name"));
        }
        // 6. 关资源
        rs.close();
        sta.close();
        conn.close();
    }
}

四、常见坑 & 避坑指南

  1. 中文乱码 :url 里一定要加 characterEncoding=UTF-8
  2. 时区报错 :url 里加 serverTimezone=Asia/Shanghai
  3. 连接不上:检查 MySQL 服务开没开、端口 / 库名 / 账号密码对不对
  4. SQL 注入Statement 不安全,正式项目用 PreparedStatement
  5. 资源泄漏 :永远记得关连接,或者用 try-with-resources 自动关

五、一句话总结

JDBC 就是「Java 连数据库的固定套路」:加载驱动 → 连库 → 拿会话 → 发 SQL → 处理结果 → 关资源记住这 6 步,增删改查都能套!

相关推荐
止语Lab26 分钟前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活26 分钟前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困31 分钟前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn32 分钟前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
用户2986985301438 分钟前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户772831049084040 分钟前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金1 小时前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端
人间凡尔赛1 小时前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构
IT_陈寒2 小时前
Vue的响应式让我加班到凌晨3点,原来问题出在这
前端·人工智能·后端
卷无止境2 小时前
提升 Python 代码健壮性的方法大盘点
后端·python