• 转载:再说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也扫进去了,所以,现在可以骑姐了。
  • 相关阅读:
    关于jQuery中click&live&on中的坑
    redis 主从配置和集群配置
    python 搭建redis集群
    事件冒泡及事件委托的理解(JQuery Dom操作)
    python中import和from-import的区别
    python中赋值-浅拷贝-深拷贝之间的关系
    学生管理系统.JavaScript
    学生管理系统.c
    电梯演讲与原型展示
    软件需求分析
  • 原文地址:https://www.cnblogs.com/davidway/p/6866299.html
Copyright © 2020-2023  润新知