1. 搭建前先想清楚:这套环境到底要准备哪些东西
做Java开发久了就会发现,很多项目不是“最新最好”,而是“够用、能跑、有人维护”就行。就拿MyEclipse来说,现在大家主力开发工具早换成了IDEA,但公司老项目、毕业论文、课程设计里,还有大量过程式项目跑在MyEclipse上。而MyBatis,作为一款灵活、侵入性低的持久层框架,在这些项目里出现频率非常高。我把在MyEclipse里从零搭建MyBatis环境的完整路径整理成一篇实操记录,适合刚开始学JDBC和框架、又必须在老版本IDE里交作业或维护旧系统的同学参考。
说句实在话,环境搭建本身不难,但它卡住人的地方特别多:版本匹配、jar包缺失、配置文件加载不到、XML和接口绑定不上,每一个都能让人白忙一下午。这篇文章不是把配置贴一遍就完事,而是把每一步为什么这么做、遇到报错怎么排查都讲清楚,你按步骤操作完,至少能跑通“查一条用户记录”这种最简单的MyBatis Demo。
1.1 MyBatis在MyEclipse里扮演什么角色,环境由哪几部分组成
想顺利搭环境,先得明白MyBatis在这套组合里到底干什么活。可以这样类比:数据库是一栋仓库,JDBC是仓库门的钥匙,MyBatis则是一个仓库管理员。你不必自己拿着钥匙进门翻箱倒柜找货,只要告诉管理员“我要哪批货”,也就是调用一个Mapper接口方法,他就会照着一份写好的清单(Mapper XML里的SQL)去仓库取货,再按你的要求整理成Java对象交给你。MyEclipse不需要参与到这个取货过程,它只负责给你提供写代码、放jar包、点运行的工作台。
所以,一套MyBatis环境的完整组成其实很清楚:
| 组成部分 | 典型代表 | 作用 |
|---|---|---|
| IDE | MyEclipse | 编辑代码、管理依赖、运行程序 |
| JDK | JDK 8 | 编译和运行Java程序的基础 |
| 数据库 | MySQL 5.7 / 8.0 | 提供真实数据存储 |
| 数据库驱动 | mysql-connector-java | 让Java代码能连上MySQL |
| MyBatis核心包 | mybatis-x.x.x.jar | 提供SqlSessionFactory、Mapper绑定等核心能力 |
| 日志组件 | log4j / log4j.properties | 打印SQL,方便调试 |
这六个部分缺一不可。很多人在MyEclipse里折腾半天跑不通,要么是JDK和IDE版本不匹配,要么是驱动包或核心包没真正加入编译路径,要么是配置文件根本没被加载到classpath。下面我把每一部分拆开讲。
1.2 环境搭建的核心思路:先确认版本,再动手
环境搭建最忌讳“抄一份配置就开跑,跑不起来再去搜报错”。我比较习惯的做法,是花十分钟把版本关系在脑子里理一遍,磨刀不误砍柴工。
先说版本选择。MyBatis 3.5.x要求JDK 8以上,而很多老版本的MyEclipse自带编译器、运行环境默认支持的就是JDK 8,所以直接选JDK 8最稳,别一上来就上JDK 17或21。数据库方面,MySQL 8.0和5.7都可以,但两者驱动类名和连接URL写法不一样,后面会单独说。MyBatis核心包选3.5.x系列即可,不用追最新,稳定优先。日志组件选log4j 1.2.17就可以,别拿log4j 2.x的jar来配log4j.properties,那是两套东西。
只要版本思路清晰,后面每一步就都是在给这个框架填肉。接下来我们一步一步准备具体组件。
2. 动手准备:JDK、数据库与依赖包一个都不能少
2.1 版本匹配:安装哪个JDK、在哪查看MyEclipse支持版本
先说JDK。打开命令行输入java -version,如果是1.8开头,说明基础环境没问题。如果已经是17或更高,而且你的MyEclipse版本比较老,我建议先装一个JDK 8,并配置好JAVA_HOME环境变量,否则后面可能出现“编译级别不对”“Unsupported major version”这类让人火大的报错。
在MyEclipse里确认JDK配置的路径是:Window -> Preferences -> Java -> Installed JREs。这里要确保你添加的是一个完整的JDK目录,而不是只有运行环境的JRE目录。特别是有些同学电脑上原本装了多个Java版本,MyEclipse默认选的可能是某一个不合适的JRE,程序编译能过,一运行就报错。
另一个容易踩的地方是编译器级别。在项目上右键 -> Properties -> Java Compiler,把Compiler compliance level设成1.8,和JDK保持一致。版本不匹配时,MyBatis初始化经常会报UnsupportedClassVersionError,这属于典型的JDK和IDE环境冲突,不是你代码写错了。
2.2 建库建表:先用命令行把数据库跑通
数据库这步,新手很容易犯一个错:在MyEclipse里配数据源连不上,就以为是配置写错了,折腾半天,结果其实是MySQL服务压根没启动,或者密码记错了。所以我建议先用命令行把数据库搞定,再回IDE里配。
打开MySQL命令行,执行下面这套建库建表SQL:
CREATE DATABASE demo CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE demo; CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, user_name VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL, email VARCHAR(100) ); INSERT INTO user(user_name, password, email) VALUES('zhangsan', '123456', 'zhangsan@example.com'); INSERT INTO user(user_name, password, email) VALUES('lisi', '654321', 'lisi@example.com');注意建库时指定utf8mb4字符集,这是为了后面中文不乱码。我在实际项目中吃过亏:数据库默认是latin1,后来写入中文全是问号,改库改表非常麻烦。这里提前用utf8mb4能省很多事。
命令行里能正常执行查询后,再用mysql -u root -p验证一下账号密码。确认数据库本身没问题,后面连接出错的排查范围就缩小到“连接配置”和“驱动”两块了。
2.3 获取MyBatis相关jar包的几种方式
环境搭建里很多人卡在jar包获取上。常见方式有三种,按推荐程度说:
第一种,手动下载jar包,放进项目lib目录。这是老MyEclipse项目最常见的做法,也适合新手,因为你能清楚看到每个jar的名字和作用,出了问题好定位。需要准备的核心jar就两个:mybatis-3.5.x.jar和mysql-connector-java-8.0.x.jar。如果你想让SQL打印到控制台,再加一个log4j-1.2.17.jar。
第二种,用Maven管理。如果你的MyEclipse项目已经接入Maven,直接在pom.xml里加依赖就行,比如MyBatis核心包的坐标:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.16</version> </dependency>Maven会自动把MyBatis的传递依赖也下载下来,省心不少。但这个方案有个前提,就是MyEclipse里Maven插件和本地仓库配置都正常,否则下载失败、依赖冲突反而更麻烦。
第三种,从现成项目里拷贝jar。如果你手上有一个能跑通的旧项目,直接把它lib目录下的jar复制过来,也是一种快速验证环境的方式。不过拷过来之后要检查版本,避免多个jar版本冲突。
我个人的建议是:学习环境搭建阶段,老老实实用第一种方式。下载地址去MyBatis官网或公共Maven仓库搜索即可,下载时注意选bin包而不是源码包。
3. 在MyEclipse中创建项目并引入依赖
3.1 先选项目类型:Java Project还是Web Project
新建项目前,先想一想你这个MyBatis环境是给谁用的。如果只是学框架、做Demo,或者后面要写独立的DAO层测试,那新建一个Java Project就够了。Java Project结构简单,不需要Tomcat,不需要部署到Web容器,直接main方法就能跑。
如果你的目标是做SSM整合、或者课程设计是一个登录注册网页,那应该建Web Project。Web Project多了一层WebContent/WEB-INF/lib的部署目录,jar包也可以放这里。
我的建议是:环境搭建阶段先建Java Project练手,因为Web项目引入Tomcat运行时、部署路径、类加载机制这些额外变量,出问题时不好判断到底是哪个环节错了。先把MyBatis本身跑通,再迁到Web项目里,思路会更清晰。
在MyEclipse里操作是:File -> New -> Java Project,填好项目名,一路Next。创建一个干净的实验项目,别在旧项目里堆,出问题不好排。
3.2 手动导入jar包的完整操作路径
项目建好后,先把之前准备的jar包放进来。我的做法是:在项目根目录手动建一个lib文件夹,把MyBatis核心包、MySQL驱动、log4j都拖进去。然后回到MyEclipse,在项目上右键,依次打开:
Build Path -> Configure Build Path -> Libraries -> Add JARs
注意这里要选Add JARs,而不是Add External JARs。这两个的区别是:Add JARs是从当前项目工作空间里选jar,路径是相对路径,项目拷到别的电脑后只要整个目录打包带走就还能用;Add External JARs是从磁盘任意位置选jar,用的是绝对路径,一旦移动过jar文件位置,路径就失效,需要重新配置。
还有一个非常常见的坑:很多人在Web项目里把jar放进了WEB-INF/lib,以为部署运行时能自动发布,就完事了。但代码里import org.apache.ibatis.session.SqlSessionFactory的时候,编辑器可能不认识这个类,因为编译期还没把它加进Build Path。解决办法很简单:就算是Web项目,也要确保jar出现在Java Build Path里。
引入完成后,展开项目里Referenced Libraries,能看到刚加入的三个jar,说明依赖进来了。
3.3 规划源码目录,让XML能进classpath
另一个新手容易忽略的问题是目录结构。MyBatis的XML配置文件非常关键,而它在运行时是放在classpath里加载的。MyEclipse里新建的Java Project默认有个src源码目录,它编译后的内容会输出到bin目录。只要XML文件放在src下面,编译后就会被自动拷贝到bin,也就是classpath,这样MyBatis才能找到它。
一个比较推荐的目录规划是这样:
MyBatisDemo ├─ src │ ├─ com.demo.pojo │ │ └─ User.java │ ├─ com.demo.mapper │ │ ├─ UserMapper.java │ │ └─ UserMapper.xml │ ├─ com.demo.utils │ │ └─ MyBatisUtil.java │ └─ mybatis-config.xml ├─ lib │ ├─ mybatis-3.5.16.jar │ ├─ mysql-connector-java-8.0.33.jar │ └─ log4j-1.2.17.jar └─ bin看到这个结构,你应该就明白一个关键点:UserMapper.xml和UserMapper.java放在同一个包路径com.demo.mapper下,这样MyBatis按接口全限定名找XML时最方便。mybatis-config.xml放在src根目录,加载时直接写"mybatis-config.xml"就行。
如果你的项目是用Maven管理的,目录通常会是src/main/java和src/main/resources,XML要放对地方,不然打出来的classpath里没有XML,运行时怎么都找不到映射文件。这个问题很多人到后面整合SSH或Spring Boot时会反复遇到。
4. 编写核心配置文件:从主配置到Mapper映射
4.1 主配置文件mybatis-config.xml的正确写法与标签顺序
MyBatis需要一个主配置文件,定义了数据库连接、类型别名、映射注册等信息。我在MyEclipse里习惯放在src根目录下,文件名就叫mybatis-config.xml。先给一份完整示例,再逐项说明关键点:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 1. 日志实现 --> <settings> <setting name="logImpl" value="LOG4J"/> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!-- 2. 类型别名 --> <typeAliases> <package name="com.demo.pojo"/> </typeAliases> <!-- 3. 环境配置 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="你的数据库密码"/> </dataSource> </environment> </environments> <!-- 4. 注册Mapper --> <mappers> <package name="com.demo.mapper"/> </mappers> </configuration>这段配置里,我用了com.mysql.cj.jdbc.Driver,这是MySQL 8.0驱动的类名。如果你用的是MySQL 5.x,驱动类名是com.mysql.jdbc.Driver,别搞混。URL里的serverTimezone=Asia/Shanghai也是MySQL 8.0驱动必须带的参数,不然会报时区错误。
关于标签顺序,我必须强调一下:MyBatis的DTD规定settings、typeAliases、environments、mappers这些元素有固定顺序,不能乱写。初学者容易把mappers写到environments前面,然后启动时报XML解析错误。如果你看到类似Content is not allowed in trailing section或者The content of element type "configuration" must match,十有八九就是标签顺序问题。按上面示例的顺序照抄,就不会错。
4.2 实体类、数据库表字段与驼峰映射
数据库表是user,字段有id、user_name、password、email。对应的Java实体类建议叫User,放在com.demo.pojo包下:
package com.demo.pojo; public class User { private Integer id; private String userName; private String password; private String email; public User() { } // 省略 getter/setter,实际开发中必须写上 }实体类字段userName对应数据库字段user_name,这种“下划线转驼峰”的映射关系,在MyBatis里默认是不开启的。所以我在主配置里特意加了:
<setting name="mapUnderscoreToCamelCase" value="true"/>开启之后,MyBatis会自动把数据库的user_name映射到实体类的userName,省去手写一堆resultMap。如果不开启,你就要手动在XML里写映射关系,代码会显得很啰嗦。这个开关我非常推荐开启,几乎适用于所有业务项目。
4.3 Mapper映射文件的三大要素:namespace、id、resultType
Mapper接口和XML映射是MyBatis的核心。先写接口,在com.demo.mapper包下新建UserMapper.java:
package com.demo.mapper; import com.demo.pojo.User; import java.util.List; public interface UserMapper { List<User> findAll(); User findById(Integer id); }再在同包下新建UserMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.demo.mapper.UserMapper"> <select id="findAll" resultType="com.demo.pojo.User"> select id, user_name, password, email from user </select> <select id="findById" resultType="com.demo.pojo.User"> select id, user_name, password, email from user where id = #{id} </select> </mapper>这里有三个要素一定要盯住:第一,namespace必须写成接口的全限定名,也就是com.demo.mapper.UserMapper,一个字符都不能差;第二,select标签的id必须和接口方法名一致,findAll就对应findAll();第三,resultType写的是查询结果每条数据的类型,是实体类的全限定名,不要写成List<User>。如果你在typeAliases里配了包扫描,也可以简写成resultType="User"。
参数占位符用#{},不要用${}。#{}是预处理参数,能有效防止SQL注入;${}是字符串拼接,一般只在动态表名、排序字段等少数场景才用。作为环境搭建阶段,统一用#{}是正确习惯。
4.4 注册Mapper并开启日志,让配置生效
写好了接口和XML,还要让MyBatis主配置知道它们的存在。mappers标签里有两种常见注册方式。一种用mapper标签写明XML路径:
<mappers> <mapper resource="com/demo/mapper/UserMapper.xml"/> </mappers>另一种用package标签按包扫描,要求接口和XML在同一个包下:
<mappers> <package name="com.demo.mapper"/> </mappers>我推荐包扫描方式,因为它省事,以后每加一个Mapper接口和XML都不用回来改主配置。但它有个前提:XML必须和接口放在同一目录,并且编译之后确实出现在classpath里。在MyEclipse的Java Project里,只要XML在src下面,这个前提是成立的。
配置日志也很重要,不然你调试时看不到SQL,出了问题只能瞎猜。在lib目录加入log4j-1.2.17.jar后,在src根目录新建log4j.properties:
log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n配合主配置里的<setting name="logImpl" value="LOG4J"/>,运行程序时控制台就会打印出MyBatis执行的SQL语句、参数和查询结果条数。后面排查问题,大部分靠这些日志就够了。
5. 跑通第一个查询:从SqlSessionFactory到结果集
5.1 用工具类封装SqlSessionFactory,避免重复构建
MyBatis官方建议一个数据库环境对应一个SqlSessionFactory实例,因为它构建成本高、线程安全,整个应用生命周期里只需要创建一次。我在Demo项目里习惯写一个工具类,用静态代码块在类加载时完成初始化:
package com.demo.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MyBatisUtil { private static SqlSessionFactory factory; static { try (InputStream is = Resources.getResourceAsStream("mybatis-config.xml")) { factory = new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { throw new ExceptionInInitializerError(e); } } public static SqlSession openSession() { return factory.openSession(); } public static SqlSession openSession(boolean autoCommit) { return factory.openSession(autoCommit); } }Resources.getResourceAsStream是MyBatis自带的加载classpath资源的工具,不是Java标准库里的。这样写的好处是,配置文件的读取和工厂创建只发生一次,后续所有Mapper调用都复用同一个SqlSessionFactory。
如果工厂创建失败,会抛出ExceptionInInitializerError,通常意味着主配置文件有语法错误、XML路径不对,或者MySQL驱动jar还没加进来。注意看控制台最上面的Caused by,那才是真正的错误根因。
5.2 写一个简单的Mapper调用Demo,验证查询链路
环境搭好没搭好,用一条查询来验收。我在com.demo.test包下建一个DemoTest,写main方法:
package com.demo.test; import com.demo.mapper.UserMapper; import com.demo.pojo.User; import com.demo.utils.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import java.util.List; public class DemoTest { public static void main(String[] args) { try (SqlSession session = MyBatisUtil.openSession()) { UserMapper userMapper = session.getMapper(UserMapper.class); List<User> userList = userMapper.findAll(); for (User user : userList) { System.out.println(user.getId() + " - " + user.getUserName() + " - " + user.getEmail()); } } } }这里用了try-with-resources,SqlSession会自动关闭,省得在finally里手动关。别小看这一步,SqlSession内部持有数据库连接,不关闭就会把连接池的连接耗尽。我遇到过有人在循环里反复创建SqlSession,跑到几百条数据就报Too many connections,最后发现就是session没关。
运行main方法,如果控制台输出两行用户数据,说明整条链路已经通了:MyEclipse认识jar包、MyBatis配置正确、数据库连接成功、Mapper映射绑定无误。如果卡在这一步,去对照第6章的排查表。
5.3 增删改操作与事务提交:为什么数据没变化
查询跑通后,很多人接着试插入操作,然后一脸懵地发现“控制台不报错,但数据库里查不到数据”。原因很简单:MyBatis默认不会自动提交事务,你在openSession()时没传true,那么执行完insert之后必须手动session.commit(),否则事务回滚,数据自然没落库。
用前面的工具类,插入操作可以这样写:
public static void testInsert() { try (SqlSession session = MyBatisUtil.openSession()) { UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User(); user.setUserName("wangwu"); user.setPassword("123123"); user.setEmail("wangwu@example.com"); int rows = userMapper.insert(user); System.out.println("影响行数:" + rows); session.commit(); } }如果你不想每次手动提交,可以在factory.openSession(true)里传true表示自动提交。但生产项目里我通常不这么干,因为自动提交会让事务边界变模糊,一旦一个业务方法里有多个写操作,中间某个失败就会留下脏数据。初学阶段宁可麻烦一点,把commit()写出来,顺便理解事务的含义。
对应的UserMapper接口里要加方法:
int insert(User user);XML里加:
<insert id="insert" parameterType="com.demo.pojo.User"> insert into user(user_name, password, email) values(#{userName}, #{password}, #{email}) </insert>注意parameterType可以省略,MyBatis会根据接口方法的参数类型自动推断,但写上也无妨,能帮助初学者理解参数对象和#{}取字段的对应关系。
5.4 用日志验证SQL是否真正执行
环境搭建是否成功,不只看最终结果,还得看过程。开启log4j之后,正常运行的日志长这样:
2025-01-08 15:30:01 DEBUG UserMapper:62 - ==> Preparing: select id, user_name, password, email from user 2025-01-08 15:30:01 DEBUG UserMapper:63 - ==> Parameters: 2025-01-08 15:30:01 DEBUG UserMapper:64 - <== Total: 2看到Preparing和Parameters,说明SQL确实发送到了数据库。如果日志里没有任何SQL,多半是XML没有被加载,或者Mapper绑定失败。如果日志里有SQL但Total: 0,则是查询条件与数据不匹配,检查SQL的where部分。
这里我提供一个调试习惯:遇到问题时,先看日志SQL和预期是否一致,再看异常栈第一行Caused by,最后才去翻代码。90%的环境问题,看一眼日志就能定位到具体环节。
6. 常见问题与排查技巧实录
6.1 找不到mybatis-config.xml:十有八九是classpath问题
报错长这样:
org.apache.ibatis.binding.BindingException: Error building SqlSession. Cause: java.io.IOException: Could not find resource mybatis-config.xml这个报错的原因只有一个:运行时classpath里没有这个文件。MyEclipse里常见两种误操作:第一种,把XML放在一个普通文件夹里,而这个文件夹没有被加入Build Path的Source目录;第二种,用了Maven结构,XML放在src/main/java下,但Maven默认只把特定资源拷贝到classpath。
解决办法很简单:先确认mybatis-config.xml在src或resources目录下,然后打开Project -> Clean重新编译,再看bin目录里有没有这个文件。如果老项目的源码目录不是标准src,右键项目 ->Build Path -> Source,把那个存放配置文件的目录添加为Source Folder即可。
6.2 Invalid bound statement (not found):命名空间和id是重点
这是MyBatis新手最常遇到的经典报错:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.demo.mapper.UserMapper.findAll这句话的意思是:MyBatis找到了UserMapper接口,也找到了UserMapper这个类,但找不到与它绑定好的SQL语句。排查顺序我建议从三个方面来:
第一,UserMapper.xml的namespace是不是写了接口的全限定名?很多时候从网上复制配置,namespace还停留在别人的包名,一改包名就容易漏改这里。第二,XML里的id是不是和接口方法名完全一致?大小写、拼写都要核对。第三,XML有没有被实际加载?可以打开编译输出目录bin,看看com/demo/mapper/UserMapper.xml是否存在。如果整个文件都没编译过来,前面namespace和id写得再对也没用。
另外一个稍隐蔽的场景:如果你新增了一个Mapper接口和XML,也确认目录结构没问题,但底层的mybatis-config.xml里用的是<mapper resource="..."/>显式注册,忘记把新XML加进去,同样会报not found。用<package name="com.demo.mapper"/>包扫描之后,这个漏配的问题就基本不会出现了。
6.3 数据库连接相关的三类报错:驱动类名、账号权限、时区
数据库连不上,报错千奇百怪,但归纳起来主要有三类。
第一类,ClassNotFoundException: com.mysql.cj.jdbc.Driver。不是驱动jar没加进Build Path,就是驱动类名写错了。如果用的是MySQL 5.x驱动,类名应该是com.mysql.jdbc.Driver。检查办法:展开Referenced Libraries,确认mysql-connector-java在列。
第二类,Access denied for user 'root'@'localhost' (using password: YES)。这是用户名或密码不对,或者该用户没有远程访问权限。先在命令行里用同一套账号密码登一遍MySQL,如果命令行能进、Java连不上,再检查主配置文件里username和password属性名是不是拼错了。我见过有人把username拼成userName,MyBatis不会报配置错误,但拼接连接时就是认证失败。
第三类,MySQL 8.0驱动常见的时区报错:
The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized...这个就是URL里没加serverTimezone参数。把主配置里的URL改成带serverTimezone=Asia/Shanghai的写法即可。同理,如果报Unknown database 'demo',说明URL里的库名和实际库名对不上,回命令行用SHOW DATABASES;核对一下。
6.4 中文乱码:数据库、连接URL、IDE三处一起堵
乱码问题在中文项目里避不开,而且它可能出在三层:数据库本身、JDBC连接URL、MyEclipse的工作区编码。只改其中一处往往不够,因为三条链路里任何一条不统一,中文都会变问号。
我的标准做法是:建库时用utf8mb4字符集,表也显式指定utf8mb4;JDBC连接URL里加useUnicode=true&characterEncoding=utf8;MyEclipse工作区设置为UTF-8,路径是Window -> Preferences -> General -> Workspace -> Text file encoding,改成UTF-8。这三处都统一之后,中文基本不会再出问题。
另外,MyBatis配置文件里声明的编码也要写成UTF-8,比如XML文件头部的<?xml version="1.0" encoding="UTF-8" ?>。如果一个XML文件本身是GBK编码,文件头却写UTF-8,解析阶段就会直接报错。
6.5 常见问题速查表:对照现象快速定位
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Could not find resource mybatis-config.xml | 配置文件不在classpath | 将XML放入src,或把目录加为Source Folder,重新Clean |
| Invalid bound statement (not found) | namespace、id不匹配或XML未加载 | 核对全限定名和方法名,检查bin目录是否有XML |
| ClassNotFoundException: com.mysql.cj.jdbc.Driver | MySQL驱动jar未加入Build Path | 检查lib目录和Referenced Libraries |
| Access denied for user 'root' | 用户名密码错误 | 命令行验证账号,检查配置里的属性名 |
| The server time zone value ... is unrecognized | MySQL 8驱动缺serverTimezone参数 | URL加serverTimezone=Asia/Shanghai |
| 控制台没SQL日志 | log4j未配置或logImpl不对 | 确认log4j jar、log4j.properties、logImpl=LOG4J |
| 中文乱码 | 数据库/URL/IDE编码不一致 | 统一utf8mb4和UTF-8 |
| 插入后数据库没数据 | 事务未提交 | 手动调用session.commit() |
这张表基本覆盖了我这些年帮人排查MyEclipse+MyBatis环境问题的高频原因。你先按现象对号入座,再往对应章节翻细节,比漫无目的地改配置高效得多。
我在实际排查中发现,很多人把问题想复杂了。环境搭建报错多数不是高深难题,而是“jar没导进Build Path”“XML没编译进来”“数据库密码写错”“命名空间不一致”这几个基础环节。遇到报错别慌,把异常栈从头到尾看一遍,尤其是Caused by后面那行,基本已经把答案写在脸上了。
最后再分享一个小技巧:每次改完XML配置文件,记得对项目执行一次Project -> Clean。MyEclipse有时不会自动刷新编译产物,导致你改了配置文件但运行时用的还是旧版本,那种“我明明改对了怎么还报错”的情况,十有八九就是这个原因。另外,尽量别让UserMapper.xml和UserMapper.java分开存放,把它们的包路径保持一致,可以少踩一半的坑。这套环境搭完之后,后面无论是继续加增删改查,还是接Spring容器,都是在今天的地基上盖楼。