zoukankan      html  css  js  c++  java
  • 转载:再说mybatis3:Invalid bound statement (not found)

    原文:https://my.oschina.net/psuyun/blog/464851

    摘要: 上篇博客关于mybatis3使用上的问题,需要注意,不过我遇到的是另外的一个情况,翻看了众多博客无果的情况下,偶然看到mybatis-spring官网上的一段话,问题得到解决,予以记录之。

    新手使用mybatis3的心酸,应该也只有新手才能体会了,网上一堆解决异常的办法都不起作用,心态不好的话,砸电脑都有可能了,还好,我的心态还可以,承认是自己的学识不够,只能怒而学习之,呵呵,扯得有点多。

    最近熟练springmvc+mybatis3的开发框架,在搭建开发环境的时候遇到了如标题这样的问题,代码分层上还是普通的Controller、Service、Service Impl、Mapper层,然后使用注解的方式注入bean,注解用的是JSR-330的规范,类似@Inject、@Named之类的东西。

    介绍截到这里了,先看报错:

    INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
    Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.join.stump.site.service.MenuService.queryMenuList
    	at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:189)
    	at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:43)
    	at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:58)
    	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:51)
    	at com.sun.proxy.$Proxy12.queryMenuList(Unknown Source)
    	at com.join.stump.site.service.impl.MenuServiceImpl.main(MenuServiceImpl.java:25)

    调用方法:

    public static void main(String[] args) {
    		ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "stump-core-config.xml" });
    		MenuService menuService = (MenuService) context
    				.getBean("menuService");
    		System.err.println("menuService:"+menuService.queryMenuList(null));
    	}

     显然在调用service的方法的时候报错了,有两个地方可能会让你纳闷,

    1、为什么报Invalid bound statement (not found): com.join.stump.site.service.MenuService.queryMenuList

    2、为什么service的对象类型是org.apache.ibatis.binding.MapperProxy

    关于第一个问题,由第二个问题可以得到解释,因为是org.apache.ibatis.binding.MapperProxy 在使用com.join.stump.site.service.MenuService.queryMenuList在mybatis的sql映射文件中没有这个sql,所以报错。

    那为什么会有第二个问题了,我也百事不得骑姐(故意的),在经过一方折腾后,看到mybatis-spring的官网上一段话,感觉豁然开朗,试着调整了下就没问题了。这个问题跟我的mybatis的配置文件有很大关系。先看出错前的配置:

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<property name="basePackage" value="com.join.stump" />
    	</bean>

    再看解决后的配置:

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<property name="basePackage" value="com.join.stump.site.mapper,com.join.stump.base.mapper" />
    	</bean>
    注意到区别了吗?然后我给出官网的一段说明:
    MapperScannerConfigurer 支 持 过 滤 由 指 定 的 创 建 接 口 或 注 解 创 建 映 射 器 。 annotationClass 属性指定了要寻找的注解名称。 markerInterface 属性指定了要寻找的父 接口。如果两者都被指定了,加入到接口中的映射器会匹配两种标准。 默认情况下,这两个 属性都是 null,所以在基包中给定的所有接口可以作为映射器加载
    好吧,应该能够想到点什么了吧,好吧,我直说了,出错的配置中basePackage用的是com.join.stump,这样MapperScannerConfigurer做扫描的时候,把Service也扫进去了,所以,现在可以骑姐了。
  • 相关阅读:
    【java】对象赋值给另一个对象
    spring boot系列(五)spring boot 配置spring data jpa (查询方法)
    Spring Data JPA 查询
    Spring Data JPA 介绍
    OpenID简介
    OAUTH协议介绍
    URL encoding(URL编码)
    RESTful 介绍
    spring boot系列(四)spring boot 配置spring data jpa (保存修改删除方法)
    spring boot 启动报 java.lang.NoClassDefFoundError: ch/qos/logback/core/spi/LifeCycle 错误
  • 原文地址:https://www.cnblogs.com/davidway/p/6866299.html
Copyright © 2011-2022 走看看