Mybatis项目配置报错“1 字节的 UTF-8 序列的字节 1 无效”解决方案

55 阅读4分钟

问题描述

跟着狂神的教程学习的时候,发现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&amp;useUnicode=true&amp;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)

根据排查,出错的代码段如下所示,很明显是由于MyBatisxml配置出错,导致未能建立正确的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中,可以通过以下步骤来修改项目的默认编码格式:

  1. 在顶部菜单栏中选择File -> Settings
  2. Settings窗口中,选择 Editor -> File Encodings。在File Encodings选项卡中,可以看到IDEA支持多种编码格式: Global Encoding | Project Encoding | Default encoding for properties files | Properties files encoding,可以分别设置它们的编码格式;
  3. Default encoding for properties files下方,勾选 Transparent native-to-ascii conversion,这样,IDEA将会自动将不可打印的字符转换为Unicode码,确保正确读取和显示属性文件。 idea encoding.PNG

附注:

  1. Global Encoding 是 IntelliJ IDEA 的全局编码设置,它适用于所有项目和文件。如果你没有在项目中设置编码格式,那么 IntelliJ IDEA 将使用 Global Encoding 作为默认编码格式。
  2. Project Encoding 是项目级别的编码设置,它仅适用于当前打开的项目。如果你在项目中设置了编码格式,那么 IntelliJ IDEA 将使用 Project Encoding 作为默认编码格式,而不是使用 Global Encoding