天天看點

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 錯誤。

繼續閱讀