简介:《Eclipse连接MySQL数据库[参考].pdf》是一份面向 Java 初学者与 Web 开发者的入门参考,针对在 Eclipse 中配置并连接 MySQL 的常见需求,梳理了完整操作链路。资源包仅 1 个 PDF 文件,约 26KB,内容紧凑,以文字步骤、配置说明和 Java 代码片段为主,适合随查随用。文档从安装 JDK6、Tomcat6、Eclipse3.2、MySQL5.0 讲起,细化到 MySQL 配置向导中跳过注册、选择 GBK 字符集、设置 root 密码等容易忽略的细节;在 Eclipse 端则演示新建插件项目、导入 MySQL 的 JDBC 驱动包、修改插件配置文件以引用驱动,并给出创建数据库和数据表的 Java 示例程序,内容还包括通过 DriverManager 建立连接、用 Statement 执行建库建表与批处理命令,以及数据表字段和中文编码设置,可帮助读者按步骤复现环境并联通数据库。目前已有 597 人浏览学习,适合刚开始接触数据库连接的开发者借鉴;示例中的驱动加载与连接代码,也可作为日常开发模板复用。
1. Eclipse连接MySQL数据库:为什么一个连接问题能卡住半个课设组
打开百度、翻到热门的mysql安装教程、把eclipse安装教程存进收藏夹,却还是连不上数据库——这是做Java课程设计最常见的场景。Eclipse连接MySQL数据库本身不是高深技术,但它涉及四个独立环节:MySQL服务端正常监听、JDBC驱动与Eclipse的JRE匹配、连接串参数写对、防火墙放行端口。任何一个环节出错,报错信息都指向同一个词:Connection。这里想解决的问题很具体:让一个普通Java项目在Eclipse里连上本机MySQL,跑通查询并撑得起后续的增删改查。适合正在赶Java课设、想用Eclipse跑数据库示例,以及刚换了Eclipse版本导致旧连接全挂的读者。下面从版本选型开始,一直讲到坑和连接串精调。
2. 版本选型:连接成败通常在这里定
2.1 MySQL 5.7与8.x:驱动类和认证方式都变了
MySQL 8.0是一个分水岭。5.7及更早版本默认使用mysql_native_password认证插件,而8.0默认改成了caching_sha2_password。这个变化直接决定了你该选哪个JDBC驱动。网上大量老教程用的是5.1.x驱动配合com.mysql.jdbc.Driver这个类名,拿这套配置去连MySQL 8.0,控制台通常会抛出Unable to load authentication plugin 'caching_sha2_password',很多人会被这个报错误导,以为是密码错了,在root账号上反复重置密码,浪费一个晚上。
Connector/J 8.0.x的驱动类名是com.mysql.cj.jdbc.Driver,这跟老款驱动不是同一个类。还有一个容易被忽略的变化:MySQL 8.0对时区校验更严格,连接串里必须显式写serverTimezone,否则启动阶段就直接报时区错误。如果你连的是5.7,用Connector/J 8.0.x依然兼容,只是要注意老项目里如果用了不需要时区参数的旧连接串,加上这个参数也不会有副作用。
除了认证插件,数据库默认字符集也从5.7的latin1变成了8.0的utf8mb4。这个变化会直接影响Eclipse里预览查询结果时的中文显示。数据库表字符集、JDBC连接串里的characterEncoding=utf8、Eclipse工作区文件编码,三层必须统一,否则查出来的中文全是问号,不是驱动问题,是编码链路问题。
确认当前MySQL版本和认证插件的方式很简单,在命令行或mysql workbench里执行:
-- 查看MySQL版本,直接决定驱动选型 SELECT VERSION(); -- 查看root账号用的认证插件 SELECT user, host, plugin FROM mysql.user WHERE user = 'root';plugin字段是caching_sha2_password就说明是MySQL 8.0的默认认证方式,必须用8.0.x驱动;如果显示mysql_native_password,老驱动也能跑,但建议还是用新驱动,毕竟新驱动向后兼容。
2.2 Eclipse与JDK组合:连接串之外最容易忽略的版本点
Eclipse本身不参与JDBC通信,真正干活的是Eclipse启动时绑定的JRE/JDK。如果你用Eclipse自带的JRE跑一个编译级别为Java 8的项目,而mysql-connector-java 8.0.x编译时要求JDK 8以上,通常没问题;但较新的Eclipse版本捆绑的JDK版本已经到17甚至21,这时项目编译级别如果还停留在1.7,驱动类加载会出现UnsupportedClassVersionError。这不是驱动程序的问题,是Eclipse的Execution Environment里选了个不存在的运行时。
常见做法是:安装Eclipse时顺便把对应的JDK装好,Eclipse 2022-03之后的版本建议直接配JDK 11或17。装完在Window > Preferences > Java > Installed JREs里确认一下当前用的JDK路径,不要以为装了JDK就自动生效。很多人的连接代码本身没写错,是Eclipse里指定的JRE路径指向了一个空的目录,运行时报java.lang.UnsupportedClassVersionError,背锅的却是驱动。
另一个容易被忽略的是MySQL的监听地址。默认情况下MySQL只绑定127.0.0.1,如果你的连接串里写的是局域网IP或者localhost之外的地址,在Windows上经常表现为连接超时。这个参数在MySQL的配置文件my.ini里的bind-address设置,课设场景下直接连localhost最省事。
2.3 一张表讲清驱动选择:推荐组合与避坑点
用一张表把选择汇总,方便对着抄作业:
| 场景 | MySQL版本 | 推荐驱动 | Driver类名 | 额外注意 |
|---|---|---|---|---|
| 本机课设 | 8.0.x | mysql-connector-j 8.0.x | com.mysql.cj.jdbc.Driver | 连接串必须带serverTimezone |
| 老项目维护 | 5.7.x | mysql-connector-java 5.1.49 | com.mysql.jdbc.Driver | 认证插件保持native_password |
| 远程服务器 | 8.0.x | mysql-connector-j 8.0.x | com.mysql.cj.jdbc.Driver | 防火墙放行3306、bind-address |
这张表基本覆盖了新手阶段所有组合。最简单的判断逻辑是:先用mysql workbench或navicat连一下。可视化工具能连上,说明MySQL服务端没问题,问题在Eclipse侧的驱动和连接串;可视化工具也连不上,先别查代码,回头检查mysql安装配置教程里的服务启动、端口监听和防火墙三个点。这个排查顺序能省下大量冤枉时间。版本匹配这件事没有玄学,全是版本号和类名的一一对应关系,对不上就翻车。
3. 把驱动导入Eclipse:手动jar与Maven两种路径
3.1 手动下载jar并加入Build Path
学习阶段最稳的方式是把驱动jar直接放进项目里。流程分两步:先拿到jar,再告诉Eclipse这个jar是编译依赖。如果按mysql安装配置教程装的是MySQL 8.0,就去MySQL官方下载页选Connector/J 8.0.x,解压zip包后只需要里面那个mysql-connector-j-8.0.x.jar文件,旧版本命名则是mysql-connector-java-8.0.x.jar。
拿到jar之后,在Eclipse里右键项目 > Build Path > Configure Build Path > Libraries > Add External JARs,选中刚才那个jar。这一步的作用是让Eclipse编译时能找到Driver类,否则写Class.forName("com.mysql.cj.jdbc.Driver")时直接标红。
这里有一个历史坑:老教材喜欢教人把jar复制到$JAVA_HOME/lib/ext目录,这种方式在JDK 8时代还能用,但JDK 9以后ext目录机制已经移除,复制进去完全不会被加载。如果你在网上搜到这类老教程,直接跳过,用Build Path的方式才是当前可靠做法。
手动导入驱动不会污染全局环境,因为它只是项目内的一个引用,jar本身没有被复制到Eclipse安装目录。这也是它适合做课设的原因——换一台电脑重新导入一次就行。
3.2 Maven项目用dependency声明
如果项目是Maven工程,不需要手动下载jar,直接在pom.xml里声明依赖:
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency>这里要注意MySQL官方在8.0.31左右调整了Maven坐标:旧坐标是mysql:mysql-connector-java,新坐标是com.mysql:mysql-connector-j。搜索依赖时看到两种写法都正常,建议优先选新版坐标。groupId和artifactId是Maven定位依赖的唯一依据,版本号建议选8.0.x中较新的稳定版。
声明完依赖后,右键项目 > Maven > Update Project,等下载完成。如果Eclipse报了an internal error occurred during: "updating maven project",多半是本地Maven仓库里有下载到一半的损坏文件。去用户目录下的.m2/repository/com/mysql目录删掉对应文件夹,重新Update一次就能解决。
3.3 导入后怎么验证驱动真的进来了
光加入依赖不等于连接能通,建议写一行代码验证类是否能被加载:
// 验证驱动类在当前classpath中是否能被加载 // 这一步把问题分成"类路径问题"和"连接问题"两个方向 try { Class.forName("com.mysql.cj.jdbc.Driver"); System.out.println("驱动加载成功"); } catch (ClassNotFoundException e) { System.out.println("驱动加载失败: " + e.getMessage()); }如果输出驱动加载失败,先检查类名是不是写成了老版的com.mysql.jdbc.Driver。驱动是8.0.x时应该用com.mysql.cj.jdbc.Driver;驱动是5.1.x时com.mysql.cj.jdbc.Driver这个类不存在,必须用旧类名。再检查jar是不是真的出现在项目的Referenced Libraries里。这段验证代码能在写完整连接逻辑之前,把排查范围缩小一半,是一个性价比很高的习惯。
4. 从空项目到第一条SELECT:最小可复现连接流程
4.1 建项目与连接串参数的取舍
在Eclipse里新建一个普通Java项目,不需要勾选任何模板。连接串是这个流程里唯一的配置,格式是:
jdbc:mysql://主机:端口/数据库名?参数1=值1&参数2=值2新手阶段最少要写三个参数:serverTimezone、characterEncoding、useSSL。serverTimezone解决时区报错;characterEncoding解决中文乱码;useSSL=false关掉本地开发时没有意义的SSL握手,顺便消掉那一大段SSL警告。
数据库名要提前建好,用mysql workbench执行一条建库语句即可:
-- 建库时直接指定utf8mb4,避免后面中文乱码 CREATE DATABASE testdb DEFAULT CHARACTER SET utf8mb4;注意建库语句里的DEFAULT CHARACTER SET utf8mb4不能省。如果MySQL实例是8.0,建库不指定字符集也能继承默认的utf8mb4;但如果服务器是5.7,默认可能是latin1,后续存中文会报Incorrect string value错误。这个坑会在第5章详细展开。
4.2 连接代码与逐参数说明
下面是完整的Java代码,可以直接复制到项目里运行:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class MySQLTest { public static void main(String[] args) { // 数据库地址:localhost表示本机,3306是MySQL默认端口 String url = "jdbc:mysql://localhost:3306/testdb" + "?serverTimezone=Asia/Shanghai" + "&characterEncoding=utf8" + "&useSSL=false"; String user = "root"; String password = "你的密码"; // 1. 加载驱动,确保classpath中有mysql-connector-j try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { System.out.println("驱动类未找到,请检查jar是否导入"); return; } // 2. 建立连接,try-with-resources自动释放资源 try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement()) { // 3. 执行查询并遍历结果集 ResultSet rs = stmt.executeQuery("SELECT id, name FROM user"); while (rs.next()) { System.out.println(rs.getInt("id") + " - " + rs.getString("name")); } rs.close(); } catch (Exception e) { e.printStackTrace(); } } }代码里有几个关键点值得展开。Class.forName这行在Connector/J 8.0里其实可以省略,驱动会通过SPI机制自动注册,但保留的好处是驱动类名写错时能第一时间暴露问题,而不是等到getConnection阶段报一个更模糊的错误。
try-with-resources写法保证Connection和Statement用完后自动关闭,这比手动在finally里close()更不容易漏。ResultSet也要记得关,代码里手动调用rs.close(),这样连接资源能及时释放回给MySQL。
查询用的是Statement,它只适合固定SQL。后面要做变量拼接时,应该换成PreparedStatement,既防止SQL注入,也便于执行mysql update语法和参数化查询。连接串参数再拆一遍:serverTimezone=Asia/Shanghai是必须的,不写会报时区错误;characterEncoding=utf8要和数据库的utf8mb4对齐;useSSL=false是本地开发的常见选择,生产环境建议开启。
提示:连接串里的参数用
&连接。如果把&写成了&,驱动会把整段参数当成一个未知属性,可能导致getConnection阶段报错。
4.3 资源关闭顺序与常见误用
资源关闭顺序是ResultSet->Statement->Connection,反着关虽然一般不会报错,但规范上应该逆序释放。如果频繁开关连接,性能上会有明显损耗,这就是下一阶段连接池要解决的问题。
另一个常见误用是把Class.forName写在main方法体之外。有人喜欢把它放到静态初始化块里,这没问题;但要注意Class.forName抛的是ClassNotFoundException,属于受检异常,静态块里要么try-catch要么throws,选了后者会导致类加载阶段抛ExceptionInInitializerError,排查起来比普通异常难得多。最简单的方法就是像上面代码那样,放main方法里。
5. 避坑记录:Eclipse连MySQL的高频翻车现场
5.1 ClassNotFoundException: com.mysql.cj.jdbc.Driver
现象:运行代码第一行就报ClassNotFoundException,提示找不到com.mysql.cj.jdbc.Driver。
原因:三种常见可能。一是jar确实没有进到项目的classpath,Build Path里看不到驱动文件;二是项目里导入的是5.1.x老驱动,其中没有com.mysql.cj.jdbc.Driver这个类;三是在Maven项目里依赖声明了但没触发下载,本地仓库处于损坏状态。
解决:先按第3.3节的验证代码确认classpath;再核对驱动jar版本与类名的对应关系;如果是Maven项目,检查项目的Referenced Libraries里是否有带红叉的占位,有就删除本地仓库对应目录重新Update。这个报错是新手第一个晚上过不去的点,但本质只是类路径问题,不涉及任何数据库配置。
5.2 Communications link failure:端口、防火墙与服务没起来
现象:报Communications link failure,或者更直接的Connection refused: connect。
原因:服务端根本没有在3306端口上监听,或者JVM到MySQL之间的网络被防火墙拦截。很多mysql安装配置教程不会告诉你怎么确认服务已经起来,尤其Windows上装完MySQL后服务没有设为自动启动,重启电脑后服务不在了,但Eclipse代码还按原来的写法连。
解决:先用命令确认监听情况:
# Windows下查看3306端口是否在监听 netstat -an | findstr 3306 # Linux/macOS下对应命令 ss -ant | grep 3306如果输出里没有3306,打开Windows服务管理器找到MySQL服务手动启动,并设置为自动启动。如果端口在监听但连接依然超时,检查防火墙是否放行,或者先用localhost连一次排除网络因素。还有一种情况是机器上装过多个MySQL实例,第二个实例端口换成了3307,连接串里还在用3306,这种通过SHOW VARIABLES LIKE 'port';查一下实际端口即可。
5.3 Access denied for user 'root'@'localhost'
现象:驱动加载成功,但连接阶段报Access denied for user 'root'@'localhost'。
原因:密码不对,或者root账号的主机限制不是localhost。课设里的常见情况是,连接串里的密码带了#、&这类特殊字符,而URL中没有做编码,导致驱动把密码截断了。另外一个常见场景是MySQL安装时设置过密码,但后来用mysql workbench重置过,Eclipse里还留着旧密码。
解决:先用mysql workbench或命令行登录验证密码是否真的对。确认密码后,如果含特殊字符,推荐用Properties对象传递用户和密码,而不是拼在URL里:
Properties props = new Properties(); props.setProperty("user", "root"); props.setProperty("password", "your#pass&word"); // props.setProperty("serverTimezone", "Asia/Shanghai"); Connection conn = DriverManager.getConnection(url, props);Properties方式绕开了URL特殊字符转义的问题,这是处理复杂密码最稳妥的做法。如果确认是远程连接被拒,那是MySQL用户表里host字段限制,需要在MySQL里单独授权,不要在课设阶段纠结这个。这里有个血泪经验:在生产库上做权限调整之前,务必先备份。
5.4 The server time zone value 'CST'错误
现象:报错信息长这样:The server time zone value 'CST' is unrecognized or represents more than one time zone,后面还跟着一大段英文堆栈。
原因:MySQL 8.0的时区校验变严格了,连接串不显式指定时区,驱动就读系统时区。Windows中文系统下,MySQL返回的时区格式驱动可能解析不了,导致报错。这个问题不解决,后面的连接根本建立不起来,属于卡脖子的第一道坎。
解决:连接串上加serverTimezone=Asia/Shanghai。如果加了还是报错,检查连接串里的+号,比如serverTimezone=GMT+8这种写法会把+解析成空格,正确写法是serverTimezone=GMT%2B8。这个编码细节很坑,很多人死磕时区参数半天,其实是+号没有转义。
5.5 中文乱码:三层编码必须统一
现象:表里存进去的是中文,查出来是问号;或者插入数据时直接报Incorrect string value: '\xE4\xB8\xAD...'。
原因:数据库表的字符集、JDBC连接串的characterEncoding、Eclipse工作区文件编码,三层只要有一层不统一就会出现乱码。最常见的组合是:数据库8.0默认utf8mb4没问题,但连接串里没写characterEncoding=utf8,Eclipse工作区文件编码又是GBK,三层连锁出错。
解决:按顺序统一三步。第一步保证建库建表时指定了DEFAULT CHARACTER SET utf8mb4;第二步连接串里带characterEncoding=utf8;第三步在Eclipse的Window > Preferences > General > Workspace里把Text file encoding改成UTF-8。三层都对齐,乱码问题基本消失。数据库同步软件或第三方工具导入时如果有乱码,排查思路也是从这三个层面入手,先看工具连接串有没有带编码参数。
6. 连接串参数精调与连接池初用:把课设代码往工程靠一步
6.1 必调参数与超时控制
等基本连接跑通,下一步值得做的是把连接串从"最小能用"改成"更能扛事"。比如加上connectTimeout=3000和socketTimeout=5000,数据库挂掉时Eclipse不会干等默认的几十秒才报错。再加rewriteBatchedStatements=true,批量插入时性能提升明显,这个参数对用Statement.executeBatch()的场景尤其关键。这些都是驱动自带的连接属性,改连接串就够了。
6.2 用连接池替掉DriverManager
课设里直接用DriverManager没问题,但后面做Servlet或Spring项目时,每个请求都开一次物理连接,累积起来损耗很明显。常见做法是引入HikariCP,配置只有几行:
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/testdb?serverTimezone=Asia/Shanghai&useSSL=false"); config.setUsername("root"); config.setPassword("你的密码"); config.setMaximumPoolSize(10); config.setConnectionTimeout(3000); HikariDataSource ds = new HikariDataSource(config);之后从ds.getConnection()拿连接,用法和DriverManager一样,但连接是复用的。验证连接池是否生效有一个小技巧:连续调用十次getConnection()并打印对象的toString,如果看到的是同一个代理连接,说明复用生效了。
这也是我自己带项目时的固定检查顺序:先用mysql workbench验服务端,再用一行Class.forName验驱动,最后才写完整连接逻辑——每次有人来问为什么连不上,按这个顺序查下来,八九成都在前两步。连接串的写法看起来是细节,实际上参数、编码、版本三者全对齐后,Eclipse连接MySQL很少再出幺蛾子。希望帮到你。
本文还有配套的精品资源,点击获取