开始之前我们先落实一些叫法
java.lang.System 全限定名
java.lang 包名
System 类名
OK,通过Spring整合MyBatis,sqlSessionFactory配置如下
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="com.myapp" /> <property name="mapperLocations" value="classpath:/mybatis/**/*Mapper.xml" /> </bean>
其中typeAliasesPackage的作用是自动扫描Entity,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名,及只取类名。多个package之间可以用逗号或者分号等来进行分隔。
mapperLocations的作用是指定Mapper文件的位置
启动的时候停在这个位置。
:oejs.Server:jetty-7.6.2.v20120308 :/web:Initializing Spring root WebApplicationContext
问题解决
经检查发现,发现项目中存在一个类,与项目中某Mapper配置文件中resultType指向的类的全限定名不同,但类名相同的类存在。将该类名修改后正常启动。
后续测试
后续测试了一下,无论Mapper.xml是否有调用到,只要项目中存在两个类的类名相同就会无法启动,哪怕全限定名不同也不行。
另外需要注意的是,
1. 不单指与MyBatis有关的Entity。哪怕是同一个类名的Controller存在也无法启动;
2. 相同类名不区分大小写。
猜想
估计MyBatis配置中typeAliasesPackage扫描到的类,只保存了小写形式的类名,所以比如在配置文件中的resultType可以直接写string这种形式。通过读源码证实了猜想结果。