【Java】IntelliJ IDEA 通过JDBC连接MySQL数据库实现数据增删改查
📅 2026/7/13 13:20:46
👁️ 阅读次数
📝 编程学习
1. 环境准备与项目创建
在开始之前,我们需要确保开发环境已经准备就绪。首先,你需要安装以下软件:
- IntelliJ IDEA:推荐使用最新版本,社区版或旗舰版均可
- MySQL数据库:建议使用5.7或8.0版本
- JDK:Java开发工具包,建议使用JDK 11或更高版本
安装完成后,打开IntelliJ IDEA,点击"File"→"New"→"Project",选择Java项目模板。这里有个小技巧:我习惯在创建项目时就勾选"Create Git repository"选项,这样从一开始就能进行版本控制。项目命名建议使用有意义的名称,比如"JdbcCrudDemo"。
提示:如果你使用的是MySQL 8.0+版本,需要注意驱动类名和连接URL与旧版本有所不同,这个坑我当初踩过好几次。
2. 添加MySQL JDBC驱动
现在我们需要将MySQL的JDBC驱动添加到项目中。有两种常见方式:
2.1 手动添加JAR文件
- 从MySQL官网下载Connector/J驱动(建议选择8.0.x版本)
- 在项目根目录下创建libs文件夹
- 将下载的mysql-connector-java-x.x.xx.jar文件复制到libs目录
- 右键JAR文件选择"Add as Library"
2.2 使用Maven管理依赖(推荐)
如果你使用Maven,只需在pom.xml中添加:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>我强烈推荐使用Maven方式,因为它能自动处理依赖关系,特别是当你需要升级驱动版本时特别方便。在实际项目中,我们还会添加连接池依赖如HikariCP,但这是后话。
3. 创建数据库连接工具类
为了避免重复代码,我们先创建一个数据库连接工具类:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DbUtil { private static final String URL = "jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC"; private static final String USER = "root"; private static final String PASSWORD = "yourpassword"; public static Connection getConnection() throws SQLException { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } return DriverManager.getConnection(URL, USER, PASSWORD); } }这里有几个需要注意的点:
- MySQL 8.0+需要指定时区参数serverTimezone
- 生产环境应该将连接信息放在配置文件中
- 实际项目中应该使用连接池而非每次都新建连接
4. 实现CRUD操作
4.1 创建用户表
首先我们需要一个用户表来操作,SQL如下:
CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );4.2 插入数据(Create)
public static void createUser(String username, String email) { String sql = "INSERT INTO users(username, email) VALUES(?, ?)"; try (Connection conn = DbUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, username); pstmt.setString(2, email); int affectedRows = pstmt.executeUpdate(); System.out.println("插入成功,影响行数: " + affectedRows); } catch (SQLException e) { e.printStackTrace(); } }4.3 查询数据(Read)
public static void readUsers() { String sql = "SELECT * FROM users"; try (Connection conn = DbUtil.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { System.out.printf("ID: %d, 用户名: %s, 邮箱: %s, 创建时间: %s%n", rs.getInt("id"), rs.getString("username"), rs.getString("email"), rs.getTimestamp("created_at")); } } catch (SQLException e) { e.printStackTrace(); } }4.4 更新数据(Update)
public static void updateUserEmail(int id, String newEmail) { String sql = "UPDATE users SET email = ? WHERE id = ?"; try (Connection conn = DbUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, newEmail); pstmt.setInt(2, id); int affectedRows = pstmt.executeUpdate(); System.out.println("更新成功,影响行数: " + affectedRows); } catch (SQLException e) { e.printStackTrace(); } }4.5 删除数据(Delete)
public static void deleteUser(int id) { String sql = "DELETE FROM users WHERE id = ?"; try (Connection conn = DbUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, id); int affectedRows = pstmt.executeUpdate(); System.out.println("删除成功,影响行数: " + affectedRows); } catch (SQLException e) { e.printStackTrace(); } }5. 异常处理与最佳实践
在实际开发中,我们需要更完善的异常处理机制。这里分享几个我总结的经验:
- 使用try-with-resources:如上面代码所示,它可以自动关闭资源
- 日志记录:不要只是printStackTrace,应该使用日志框架
- 事务管理:多个操作应该放在一个事务中
- SQL注入防护:始终使用PreparedStatement
一个改进版的异常处理示例:
public static void safeCreateUser(String username, String email) { String sql = "INSERT INTO users(username, email) VALUES(?, ?)"; try (Connection conn = DbUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { conn.setAutoCommit(false); // 开始事务 pstmt.setString(1, username); pstmt.setString(2, email); pstmt.executeUpdate(); conn.commit(); // 提交事务 System.out.println("用户创建成功"); } catch (SQLException e) { try { if (conn != null) { conn.rollback(); // 回滚事务 } } catch (SQLException ex) { ex.printStackTrace(); } // 实际项目中应该记录日志 System.err.println("创建用户失败: " + e.getMessage()); } }6. 使用IntelliJ IDEA的数据库工具
IntelliJ IDEA自带了强大的数据库工具,可以极大提高开发效率:
- 点击右侧边栏的"Database"标签
- 点击"+"添加MySQL数据源
- 填写连接信息后测试连接
- 连接成功后可以直接查看和编辑数据
这个工具特别适合快速验证SQL语句和查看数据变化,比命令行方便多了。我经常用它来快速检查程序操作后的数据状态。
7. 进阶技巧
当你掌握了基本操作后,可以考虑以下进阶内容:
- 使用连接池:如HikariCP,可以显著提高性能
- ORM框架:MyBatis或Hibernate可以简化数据库操作
- 分页查询:使用LIMIT和OFFSET实现
- 批量操作:addBatch()和executeBatch()提高批量插入效率
这里展示一个简单的批量插入示例:
public static void batchInsertUsers(List<User> users) { String sql = "INSERT INTO users(username, email) VALUES(?, ?)"; try (Connection conn = DbUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { conn.setAutoCommit(false); for (User user : users) { pstmt.setString(1, user.getUsername()); pstmt.setString(2, user.getEmail()); pstmt.addBatch(); } int[] results = pstmt.executeBatch(); conn.commit(); System.out.println("批量插入完成,影响行数: " + Arrays.stream(results).sum()); } catch (SQLException e) { e.printStackTrace(); } }8. 常见问题排查
在开发过程中,你可能会遇到以下问题:
- 驱动类找不到:检查驱动版本和类名是否正确
- 时区问题:在连接URL中添加serverTimezone参数
- SSL警告:添加useSSL=false参数
- 连接超时:检查MySQL服务是否启动,防火墙设置
一个完整的连接URL示例:
jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true我在实际项目中发现,MySQL 8.0的时区和SSL问题是最常见的连接障碍,特别是对于新手来说。记住这些参数可以节省大量调试时间。
编程学习
技术分享
实战经验