
简介这是一份面向Java初学者的Eclipse连接MySQL数据库操作指南内容围绕开发环境搭建与数据库连接展开。文档从安装JDK、Tomcat、Eclipse和MySQL讲起详细描述MySQL配置向导中的字符集选择、管理员密码设置、配置文件生成等环节随后进入Eclipse插件开发场景说明如何新建插件项目、复制并引用JDBC驱动包、修改插件配置文件并给出完整的Java示例代码。示例代码涵盖了加载数据库驱动、建立连接、创建语句对象、执行批量操作等基础写法可直接用于创建数据库、数据表以及实现数据插入与查询。这些内容能帮助读者理解集成开发环境与数据库管理系统的协作方式减少环境配置阶段常见的报错困扰同时为后续学习Java数据库编程打下基础。资源为单文件PDF大小仅26KB查阅方便目前已有597人学习使用适合正在完成Java课程设计、毕业设计或希望快速上手Eclipse加MySQL开发的初学者。1. 老文档里的 Eclipse 连 MySQL换个版本照样跑通的完整路径这份《Eclipse 连接 MySQL 数据库[参考].pdf》是十几年前的技术笔记讲的是 JDK 1.6、Tomcat 6.0、Eclipse 3.2、MySQL 5.0 这一套老组合核心思路是用 JDBC 驱动让 Eclipse 里的 Java 程序操作 MySQL。放到今天来看工具版本早就换代了但里边的技术主线——驱动怎么放、URL 怎么拼、建库建表怎么写、字符集怎么处理——依然是我现在排查连接问题时的底层框架。这篇笔记就是带你把它拆开对照当代环境全部重跑一遍让你既能看懂老文档在说什么也能在今天的工作里直接用上这套方法。适合正在学 JDBC、被乱码折磨、或者拿到老项目代码不知道怎么迁移的人。2. 环境准备老文档的软件组合与新版本对应关系2.1 为什么老文档的版本不能直接照搬文档里推荐的 JDK 1.6 和 Tomcat 6.0 已经是十几年前的东西JDK 1.6 早就停止公开更新Eclipse 3.2 的插件机制也和现在差别很大。直接照文档装一套老环境大概率会遇到系统不兼容、软件下载不到、安全证书过期等问题。但这不意味着文档失效它的核心方法论没变JDK 提供 Java 运行环境Tomcat 提供 Web 容器Eclipse 提供开发界面MySQL 存数据JDBC 驱动负责让 Java 程序和 MySQL 对话。提示复现这套流程前先确认你的电脑上已经装好 JDK 8 或更高版本、Eclipse IDE for Java Developers、MySQL 5.7 或 8.0。版本不同后面的驱动参数写法会有差异。我现在用的组合是 JDK 8 Eclipse 2023-06 MySQL 8.0这几个版本在官网上都能直接下载安装过程也简单。如果你机器上已经装了新版 MySQL就不用再折腾老版本如果还没装建议直接上 MySQL 8.0因为 5.x 版本的密码认证插件和 8.0 不一样容易在连接时报错。JDK 安装完记得配环境变量。老文档里把驱动 jar 包放进 classpath 的做法在 Eclipse 里其实不需要了——Eclipse 会自己管理构建路径你在项目里添加外部 jar 包就行这一点文档里也提到了做法完全一致。2.2 新版 JDBC 驱动的下载与放置路径文档里用的是mysql-connector-java-3.1.6-bin.jar这个版本太老不支持 MySQL 5.7 之后默认的认证方式而且 8.0 版本的驱动 jar 包名也变了。现在官方推荐的是mysql-connector-j-8.x.x.jar下载地址在 MySQL 官网的 Connector/J 页面。驱动 jar 包不需要安装解压后把那个.jar文件复制到项目的lib文件夹里就行。如果是普通 Java 项目就在 Eclipse 里右键项目 → Build Path → Configure Build Path → Libraries → Add External JARs选中你下载的 jar 包。这一步做过之后代码里import com.mysql.cj.jdbc.Driver就不会报错了。老文档还提到要把 jar 包复制到 Tomcat 的common/lib和shared/lib目录这是给 JSP 项目用的。新版 Tomcat 没有这两个目录了统一放lib目录下。但如果你只是做 Java 程序连数据库测试放在项目的构建路径里就够用不用折腾 Tomcat。# 我的本地文件存放路径示例 D:\dev\mysql-connector-j-8.0.33\mysql-connector-j-8.0.33.jar这段路径只是举例你下载后放在哪个目录都行关键是让 Eclipse 构建路径能引用到它。2.3 MySQL 服务启动确认文档里特意提醒过安装完 MySQL 后要确认服务有没有启动否则连接会报错。这一步到今天依然关键而且在 Windows 上翻车的概率不小。很多人安装 MySQL 时选了不注册为 Windows 服务装完直接运行连接就报错。# 检查 MySQL 服务状态 services.msc # 或者用命令行查看 sc query mysqlservices.msc打开服务管理器找名字叫 MySQL 或 MySQL80 的服务看状态是不是“正在运行”。如果没启动右键启动。更稳妥的做法是把启动类型改为“自动”免得每次开机都要手动启动一次。3. 从建库到查询重写 createDB 与 InsertAndSelect3.1 驱动加载与连接字符串的参数拆解老文档的代码里第一步是Class.forName(com.mysql.jdbc.Driver)这一步在驱动 8.0 版本里写法变了。老驱动类的包名是com.mysql.jdbc.Driver新驱动改成了com.mysql.cj.jdbc.Driver而且从 JDBC 4.0 开始驱动程序会自动加载这一步其实可以省略。但省略归省略写上也不报错只是类名要用新的。连接字符串的差别更值得注意。文档里用的是jdbc:mysql://localhost/test?useUnicosetruecharacterEncodingutf8注意这里有个笔误useUnicose应该是useUnicode。这行在老版本 MySQL 里能跑通但在 MySQL 8.0 里需要加上时区参数否则会报The server time zone value之类的错误。新版写法是jdbc:mysql://localhost:3306/test?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghailocalhost:3306里 3306 是 MySQL 默认端口如果你安装时改过端口这里要跟着改。serverTimezoneAsia/Shanghai是告诉驱动用东八区时间避免时区差异导致的报错。3.2 建库建表代码批处理执行与 InnoDB 引擎老文档里的 createDB.java 思路很好用Statement的批处理功能一次性完成删库、建库、建表。这个逻辑在新版本里完全可以复用只需要替换驱动加载的类名和连接参数。我按新版驱动重写了一份package cn.com.example.sms; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class CreateDB { public static void main(String[] args) { Connection con null; Statement sm null; try { // 装载 JDBC 驱动新版驱动类名与老版本不同 Class.forName(com.mysql.cj.jdbc.Driver); // 连接数据库注意 serverTimezone 参数必填 con DriverManager.getConnection( jdbc:mysql://localhost:3306/test?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai, root, 123456); // 创建语句对象 sm con.createStatement(); // 如果存在 sms 先删除它再创建 sm.addBatch(DROP DATABASE IF EXISTS sms;); sm.addBatch(CREATE DATABASE sms;); // 将当前的数据库转到 sms sm.addBatch(USE sms;); // 如果存在 test_table 表就先删除它再创建 sm.addBatch(DROP TABLE IF EXISTS test_table;); // 得到创建数据表的 SQL 语句 StringBuilder sb new StringBuilder(); sb.append(CREATE TABLE test_table(); sb.append(Id int(6) unsigned NOT NULL auto_increment,); sb.append(name0 varchar(10) default NULL,); sb.append(name1 varchar(10) character set gb2312 default NULL,); sb.append(name2 varchar(10) character set gbk default NULL,); sb.append(PRIMARY KEY (Id)); // 使用 InnoDB 引擎并设置默认字符集 sb.append() ENGINEInnoDB DEFAULT CHARSETutf8;); sm.addBatch(sb.toString()); // 提交执行批处理 sm.executeBatch(); System.out.println(数据库 sms 和表 test_table 创建成功); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭 Statement if (sm ! null) { try { sm.close(); } catch (SQLException e) { } sm null; } // 关闭 Connection if (con ! null) { try { con.close(); } catch (SQLException e) { } con null; } } } }这段代码沿用了老文档的批处理思路addBatch()方法把多条 SQL 放进一个批次executeBatch()一次性提交执行。这样做的好处是减少客户端和数据库之间的通信次数建库建表这种多条 SQL 一起执行的场景非常适合。参数上我把驱动类名改成了com.mysql.cj.jdbc.DriverURL 里加了serverTimezoneAsia/Shanghai。字符集方面useUnicodetruecharacterEncodingutf8是告诉 MySQL 用 UTF-8 编码传输数据。表结构里特意保留了gb2312和gbk字符集的字段这是老文档用来演示字符集差异的设计下一章会详细解释。3.3 插入与查询ExecuteUpdate 与 ResultSet 遍历老文档里的 InsertAndSelect.java 演示了插入和查询两条路径executeUpdate()执行插入executeQuery()执行查询并返回 ResultSet。这段代码今天依然可以直接用只需要改驱动类名和连接参数。我按原逻辑重写package cn.com.example.sms; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class InsertAndSelect { public static void main(String[] args) { Connection con null; Statement sm null; ResultSet rs null; try { // 装载 JDBC 驱动 Class.forName(com.mysql.cj.jdbc.Driver); // 连接数据库这里直接连到 sms 库 con DriverManager.getConnection( jdbc:mysql://localhost:3306/sms?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai, root, 123456); // 创建语句对象 sm con.createStatement(); // 清空表数据避免重复插入 sm.executeUpdate(DELETE FROM test_table); String s jerry; // 向不同字符集的字段分别插入数据 sm.executeUpdate(INSERT INTO test_table(name0) VALUES ( s )); sm.executeUpdate(INSERT INTO test_table(name1) VALUES ( s )); sm.executeUpdate(INSERT INTO test_table(name2) VALUES ( s )); // 查询所有数据 rs sm.executeQuery(SELECT * FROM test_table); // 遍历结果集并打印 while (rs.next()) { System.out.println(rs.getInt(id) _ rs.getString(name0) _ rs.getString(name1) _ rs.getString(name2)); } } catch (Exception e) { e.printStackTrace(); } finally { // 依次关闭 ResultSet、Statement、Connection if (rs ! null) { try { rs.close(); } catch (SQLException e) { } rs null; } if (sm ! null) { try { sm.close(); } catch (SQLException e) { } sm null; } if (con ! null) { try { con.close(); } catch (SQLException e) { } con null; } } } }运行后的输出应该和老文档一致三条记录jerry分别落在name0、name1、name2字段里其余字段为null。这说明三个字段都成功写入数据但它们的字符集不同这正是下一章要展开的乱码问题。这里有个细节值得说明老文档用字符串拼接的方式构造 SQL在实际项目里应该用PreparedStatement做参数预编译防止 SQL 注入。但这个例子的目的是演示 JDBC 基本流程拼接写法容易看懂我先保留原样。4. 避坑指南字符集配置与驱动加载的五个常见问题4.1 驱动类找不到或版本不匹配现象运行程序时抛出ClassNotFoundException: com.mysql.jdbc.Driver。原因你用的驱动 jar 包是 8.0 版本但代码里写的还是老包名com.mysql.jdbc.Driver新驱动把这个类挪到了com.mysql.cj.jdbc.Driver下老名字只是做了个兼容转发。如果 jar 包本身就老比如 3.x 版本又不支持新 MySQL 的加密协议。解决确认 jar 包版本和代码里的类名一致。8.0 驱动用com.mysql.cj.jdbc.Driver5.1 驱动可以用com.mysql.jdbc.Driver但建议统一升级到 8.x。另外检查一下 jar 包是不是真的加进了项目的构建路径没有的话代码里能看到 import 不报错但不代表运行时能找到。4.2 连接超时或拒绝访问现象报Communications link failure或Connection refused。原因这个报错背后有三个常见因素。一是 MySQL 服务没启动文档里就强调过要确认服务运行二是连接 URL 里的端口和 MySQL 实际端口不一致不是所有 MySQL 都用 3306三是 MySQL 8.0 默认的认证插件是caching_sha2_password老驱动不认导致握手失败。解决先用services.msc确认 MySQL 服务状态。再检查端口用命令行登录 MySQL 执行SHOW VARIABLES LIKE port;查端口。如果是认证插件问题换 8.0 版本的驱动就解决了不用额外配置。4.3 字符集乱码连接层三层都要指定现象插入中文字符串后查询出来显示???或者类似乱码。原因MySQL 的字符集问题至少涉及三层客户端连接字符集、数据库表字符集、字段字符集。老文档里用三个字段分别指定gb2312和gbk是想测试不同字符集的存储但连接层的 URL 里如果没指定characterEncodingutf8Java 程序发送的中文到 MySQL 就被当成了默认字符集可能是 latin1处理存进去就乱了。解决三层都要统一。URL 里加useUnicodetruecharacterEncodingutf8建库语句加DEFAULT CHARSETutf8建表语句指定ENGINEInnoDB DEFAULT CHARSETutf8。注意gb2312和gbk字段是故意为之的实验实际项目里统一用utf8或utf8mb4别混用。我一般把utf8mb4作为首选因为它能存 emoji 和特殊字符utf8在 MySQL 里其实是utf8mb3只能存基本多语言平面。4.4 useUnicose 笔误引发的思考现象老文档里的 URL 参数拼写为useUnicose但程序跑通了。原因MySql 驱动对未知参数的处理方式是忽略不会报错。所以这个拼写错误不影响连接建立但characterEncodingutf8是否生效取决于驱动内部对编码参数的解析路径useUnicode才是真正让字符集参数生效的开关。这里其实埋了个隐患如果只写了useUnicosetrue而没写characterEncoding连接会建立但中文传输可能乱码。解决核对 URL 每个参数拼写。老文档能跑通不代表写法正确我在这类老资料里见过不少拼写错误和过期写法实操前多留个心眼。正确写法是useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai。4.5 ResultSet 字段名大小写问题现象用rs.getString(Name)查询时返回null但表字段明明叫Name。原因MySQL 在 Windows 上表名字段名大小写不敏感但 JDBC 返回的元数据可能保留了建表时的大小写写法。老文档里的表字段是Id和name0如果查询时写成rs.getString(id)在有些驱动版本里查不到。解决统一用小写的字段名访问或者建表时全部用小写字母加下划线。Java 代码里访问 ResultSet 时字段名和表结构保持一致。我一般在建表 SQL 里就定好命名规范全小写加下划线代码里用同样的名字取数据这样最省事。5. 字符集配置的完整实验从连接参数到字段编码5.1 三层字符集的设置顺序与作用范围MySQL 的字符集配置不是一锤子买卖从上到下分三层服务器层、数据库表层、连接层。服务器层在安装时或my.ini配置文件里设置数据库表层在建库建表语句里设置连接层在 JDBC URL 里设置。三层优先级从低到高是服务器层默认值会被建库语句覆盖建库语句默认值会被建表语句覆盖连接参数决定本次会话传输的编码方式。文档里 MySQL 配置向导选了gbk字符集写进了my.ini这就是服务器层的字符集。而建库语句里DEFAULT CHARSETutf8覆盖了服务器层的gbk表字段里又混了gb2312和gbk。这套设计现在看起来是过早年代的用法但也意外地成了很好的教学案例让你亲眼看到不同层设置不同字符集时数据是怎么被逐步转换的。# 查看 MySQL 当前字符集配置 SHOW VARIABLES LIKE character_set_%;执行这条命令能看到character_set_server、character_set_database、character_set_connection等一串变量。如果安装时向导选了gbkcharacter_set_server会显示gbk。这时候你建库时指定utf8那这个库自己的character_set_database就是utf8独立于服务器的gbk。5.2 三个字段三种编码的存储实验老文档里设计的表结构很巧妙name0用默认字符集name1用gb2312name2用gbk连接参数用utf8。插入同样的英文jerry时三条记录都能正常写入因为英文 ASCII 在utf8、gb2312、gbk里的编码是一致的不存在转换问题。但如果插入中文字符结果就不一样了。utf8连接层把 Java 字符串转成utf8字节流发给 MySQLMySQL 收到后根据字段的字符集再做一次转换。gbk字段能存下utf8编码的中文因为gbk编码集大于utf8基本汉字范围但gb2312字段就不一定了——gb2312只覆盖常用汉字遇到生僻字直接报错或存成?。处理乱码时把这三层看成三段管道哪一段的口径不一致数据就会出差错。我的习惯是服务器层不管建库统一utf8mb4连接 URL 固定utf8代码文件编码统一 UTF-8再没出过乱码。5.3 跨地区部署时的字符集选型建议如果你的程序要部署到不同国家和地区字符集选型上有个经典方案数据库统一utf8mb4连接参数统一utf8应用层用 Java 的String对象直接操作不搞任何手动转码。老文档那种混合字符集的设计在单机实验里可以一旦上生产环境就是自找麻烦。-- 推荐的表结构写法 CREATE TABLE test_table ( Id int(6) unsigned NOT NULL AUTO_INCREMENT, name0 varchar(10) DEFAULT NULL, PRIMARY KEY (Id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;utf8mb4是utf8的超集能完整覆盖gb2312、gbk、big5等东亚字符集的内容。升级成本很低收益是彻底告别乱码。我接手过一个老系统数据库是latin1存中文全靠应用层转码每次导出数据到 Excel 都是灾难后来统一迁到utf8mb4才消停。6. 进阶验证用 JSP 页面做数据库连通性体检6.1 在 Eclipse 里创建动态 Web 项目文档最后提到用 JSP 连接 MySQL这是很好的验证手段因为 JSP 跑在 Tomcat 里能模拟真实 Web 应用访问数据库的完整链路。以新版 Eclipse 为例File → New → Dynamic Web Project输入项目名sms_webTarget runtime 选择你配置好的 Tomcat 版本其他选项默认即可。创建完后项目结构里会自动生成src/main/java和src/main/webapp目录。把之前下载的mysql-connector-j-8.0.33.jar复制到src/main/webapp/WEB-INF/lib目录下Tomcat 运行时会自动加载这个目录下的 jar 包。这一步不做的话JSP 页面运行时找不到 JDBC 驱动报ClassNotFoundException。如果项目里没有WEB-INF/lib目录手动新建一个就行。6.2 JSP 连接测试页面的完整代码JSP 页面的逻辑和老文档里的思路一致加载驱动、建立连接、执行查询、遍历结果集。但老文档里把数据库名写死在连接字符串里我改成了先从request参数里取取不到就用默认值。这样做的好处是页面可以复用测试不同的数据库。% page contentTypetext/html; charsetutf-8 % % page languagejava % % page importjava.sql.* % % // 连接参数从请求里取取不到用默认值 String driverName com.mysql.cj.jdbc.Driver; String userName root; String userPasswd 123456; String dbName request.getParameter(db) ! null ? request.getParameter(db) : sms; // 拼连接字符串 String url jdbc:mysql://localhost:3306/ dbName ?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai; Connection connection null; Statement statement null; ResultSet rs null; try { Class.forName(driverName); connection DriverManager.getConnection(url, userName, userPasswd); statement connection.createStatement(); // 查询数据 String sql SELECT * FROM test_table; rs statement.executeQuery(sql); out.print(h2数据库连接测试 - 当前库: dbName /h2); out.print(table border1trthID/ththname0/ththname1/ththname2/th/tr); while (rs.next()) { out.print(trtd rs.getInt(Id) /td); out.print(td rs.getString(name0) /td); out.print(td rs.getString(name1) /td); out.print(td rs.getString(name2) /td/tr); } out.print(/table); } catch (Exception e) { out.print(数据库连接失败: e.getMessage()); e.printStackTrace(); } finally { if (rs ! null) { try { rs.close(); } catch (SQLException e) { } rs null; } if (statement ! null) { try { statement.close(); } catch (SQLException e) { } statement null; } if (connection ! null) { try { connection.close(); } catch (SQLException e) { } connection null; } } %页面跑起来后用http://localhost:8080/sms_web/test.jsp访问能看到上一章插入的三条jerry记录。用http://localhost:8080/sms_web/test.jsp?dbtest访问就能连默认的 test 库。这个页面本身就是一个连通性体检工具数据库连不连得上、驱动配没配好、字符集对不对打开页面一眼就知道。6.3 从老文档到新工程的迁移清单拿到一份像这样十几年前的老文档不要急着照抄代码先做一次版本映射。我把这份文档里的关键点整理成一张迁移对照表按这个表来改代码基本不会出大问题。项目老文档新版本推荐JDK1.68 以上Eclipse3.22023 及以上Tomcat6.09 或 10MySQL5.08.0驱动 jarmysql-connector-java-3.1.6-bin.jarmysql-connector-j-8.0.33.jar驱动类名com.mysql.jdbc.Drivercom.mysql.cj.jdbc.DriverURL 参数useUnicosetruecharacterEncodingutf8useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai建库字符集跟随向导选 gbkDEFAULT CHARSETutf8mb4Tomcat jar 目录common/lib、shared/libWEB-INF/lib环境变量 classpath需要手动配置Eclipse 构建路径管理版本对上了代码的逻辑基本不用动因为 JDBC 的 API 从 JDBC 1.0 到 4.2 都是向下兼容的Connection、Statement、ResultSet这些核心接口十几年没变。变的是驱动内部的实现和连接参数的要求。6.4 最后的调试技巧快速定位连接失败的环节连接数据库报错时我有一套固定的排查顺序从外到内先看 MySQL 服务通不通再用命令行工具的mysql客户端连一次确认账号密码和端口没错最后才看 Java 代码。命令行能连上而 Java 连不上问题出在驱动或 URL命令行都连不上问题出在 MySQL 配置或服务这时候别急着改代码。# 用命令行测试 MySQL 连接 mysql -h localhost -P 3306 -u root -p123456能进到mysql提示符说明账号、密码、端口都没问题。再执行SHOW VARIABLES LIKE character_set_%;看看字符集配置。这一套走下来90% 的连接问题都能定位到具体环节。从那以后我每次配置数据库环境都强制走一遍命令行连接、查字符集、再跑 JSP 页面十分钟就能排除掉九成以上的环境坑。希望这套方法也能帮你少走弯路。本文还有配套的精品资源点击获取