问题描述
跟着狂神的教程学习的时候,发现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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="efls15ew"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/kuang/dao/userMapper.xml"/>
</mappers>
</configuration>
会产生报错如下:
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:121)
根据排查,出错的代码段如下所示,很明显是由于MyBatis
的xml
配置出错,导致未能建立正确的sqlSession
。
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
尝试解决
1. 编码纠正
首先,如果你去网上查找答案,会让你检查文件编码是否全为UTF-8
,比如使用记事本打开mybatis-config.xml
文件,将其修改后,以UTF-8
编码存储。删除xml
文件中的非英文字符也是一种常规做法,但对于博主遇到的这个bug
都不起作用。
2. 配置检查
检查xml
中的配置是否出错,错误最常出现的是用户名和密码选项。注意如果新手的mysql
数据库刚刚初始化完毕,那么password
属性应该设置为空字符串或者干脆删除该属性。
博主使用SELECT VERSION()
查看本机mysql
的版本为5.7.42,通过查询MySQL
官方文档,得知MySQL
5.7.x版本应该使用MySQL Connector/J
5.1.x版本。因此,可以在Maven仓库中查找5.1.x版本的MySQL Connector/J
——在pom.xml
文件中添加以下dependency
元素,来引入:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
这里介绍一下MySQL JDBC驱动程序
。我们的xml
文件中有一个dataSource
元素,其功能是使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。数据源类型(type)主要有3种:unpooled | pooled | jndi。更多详细介绍可参考配置文档:
MySQL JDBC驱动程序是MySQL提供的一种Java数据库连接驱动程序,用于在Java应用程序中连接和操作MySQL数据库。它并不是Mybatis或者其他ORM框架自带的,而是需要开发者根据自己的需要手动下载并配置的。 通常,MySQL JDBC驱动程序可以从MySQL官方网站或者Maven Repository等网站下载。对于Maven项目,你可以在pom.xml文件中添加MySQL JDBC驱动程序的依赖,然后使用Maven自动下载和管理。 要查看项目中是否使用了与MySQL数据库版本相对应的MySQL JDBC驱动程序,可以查看项目中所依赖的MySQL JDBC驱动程序的版本。比如在的Maven项目的
pom.xml
文件,查找mysql-connector-java
依赖项。 如果你没有在pom.xml
中显式声明mysql-connector-java
依赖项,那么Maven将会使用默认版本的MySQL JDBC驱动程序。
博主尝试修改版本后,依然未能解决该问题。
3. 权限更改
每次使用mysql数据库,都需要使用管理员命令和权限,博主将MySQL
安装目录的bin
文件夹添加到系统的PATH
环境变量中,从而能够在非管理员权限下进入mysql
数据库,但依然未能解决此问题。
问题解决
终于找到出现bug
的原因:xml
文件编码与idea
编辑器字符编码不一致。
解决方法:在pom.xml的project
标签中加入下面的代码:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
原理:这个配置指定了项目的默认编码格式为UTF-8
。这将确保在编译和构建过程中使用UTF-8
编码格式,从而避免了一些潜在的编码问题,如乱码、非法字符等。
最后,总结:在项目中,如果没有指定编码格式或者使用了不正确的编码格式,可能会导致一些问题,如编译错误、运行时异常、乱码等。因此,在开发过程中,正确配置编码格式非常重要。
一个小tip
在IntelliJ IDEA
中,可以通过以下步骤来修改项目的默认编码格式:
- 在顶部菜单栏中选择
File -> Settings
。 - 在
Settings
窗口中,选择Editor -> File Encodings
。在File Encodings
选项卡中,可以看到IDEA
支持多种编码格式:Global Encoding | Project Encoding | Default encoding for properties files | Properties files encoding
,可以分别设置它们的编码格式; - 在
Default encoding for properties files
下方,勾选Transparent native-to-ascii conversion
,这样,IDEA
将会自动将不可打印的字符转换为Unicode
码,确保正确读取和显示属性文件。
附注:
Global Encoding
是IntelliJ IDEA
的全局编码设置,它适用于所有项目和文件。如果你没有在项目中设置编码格式,那么 IntelliJ IDEA 将使用Global Encoding
作为默认编码格式。Project Encoding
是项目级别的编码设置,它仅适用于当前打开的项目。如果你在项目中设置了编码格式,那么IntelliJ IDEA
将使用Project Encoding
作为默认编码格式,而不是使用Global Encoding
。