(写给 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();
}
}
四、常见坑 & 避坑指南
- 中文乱码 :url 里一定要加
characterEncoding=UTF-8 - 时区报错 :url 里加
serverTimezone=Asia/Shanghai - 连接不上:检查 MySQL 服务开没开、端口 / 库名 / 账号密码对不对
- SQL 注入 :
Statement不安全,正式项目用PreparedStatement - 资源泄漏 :永远记得关连接,或者用
try-with-resources自动关
五、一句话总结
JDBC 就是「Java 连数据库的固定套路」:加载驱动 → 连库 → 拿会话 → 发 SQL → 处理结果 → 关资源记住这 6 步,增删改查都能套!