☕ 第十一章 JDBC
📄 一句话概括

理论备齐,这节真跑通:装 MySQL → 建库建表 → 导驱动 jar → Demo13 把增删改查四连全打一遍——JDBC 从"看懂"变"会用"。

准备一:装好 MySQL(已装的跳过)

教材配套安装教程(Windows 装 MySQL 8.x 社区版),装的时候记住 root 密码,后面代码里要用。

验收:打开命令行(Win+R 输 cmd),敲:

mysql -u root -p

回车后输密码,看到 mysql> 提示符 = 数据库活着。看到"不是内部或外部命令"= 没配环境变量,按教材补 PATH 那一步。

准备二:建库建表(把舞台搭好)

在 mysql> 里逐条贴(分号结尾!SQL 的规矩):

CREATE DATABASE javaweb CHARACTER SET utf8mb4;
USE javaweb;

CREATE TABLE student (
    id INT PRIMARY KEY,
    name VARCHAR(20),
    age INT
);

INSERT INTO student VALUES (1, '波仔', 18), (2, '墨池', 20);
SELECT * FROM student;

验收:最后那句 SELECT 能看到两行数据(波仔、墨池)。

准备三:导驱动 jar(新手第一大卡点,保姆级)

  1. 下载:搜 "MySQL Connector/J"(MySQL 官网 → Downloads → Community),选 Platform Independent 的 zip,解压拿出 mysql-connector-j-8.x.x.jar——就这一个文件,别的都不用
  2. 放:在 IDEA 左侧项目根目录右键 → New → Directory,起名 libs → 把 jar 复制粘贴进去
  3. 认:右键这个 jar → Add as Library... → 弹窗直接点 OK
  4. 验收:左侧树展开 External Libraries,能看到那个 jar = IDEA 认它了
⚠️ 第 3 步不能省

只复制不 Add as Library,jar 就是项目里的一块死石头——代码运行时照样 ClassNotFoundException: com.mysql.cj.jdbc.Driver。90% 的"我明明放了 jar"都是死在这。

Demo13:CRUD 四连(五步套路 × 4 段)

import java.sql.*;

public class Demo13 {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost:3306/javaweb?serverTimezone=Asia/Shanghai";
        Class.forName("com.mysql.cj.jdbc.Driver");

        try (Connection conn = DriverManager.getConnection(url, "root", "你的密码");
             Statement st = conn.createStatement()) {

            // ① 增:INSERT,返回受影响行数
            int rows = st.executeUpdate(
                    "INSERT INTO student VALUES (3, '小波', 19)");
            System.out.println("插入 " + rows + " 行");

            // ② 查:SELECT,光标逐行爬
            ResultSet rs = st.executeQuery("SELECT * FROM student");
            while (rs.next()) {
                System.out.println(rs.getInt("id") + " "
                        + rs.getString("name") + " " + rs.getInt("age"));
            }

            // ③ 改:UPDATE
            rows = st.executeUpdate("UPDATE student SET age = 19 WHERE id = 1");
            System.out.println("更新 " + rows + " 行");

            // ④ 删:DELETE
            rows = st.executeUpdate("DELETE FROM student WHERE id = 2");
            System.out.println("删除 " + rows + " 行");
        }
    }
}

期望控制台输出:

插入 1 行
1 波仔 18
2 墨池 20
3 小波 19
更新 1 行
删除 1 行

跑通 = JDBC 实战毕业。想再确认改删生效,去命令行再 SELECT * FROM student;——年龄变了、墨池没了。

💡 30 秒实验一:jar 只放不认

把 Add as Library 那步撤销(或新建个空项目只粘 jar),跑 Demo13 → ClassNotFoundException: com.mysql.cj.jdbc.Driver。类找不到 = 驱动没进类路径,不是数据库的锅。

💡 30 秒实验二:密码写错

getConnection 第三参故意写错 → Access denied for user 'root'@'localhost' (using password: YES)——异常信息直接告诉你哪个账号被拒了。

💡 30 秒实验三:库名写错

url 里 javaweb 改成 javawebb → Unknown database 'javawebb'——能连上 MySQL(电话通了),只是那间房不存在。

三个实验的异常各不相同——学会看异常信息对症下药,是 JDBC 实战第一基本功。

常见误区

  1. 「jar 放进项目就算导入」——必须右键 Add as Library,否则 ClassNotFoundException。本节第一大坑,没有之一。
  2. 「驱动类名随便写」——新版 8.x 是 com.mysql.cj.jdbc.Driver(带 cj);老教程里的 com.mysql.jdbc.Driver 是旧版类名,配老 jar 才有。
  3. 「SQL 里的字符串不用引号」——SQL 语法字符串要单引号:WHERE name = '波仔';用 Java 拼接时双引号套单引号,别弄丢。
  4. 「增删改也能用 executeQuery」——11.2 的规矩再念一遍:Update 一路、Query 一路,串门即炸。
  5. 「程序里存的密码就是数据库密码」——getConnection(url, "root", "密码") 里的密码是数据库 root 账号的密码,不是什么程序密码,忘了去 MySQL 安装配置里找。

自测一下

❓ Q1:jar 导入项目的完整步骤是什么?漏了哪步会 ClassNotFoundException?

建 libs 文件夹 → 粘 jar → 右键 Add as Library → External Libraries 能看到。漏了 Add as Library(没进类路径)就报 ClassNotFound。

❓ Q2:连接不上数据库的三大异常怎么区分?

ClassNotFoundException(驱动没导入)、Access denied(账号密码错)、Unknown database(库名错)/ CommunicationsException(MySQL 没启动或端口不对)——看异常信息对症。

❓ Q3:增删改查四个操作各用什么方法?

全走 Statement:INSERT/UPDATE/DELETE 用 executeUpdate(返回 int 行数),SELECT 用 executeQuery(返回 ResultSet)。

❓ Q4:SQL 里 student 和 '波仔' 有什么区别?

不带引号的是表名/列名(标识符),带单引号的是字符串值。name = 波仔(没引号)会被当成列名 → 报 Unknown column。

❓ Q5(毕业题):写一个方法 `void addStudent(int id, String name, int age)`,把参数拼进 INSERT 执行。

骨架: getConnection → createStatement → st.executeUpdate("INSERT INTO student VALUES(" + id + ",'" + name + "'," + age + ")") → 关资源。写完自己品:拼接代码越拼越难受,引号极易写错——这就是下节 PreparedStatement 出场的理由。

下一步学什么

相关笔记