【问题标题】:mybatis spring mvc application, getting Invalid bound statement (not found)mybatis spring mvc 应用,得到 Invalid bound statement (not found)
【发布时间】:2013-12-23 23:59:39
【问题描述】:

这是我第一个使用spring 3.2.4的mybatis spring mvc应用,mybatis-spring-1.2.1

当我尝试调用我的网络服务时,我得到了错误::

org.springframework.web.util.NestedServletException: Request processing failed; 
nested exception is org.apache.ibatis.binding.BindingException: Invalid bound 
statement (not found): 
org.mydomain.formulary.drugmaster.dao.DrugMasterDao.getDrugsWithAlert

我一定遗漏了一些明显的东西。 感谢您的帮助

这是我的相关文件: applicationContext.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="formularyDb" />
    <property name="configLocation"  value="file:/web/sites/drugformulary-spring/config/mybatis-config.xml" />
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="org.mydomain.formulary.mappers" />
</bean>
<bean id="DrugMasterDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="org.mydomain.formulary.drugmaster.dao.DrugMasterDao" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

映射器文件 --> /classes/org/mydomain/formulary/mappers/drugmasterDao.xml

<mapper namespace="org.mydomain.formulary.drugmaster.dao.DrugMasterDao">

<select id="getDrugsWithAlert" parameterType="int" resultType="org.mydomain.formulary.drug_master.model.DrugMasters">
    Select drug_id,drug_name,drug_alert_date,drug_alert_source, rownum
    from (select drug_id,drug_name,to_char(drug_alert_datetime,'MM/DD/YYYY') as drug_alert_date ,drug_alert_source, rownum
    from drug_master
    where drug_status ='A' and length(drug_alert) > 0
    order by drug_alert_datetime DESC )
    where
    <if test="_parameter != null">
        rownum &lt; #{count}
    </if>
</select>
</mapper>

映射文件 --> /classes/org/mydomain/formulary/drugmaster/dao/DrugMasterDao.java

public interface DrugMasterDao {
    public List<DrugMasters> getDrugsWithAlert(int count);
}

控制器文件 --> /classes/org/mydomain/formulary/drugmaster/controller/DrugMasterController.java

@Controller
public class DrugMasterController {
@Autowired
DrugMasterService drugMasterService;


@RequestMapping(value = "/drugmaster/withalerts/count/{count}", method = RequestMethod.GET)
public String withAlerts(ModelMap model, @PathVariable int count) {

    List<DrugMasters> drugs = drugMasterService.getDrugsWithAlert(count);

    return null/*for now*/;

}
}    

服务文件 --> /classes/org/mydomain/formulary/drugmaster/service/DrugMasterServiceImpl.java

@Service
public class DrugMasterServiceImpl implements DrugMasterService {

    @Autowired
    DrugMasterDao drugMasterDao;

    public List<DrugMasters> getDrugsWithAlert(int count){
        return drugMasterDao.getDrugsWithAlert(count);
    }
}

mybatis-configfile -->

<configuration>
<settings>
    <setting name="cacheEnabled" value="false" />
    <setting name="lazyLoadingEnabled" value="false" />
</settings>
</configuration>

【问题讨论】:

  • 糟糕,现在缺少 mybaits-config.xml。基本上确保您的 configLocation 正在被读取(我希望它被放置在类路径中,接下来确保正在读取您的映射器 xml。这些错误是由于缺少映射器文件例如我在 sessionfactory
  • 我已经添加了 mybaits-config.xml,但它非常简单。当您说“确保正在读取您的映射器 xmls”时,有什么方法可以通过调试来查看它们是否正在被读取?
  • 因为路径解析问题(mybatis找不到mapper文件时),所以最好检查一下你的mapper文件是否被引用

标签: spring spring-mvc mybatis


【解决方案1】:

我在寻找我的错误时搜索了这个答案。它实际上与OP的问题无关,但例外是相同的,这个问题在谷歌中非常明显。

就我而言,我忘记更改映射器命名空间

<mapper namespace="pl.my.package.MyNewMapper">

这导致了同样的问题。

【讨论】:

  • 确保您的 *Mapper.xml 存在于您的命名空间文件夹中!
【解决方案2】:

在阅读此页面中的配置后,我遇到了同样的问题。 https://mybatis.github.io/spring/mappers.html#scan

我看到我的配置是正确的。所以调试我的应用程序。发现我的 *mappers.xml 文件不在路径中。那个期望一定是。

我在我的 maven 项目中的同一个文件夹 src "java" 中有 XML 文件。所以当我构建我的应用程序时,文件没有复制到类文件夹中。所以我必须将 xml 文件移动到文件夹“资源”。并解决问题。

【讨论】:

    【解决方案3】:

    因为你的xml在mybatis中没有加载,MapperScannerConfigurer只扫描接口,不扫描xml。 有两种方式:

    <mappers>
        <mapper resource="org/mydomain/formulary/mappers/drugmasterDao.xml"/>
    </mappers>
    

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath*:org/mydomain/**/*.xml"/>
    </bean>
    

    【讨论】:

      【解决方案4】:

      我的 spring-boot mybatis 应用程序也有类似的问题。 问题是mybatis找不到配置文件。添加后

      mybatis.config-location=classpath:mybatis-config.xml
      

      在 application.properties 文件中,问题已解决。看起来问题总是围绕配置文件/映射器文件和语句名称。

      【讨论】:

        【解决方案5】:

        就我而言,我有多个DataSource,应该为每个SessionFactory 设置映射器位置。

        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(mysqlDataSource);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources("classpath:mappers/**/*Mapper.xml"));
        

        【讨论】:

        • 这就是我想要的!谢谢
        【解决方案6】:

        我用solution of Giovanni Perea 的变体解决了同样的问题(谢谢)。我将 .xml 映射器文件与 .java 映射器文件放在同一个文件夹中,并且我将 maven 与 maven-resources-plugin 一起使用。

        在我的解决方案中,我在 maven-resources-plugin 中添加了一个执行,用于将所有 .xml 映射器文件复制到正确的位置(.class 映射器文件的同一文件夹):

        <execution>
            <id>copy-mappers-xml</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/classes/com/myapplication/mapper</outputDirectory>
                <resources>          
                    <resource>
                        <directory>${project.basedir}/src/main/java/com/myapplication/mapper/</directory>
                        <filtering>false</filtering>
                        <includes>
                            <include>*.xml</include>
                        </includes>
                    </resource>
                </resources>              
             </configuration>
        </execution>
        

        更多关于 maven-resources-plugin 的示例:Including and excluding files and directories

        如果您不使用 maven-resources-plugin,请参阅: https://stackoverflow.com/a/12446666/2473158

        【讨论】:

          【解决方案7】:

          在我的情况下,这是映射器 xml 语句的 id 中的拼写错误,例如

          <select id="getDtaa" resultType="Data">
          
          List<T> getData()
          

          将 XML 中的 id 更改为正确的函数名称后,它就可以工作了。

          【讨论】:

            【解决方案8】:

            很可能是 java 方法名称和 XML 块的名称不匹配

            e.g mapper.getUser()  
            
             <select id="getUsee" resultMap="student">
                ...........
             <>
            

            getUser 明显不同于 getUsee

            【讨论】:

              【解决方案9】:

              除了上面提到的@Dariusz,我也忘记添加映射器位置了。

              <property name="mapperLocations" value="classpath:mybatis/mappers/*.xml"/>
              

              【讨论】:

                【解决方案10】:

                (可能有很多原因,我的情况有点罕见和奇怪,很难发现,所以我想在这里添加一个答案,以防有人和我做同样的事情。)

                在我的情况下,原因在IDEA,当为映射器文件创建多级包时,我输入mybatis.mapper,它只创建一个单个目录但名称包含. .

                虽然我实际上应该输入mybatis/mapper 来一次创建多级目录。

                在这两种情况下,在IDEA的项目视图中显示的目录与mybatis.mapper相同,所以我花了一段时间才弄清楚为什么......

                【讨论】:

                  【解决方案11】:

                  在spring配置中,以xml方式为例,确保mapper.xml文件位于指定为mapperLocations属性值的位置。一旦我在 mappers/anotherfolder/*.xml 有了它。这会导致疼痛。

                  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                      <property name="dataSource" ref="dataSource"/>
                      <property name="typeAliasesPackage" value="somepackage.model"/>
                      <property name="mapperLocations" value="classpath*:mappers/*.xml"/>
                  </bean>
                  

                  【讨论】:

                  • 我又遇到了这个问题,这次这个答案对我有帮助。还有一条评论,如果你在 myBatis 配置文件而不是 spring 配置文件中定义了你的映射器,你必须确保该位置在如下行中正确:&lt;mappers&gt; &lt;mapper resource="com/ceteng/mybatis/model/User.xml"/&gt; &lt;/mappers&gt;
                  【解决方案12】:

                  将 mapper/drugmasterDao.xml 重命名为 mapper/DrugMasterDao.xml ,名称必须与 *Dao.java 文件名匹配,否则会抛出错误 要么 我们必须显式创建 Ibatismapping.xml 并在其中添加映射器配置

                  【讨论】:

                    【解决方案13】:

                    检查mapper中是否有重载方法。尝试使用单独的名称。

                    【讨论】:

                      【解决方案14】:

                      我在开发中也遇到过这个问题。 一般来说,如果你使用的是spring、myBatis等的xml配置文件,那么这个问题多半是你的xml配置文件中的一些错误造成的。

                      Dariusz 投票最多的答案表明 myBatis xml 配置文件中可能存在一些问题,而在我的情况下,我发现 spring xml 配置文件中的问题也可能导致此问题。

                      在本帖的情况下,在applicationContext.xml(应该是Spring的配置文件)中,我们可以看到MapperScannerConfigurer的basePackage配置:

                      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.mydomain.formulary.mappers" /> </bean>

                      所以如果这个属性的值不对(包名不对),也会导致这个问题。

                      【讨论】:

                        【解决方案15】:

                        2 点覆盖

                        1. 检查 XML 和 Java 方法中的方法名称是否相同。
                        2. Mapper:scan 涵盖了所需的包。如果您使用注解,则 @MapperScan(com.xxx) 必须在定义的路径中。

                        【讨论】:

                          【解决方案16】:

                          在我的例子中,在注解中使用查询,我没有充分相信注解中的 XML 被解释为 XML。

                          如果你有

                          @Select("select * from table where id <> 'blabla'")
                          

                          &lt;&gt; 弄乱了 XML。您需要将其放在 CDATA 部分中

                          @Select("select * from table where id <![CDATA[ <> ]]> 'blabla'")
                          

                          【讨论】:

                            【解决方案17】:

                            DrugMasters 属性定义必须与 drug_id,drug_name,drug_alert_date,drug_alert_source, rownum 关联。

                            【讨论】:

                            • 请描述得更具体。
                            猜你喜欢
                            • 2014-03-09
                            • 2020-03-25
                            • 1970-01-01
                            • 2020-01-21
                            • 1970-01-01
                            • 1970-01-01
                            • 2021-09-15
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多