写在前面: 当确定所有文件没有错的时候,一定要看一看是不是其他辅助工具的问题。
最近再看一本书《你的灯亮着吗》,里面有一句话 “鱼是最后看见水的”,应验了,也受教了!
找不到mapper.xml文件的原因有几种:
- 确实不存在mapper.xml文件
- 相关配置出错
- maven工具的原因
详解
a. 关于配置。
大多数情况下,使用ssm框架开发会这样的配置文件。
关于spring集成mybatis, 重要的也就这两个东西。
<!--映射xml文件的位置-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--这里配置mapper文件的存放位置-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--mapper接口所在的包-->
<property name="basePackage" value="com.mis.hrm.book.dao"/>
<!--指定使用哪一个selsessionfactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
同时也可以这样配置
<!--映射xml文件的位置-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- <property name="mapperLocations" value="classpath:mapper/*.xml"/>-->
<!--导入mybatis的配置文件,这个配置文件可以配置mapper.xml文件的路径-->
<property name="configLocation" value="classpath:mybatis/MapperConfig.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mis.hrm.book.dao"/>
<!--指定使用哪一个selsessionfactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
简单示例一下mybatisConfig.xml文件吧,包含了如何导入mapper.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>
<!--别名配置-->
<typeAliases>
<typeAlias type="com.mis.hrm.book.po.Book" alias="book"/>
<typeAlias type="com.mis.hrm.book.po.BookLendInfo" alias="bookLendInfo"/>
</typeAliases>
<!--把对应的xml文件加载进来-->
<mappers>
<!--通过扫描包的方式加载文件-->
<!--此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。-->
<!--<package name="com.mis.hrm.book.dao"/>-->
<!--也可以通过下面的方式导入-->
<!--url方式(文件全路径,不推荐)-->
<!--<mapper url="file:///home/liudong/code/hrms/mis-hrm-book/src/main/resources/mapper/BookMapper.xml"/>-->
<!--resource方式 (classpath 相对路径)-->
<mapper resource="mapper/BookMapper.xml"/>
<!--使用mapper接口 (接口类名)-->
<!--此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。-->
<!--<mapper class="com.mis.hrm.book.dao.BookMapper"/>-->
</mappers>
</configuration>
b. 关于maven的原因。
构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件。(具体可google maven文件处理方式)
大概的意思就是说,我们有的资源在默认的处理方式下被忽略了,并没有被添加到对应的目录下,当然找不到咯。
解决方案1,请看下面这一段描述:
大概意思就是说,我们的资源文件不会被编译,但又因为各种各样的原因必须绑定到项目中。所以此时此刻使用 resources 标签来标明哪些文件是不能被忽略的,哪些文件是必须排除的。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<!--包含了src/main/java目录下的所有xml资源配置文件-->
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<!--包含了src/main/resources目录下的所有xml资源配置文件-->
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
解决方案2,使用maven打包的插件。
列举一个吧,其实还有其他的
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>add-resource</id>
<phase>generate-resources</phase>
<goals>
<goal>add-resource</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>