IDEA连接MySQL数据库实战:从配置到代码查询(手把手教学)
1. 环境准备与MySQL安装如果你是第一次接触MySQL别担心我会从最基础的安装开始带你操作。MySQL作为最流行的开源关系型数据库安装过程其实比想象中简单。我推荐直接从MySQL官网下载社区版这是完全免费的版本足够我们日常开发使用。安装过程中有几个关键点需要注意首先在安装类型选择时建议选Developer Default开发默认配置这样会自动安装MySQL Server和MySQL Workbench等配套工具。安装向导会提示你设置root账户密码这个密码一定要记好后面连接数据库时要用到。我见过不少新手在这里踩坑安装完就把密码忘了最后只能重装系统。安装完成后建议在命令行输入mysql -u root -p测试是否能正常登录。如果出现ERROR 2003 (HY000)这样的错误通常是MySQL服务没有启动。这时候可以在Windows服务管理中找到MySQL服务手动启动或者在Mac/Linux系统使用sudo service mysql start命令启动服务。2. IDEA配置MySQL数据源现在来到IDEA部分我使用的是2023.2版本不同版本界面可能略有差异但基本逻辑相同。打开IDEA后首先找到右侧的Database工具栏如果没有显示可以通过View - Tool Windows - Database调出。点击左上角的号选择Data Source - MySQL这时会弹出连接配置窗口。这里有几个关键配置项需要填写Host本地开发填写localhost即可Port默认3306除非你修改过MySQL端口User和Password填写安装MySQL时设置的root账号和密码Database这里可以填写你已经创建的数据库名或者留空稍后再选点击Test Connection测试连接时可能会遇到两个常见错误。一个是时区问题报错信息会提到The server time zone value...这时需要在Advanced选项卡中添加serverTimezoneUTC参数。另一个是驱动问题如果提示找不到驱动可以点击Download下载最新的MySQL驱动。连接成功后你就能在Database面板看到数据库结构了。这里有个实用技巧右键点击数据库选择Open Console可以直接在IDEA里编写和执行SQL语句比命令行方便多了。3. 创建数据库与表结构在真正开始写Java代码前我们需要先准备好测试数据。我建议新建一个专门的数据库用于练习避免误操作影响其他项目。在MySQL控制台执行CREATE DATABASE idea_demo; USE idea_demo;接下来创建一张用户表包含基本的用户信息字段CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE, age INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );插入几条测试数据INSERT INTO users (username, email, age) VALUES (张三, zhangsanexample.com, 25), (李四, lisiexample.com, 30), (王五, wangwuexample.com, 28);这些SQL语句可以直接在IDEA的Database控制台中执行。执行后刷新就能看到新建的表和数据这种可视化操作对初学者特别友好。我建议你在学习阶段多尝试不同的SQL语句比如ALTER TABLE修改表结构、CREATE INDEX创建索引等IDEA的自动补全功能会让这些操作变得简单。4. Java代码连接MySQL实战现在进入最核心的部分——用Java代码连接MySQL。首先需要在项目中添加MySQL驱动依赖。如果你使用Maven在pom.xml中添加dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency基础连接代码我已经优化过多个版本这个是目前最健壮的写法public class MySQLDemo { // 数据库配置信息 private static final String URL jdbc:mysql://localhost:3306/idea_demo?useSSLfalseserverTimezoneUTC; private static final String USER root; private static final String PASSWORD 你的密码; public static void main(String[] args) { // 使用try-with-resources确保资源自动关闭 try (Connection conn DriverManager.getConnection(URL, USER, PASSWORD); Statement stmt conn.createStatement()) { // 查询所有用户 String query SELECT id, username, email, age FROM users; ResultSet rs stmt.executeQuery(query); // 处理结果集 while (rs.next()) { int id rs.getInt(id); String name rs.getString(username); 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(); } } }这段代码有几个关键改进点使用了try-with-resources语法自动关闭Connection、Statement等资源连接URL中添加了useSSLfalse和serverTimezoneUTC参数避免常见连接问题使用了printf格式化输出使日志更易读明确指定了要查询的字段而不是使用SELECT *这是更好的编程实践5. 高级查询与PreparedStatement基础查询跑通后我们来试试更实用的PreparedStatement。这种预编译语句不仅能防止SQL注入还能提高重复查询的性能。下面是一个带条件查询的例子public static void queryUsersByAge(int minAge) { String sql SELECT username, email FROM users WHERE age ?; try (Connection conn DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement pstmt conn.prepareStatement(sql)) { pstmt.setInt(1, minAge); // 设置参数值 ResultSet rs pstmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString(username) : rs.getString(email)); } } catch (SQLException e) { e.printStackTrace(); } }插入数据同样可以使用PreparedStatement这样更安全public static void addUser(String username, String email, int age) { String sql INSERT INTO users (username, email, age) VALUES (?, ?, ?); try (Connection conn DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement pstmt conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { pstmt.setString(1, username); pstmt.setString(2, email); pstmt.setInt(3, age); int affectedRows pstmt.executeUpdate(); if (affectedRows 0) { ResultSet generatedKeys pstmt.getGeneratedKeys(); if (generatedKeys.next()) { System.out.println(新增用户ID: generatedKeys.getLong(1)); } } } catch (SQLException e) { e.printStackTrace(); } }6. 事务处理与连接池在实际项目中直接使用DriverManager获取连接并不推荐更好的做法是使用连接池。这里以HikariCP为例首先添加依赖dependency groupIdcom.zaxxer/groupId artifactIdHikariCP/artifactId version5.0.1/version /dependency配置和使用连接池public class DataSourceConfig { private static final HikariDataSource dataSource; static { HikariConfig config new HikariConfig(); config.setJdbcUrl(URL); config.setUsername(USER); config.setPassword(PASSWORD); config.setMaximumPoolSize(10); config.setConnectionTimeout(30000); dataSource new HikariDataSource(config); } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } }事务处理示例public static void transferMoney(int fromId, int toId, BigDecimal amount) { Connection conn null; try { conn DataSourceConfig.getConnection(); conn.setAutoCommit(false); // 开启事务 // 扣款 PreparedStatement deduct conn.prepareStatement( UPDATE accounts SET balance balance - ? WHERE id ?); deduct.setBigDecimal(1, amount); deduct.setInt(2, fromId); deduct.executeUpdate(); // 存款 PreparedStatement add conn.prepareStatement( UPDATE accounts SET balance balance ? WHERE id ?); add.setBigDecimal(1, amount); add.setInt(2, toId); add.executeUpdate(); conn.commit(); // 提交事务 } catch (SQLException e) { if (conn ! null) { try { conn.rollback(); // 回滚事务 } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); } finally { if (conn ! null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }7. 常见问题排查在实际开发中我遇到过各种连接MySQL的问题这里分享几个典型问题的解决方法时区问题错误信息通常包含Server returns invalid timezone或The server time zone value...。解决方法是在连接URL中添加serverTimezoneUTC参数。SSL警告如果出现Establishing SSL connection without servers identity verification is not recommended警告可以添加useSSLfalse参数禁用SSL或者正确配置SSL证书。驱动类找不到确保项目中包含了正确版本的MySQL驱动Class.forName()在新版本中不是必须的但显式加载可以避免某些问题。连接泄漏总是确保Connection、Statement、ResultSet被正确关闭使用try-with-resources语法是最可靠的方式。性能问题对于频繁的数据库操作一定要使用连接池避免每次都新建连接。同时合理使用PreparedStatement的批处理功能。我在项目中还遇到过字符集问题特别是中文乱码的情况。这时需要在连接URL中指定字符集characterEncodingUTF-8。另外新版本的MySQL驱动类名是com.mysql.cj.jdbc.Driver而不是老版本的com.mysql.jdbc.Driver。