【Java】IntelliJ IDEA 通过JDBC连接MySQL数据库实现数据增删改查
1. 环境准备与项目创建在开始之前我们需要确保开发环境已经准备就绪。首先你需要安装以下软件IntelliJ IDEA推荐使用最新版本社区版或旗舰版均可MySQL数据库建议使用5.7或8.0版本JDKJava开发工具包建议使用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 Library2.2 使用Maven管理依赖推荐如果你使用Maven只需在pom.xml中添加dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.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?useSSLfalseserverTimezoneUTC; 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 插入数据Createpublic 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 查询数据Readpublic 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 更新数据Updatepublic 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 删除数据Deletepublic 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(ListUser 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警告添加useSSLfalse参数连接超时检查MySQL服务是否启动防火墙设置一个完整的连接URL示例jdbc:mysql://localhost:3306/test_db?useSSLfalseserverTimezoneUTCallowPublicKeyRetrievaltrue我在实际项目中发现MySQL 8.0的时区和SSL问题是最常见的连接障碍特别是对于新手来说。记住这些参数可以节省大量调试时间。