mysql菜鸟教程
18.2 使用Java连接MySQL:JDBC
在Java世界中,连接数据库的标准技术是 JDBC(Java Database Connectivity)。JDBC提供了一套统一的API,让Java程序能够与各种关系型数据库(如MySQL、Oracle、SQL Server等)进行交互。无论底层数据库是什么,开发者都可以用相似的代码来执行SQL语句、处理结果。
本节将带你从零开始,学习如何使用JDBC连接MySQL数据库,并完成常见的增删改查操作。
1. 准备工作:获取MySQL JDBC驱动
JDBC本身是一套接口,具体与MySQL通信的实现需要由MySQL官方提供的驱动来完成,这个驱动通常是一个JAR文件,名为 MySQL Connector/J。
1.1 下载驱动JAR
访问MySQL官网下载页面:https://dev.mysql.com/downloads/connector/j/
选择“Platform Independent”版本,下载ZIP文件。
解压后,找到其中的 mysql-connector-java-x.x.xx.jar 文件。
1.2 在项目中添加依赖
如果你使用Maven,可以直接在 pom.xml 中添加依赖(推荐,无需手动下载):
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <!-- 请使用最新稳定版 --> </dependency>
如果你不使用Maven,则需要手动将下载的JAR文件添加到项目的classpath中:
在IDE(如Eclipse、IntelliJ IDEA)中,将JAR包添加到项目的库中。
如果是在命令行编译,需要设置 CLASSPATH 或使用 -cp 参数。
2. JDBC核心步骤
使用JDBC操作数据库通常遵循以下五个步骤:
注册驱动(可选,新版本可自动注册)
建立连接(通过 DriverManager)
创建语句对象(Statement 或 PreparedStatement)
执行SQL 并处理结果
释放资源(关闭连接等)
2.1 注册驱动
在JDBC 4.0之后,只要驱动JAR在classpath中,驱动会自动注册,通常无需显式调用 Class.forName。但为了兼容旧代码,有时仍可见到如下写法:
Class.forName("com.mysql.cj.jdbc.Driver");现在这一行可以省略。
2.2 建立连接
使用 DriverManager.getConnection() 方法,传入数据库URL、用户名和密码。
JDBC URL格式:
jdbc:mysql://主机:端口/数据库名?参数1=值1&参数2=值2
主机:默认为 localhost
端口:默认为 3306
常用参数:
useSSL=false 或 true:是否使用SSL
serverTimezone=Asia/Shanghai:指定服务器时区(MySQL 8.0 要求显式设置时区)
characterEncoding=utf8:字符编码
示例:
String url = "jdbc:mysql://localhost:3306/your_database?"+ "useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8"; String user = "root"; String password = "your_password"; Connection conn = DriverManager.getConnection(url, user, password);
2.3 创建语句对象
有三种语句对象:
Statement:用于执行静态SQL语句。
PreparedStatement:预编译的SQL语句,可以防止SQL注入,推荐使用。
CallableStatement:用于调用存储过程。
2.4 执行SQL
执行查询(SELECT)使用 executeQuery(),返回 ResultSet 结果集。
执行更新(INSERT、UPDATE、DELETE)使用 executeUpdate(),返回受影响的行数。
2.5 处理结果
对于查询,遍历 ResultSet 获取数据:
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
// ...
}2.6 释放资源
为了节省数据库连接资源,务必在finally块中关闭 ResultSet、Statement 和 Connection。Java 7 引入了 try-with-resources 语法,可以自动关闭实现了 AutoCloseable 的资源,使代码更简洁。
3. 完整示例代码
下面我们通过一个完整的示例,展示如何使用JDBC实现用户表的增删改查操作。
3.1 数据库准备
首先,在MySQL中创建一个数据库 testdb 和一张表 users:
CREATE DATABASE IF NOT EXISTS testdb CHARACTER SET utf8mb4; USE testdb; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, age INT );
3.2 Java代码示例
import java.sql.*;
public class JdbcDemo {
// 数据库连接配置
private static final String URL = "jdbc:mysql://localhost:3306/testdb?"+
"useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8";
private static final String USER = "root";
private static final String PASSWORD = "your_password";
public static void main(String[] args) {
// 测试插入
insertUser("张三", "zhangsan@example.com", 25);
// 测试查询
selectAllUsers();
// 测试更新
updateUserEmail("zhangsan@example.com", "newemail@example.com");
// 测试删除
deleteUserByEmail("lisi@example.com");
}
/**
* 插入用户(使用 PreparedStatement 防止SQL注入)
*/
public static void insertUser(String name, String email, int age) {
String sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
// try-with-resources 自动关闭连接、语句
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, name);
pstmt.setString(2, email);
pstmt.setInt(3, age);
int rows = pstmt.executeUpdate();
System.out.println("插入了 " + rows + " 行数据。");
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 查询所有用户
*/
public static void selectAllUsers() {
String sql = "SELECT id, name, email, age FROM users";
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
System.out.println("用户列表:");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
int age = rs.getInt("age");
System.out.printf("ID: %d, 姓名: %s, 邮箱: %s, 年龄: %d%n",
id, name, email, age);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 根据原邮箱更新用户邮箱
*/
public static void updateUserEmail(String oldEmail, String newEmail) {
String sql = "UPDATE users SET email = ? WHERE email = ?";
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, newEmail);
pstmt.setString(2, oldEmail);
int rows = pstmt.executeUpdate();
System.out.println("更新了 " + rows + " 行数据。");
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 根据邮箱删除用户
*/
public static void deleteUserByEmail(String email) {
String sql = "DELETE FROM users WHERE email = ?";
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, email);
int rows = pstmt.executeUpdate();
System.out.println("删除了 " + rows + " 行数据。");
} catch (SQLException e) {
e.printStackTrace();
}
}
}4. 重要注意事项
使用PreparedStatement防止SQL注入绝对不要通过字符串拼接来构造SQL语句,尤其是包含用户输入的部分。使用 PreparedStatement 的参数化查询是唯一安全的方式。
处理时区问题MySQL 8.0 要求显式设置时区,否则可能报错。在URL中添加 serverTimezone=Asia/Shanghai(或其他时区)。
资源释放数据库连接是宝贵资源,用完必须关闭。推荐使用 try-with-resources 自动关闭,或手动在finally中关闭。
事务管理默认情况下,每条SQL语句执行后会自动提交。如果希望将多条语句作为一个事务,可以调用 conn.setAutoCommit(false),然后手动 commit() 或 rollback()。
处理异常JDBC操作会抛出 SQLException,需要捕获或向上抛出。注意异常信息中可能包含详细的数据库错误。
驱动版本MySQL 5.x 和 8.x 使用的驱动略有不同。MySQL 8.x 建议使用 com.mysql.cj.jdbc.Driver,URL中需要指定时区。
5. 总结
JDBC 是Java连接数据库的标准方式,MySQL提供了对应的驱动 mysql-connector-java。
核心步骤:加载驱动(可省略)、建立连接、创建语句、执行SQL、处理结果、释放资源。
PreparedStatement 是执行参数化查询的首选,可防止SQL注入。
使用 try-with-resources 自动管理资源,让代码更简洁健壮。
务必注意时区、事务提交等细节。
掌握了JDBC,你就可以在Java程序中自由地操作MySQL数据库,为开发Web应用、桌面软件等奠定基础。下一节我们将学习如何使用PHP连接MySQL。

发表评论
所有评论