天天看点

binding.BindingException: Invalid bound statement (not found): xxx → dao接口和mapper.xml映射文件绑定异常

在进行mybatis开发的时候, 可能会遇到org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx 这样的错误。

从BindingException可以看出这是一个绑定异常, 意思就是无法将dao接口和mapper.xml文件进行映射绑定。

在分析该错误之前, 先看下面的这个配置片段:

<!-- 3、Session工厂 -->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--引用数据源-->
    <property name="dataSource" ref="dataSource"/>
    <!--配置别名-->
    <property name="typeAliasesPackage" value="com.cd.oa.entity"/>
</bean>

<!-- 自动扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 如果配置了多个数据源,则需通过sqlSessionFactoryBeanName属性来指定的所需的session工厂对象; 如果只有一个数据源,则可以不配置该属性 -->
    <property name="sqlSessionFactoryBeanName" value="SessionFactory"/>
    <!--指定dao接口路径-->
    <property name="basePackage" value="com.cd.oa.dao"/>
</bean>
           

MapperScannerConfigurer自动扫描器, 它的作用是:自动扫描指定类路径下的映射器接口,并自动为它们创建与之对应的MapperFactoryBean, 通过MapperFactoryBean来生成mapper(dao)接口的动态代理对象, 实现dao接口和mapper.xml文件的映射绑定。(所以, basePackage是创建MapperScannerConfigurer对象时必须指定的属性, 用于指定dao接口路径)

但它有一些规范:

1、xml映射文件必须与dao接口处在同一目录下, 并且由于xml文件属于配置文件,不能放在java文件目录下,但又因为xml映射文件必须与dao接口处在同一目录下, 所以需要在resource资源文件目录下创建一个与dao接口目录同名的目录来放置xml映射文件。

binding.BindingException: Invalid bound statement (not found): xxx → dao接口和mapper.xml映射文件绑定异常

2、在创建目录的时候, 需要一层一层的创建(如: 先创建com目录 → 接着创建cd → 再接着创建oa目录, 最后创建dao目录 ), 不要直接创建com.cd.oa.dao目录。

  • 因为前面那种方式得到的是一个4层的目录;
  • 而后面那种方式得到的是一个名为com.cd.oa.dao的1层的目录, 没有分层效果;

所以, 创建目录的时候, 需要一层一层的创建, 否则xml文件无法 和 java文件目录下对应的dao接口的层次对应上。导致出现下图红叉中的这种现象, 即dao接口和xml映射文件没有处在同一目录下, 就无法实现dao接口和mapper.xml配置文件的映射绑定。

binding.BindingException: Invalid bound statement (not found): xxx → dao接口和mapper.xml映射文件绑定异常

3、dao接口名称需和xml映射文件名称保持一致

binding.BindingException: Invalid bound statement (not found): xxx → dao接口和mapper.xml映射文件绑定异常

4、xml映射文件mapper标签的namespace属性的值, 必须为该xml映射文件对应的dao接口的全类名(包名+接口名)

binding.BindingException: Invalid bound statement (not found): xxx → dao接口和mapper.xml映射文件绑定异常

而我踩到的是第二个雷区, 所以报了org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx 错误。

继续阅读