断点调试,发现在SqlSessionFactoryBuilder在调用build()方法时就报出了异常,说明在加载配置mybatis-config.xml文件的时候就出了问题,
问题缩小到mybatis配置文件,其他配置基本没问题。
<?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">
<!-- 通过这个配置文件完成mybatis与数据库的连接 -->
<configuration>
<!-- 引入 database.properties 文件-->
<properties resource="database.properties"/>
<!-- 配置mybatis的log实现为LOG4J -->
<settings>
<setting name="logImpl" value="LOG4J" />
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
<!-- 类型的别名-->
<typeAliases>
<!-- 将此包下的所有类名作为别名-->
<package name="cn.cvs.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!--配置事务管理,采用JDBC的事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- mapper映射器-->
<mappers>
<mapper resource="cn/cvs/mapper/role/SysRoleMapper.xml"/>
<!-- <mapper resource="cn/cvs/mapper/user/SysUserMapper.xml"/>-->
<!-- <mapper resource="cn/cvs/mapper/supplier/SupplierMapper.xml"/>-->
<!-- <mapper resource="cn/cvs/mapper/storageRecord/StorageRecordMapper.xml"/>-->
</mappers>
</configuration>
最终问题解决:
在进行Junit单元测试时,MyBaits会对所有的映射文件与接口进行映射,此次问题中,映射接口都是写好的,但是mapper映射文件中没有内容,接口的方法在映射文件中找不到对应的语句,所以就会报错。
而之所以会报MyBatisUtils初始化异常,是因为创建SqlSessionFactory的建造器是写在静态代码块中的,优先于对象的创建,所以就会初始化失败。
如果把MyBatisUtils中静态代码块中的代码迁移出来,根本问题就显现出来了,也证实了我上边的想法。