写MyBatis时通过mapper标签的class属性配置映射时出现的问题
我们知道在Mybatis的总配置文件中配置接口的映射信息有三种方法:
- resources:引用类路径下的配置文件,路径间用/隔开
- url:可以引用磁盘上的任意资源或者网络资源都可
- class:配置需要实现的接口的全路径。还要把映射文件放在同一个包下,并且名字也需要相同
此博文讨论的就是第三种方法出现的问题。环境是idea.
假设我们有一个EmployeeDao接口,我们把映射文件复制到同一个路径下。
开启测试时会出现这种错误:
即绑定异常,说明MyBatis根本就没有找到EmployeeDao.xml文件。
可以看到target中的确没有该文件。解决方法是:
在pom配置文件中导入如下的配置:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
这样就会把没有标记为resources目录下的资源也读取。
还有一个问题,如果我们在EmployeeDao中写了中文注解的话,会出现如下的错误:
Cause: 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.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64)
at MyBatisTest.<clinit>(MyBatisTest.java:22)
... 21 more
字符集传化错误,解决方法是去掉中文注解,或者把配置文件中的UTF-8改成utf8,或者在idea的配置中,修改全部文件的编码集为UTF-8.