好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

解决mybatis-plus通用mapper调用报错:Invalid bound statement

mybatis-plus通用mapper调用报错

使用springboot整合mybatis-plus后,调用自定义的方法正常,调用BaseMapper中自带的方法报错如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.rkang.enterprise.mapper.EmployeeInfoMapper.selectOne

     at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java: 227 ) ~[mybatis- 3.4 . 6 .jar: 3.4 . 6 ]

     at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java: 49 ) ~[mybatis- 3.4 . 6 .jar: 3.4 . 6 ]

     at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java: 65 ) ~[mybatis- 3.4 . 6 .jar: 3.4 . 6 ]

     at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java: 58 ) ~[mybatis- 3.4 . 6 .jar: 3.4 . 6 ]

     at com.sun.proxy.$Proxy70.selectOne(Unknown Source) ~[na:na]

     at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.getOne(ServiceImpl.java: 259 ) ~[mybatis-plus-extension- 3.1 . 1 .jar: 3.1 . 1 ]

     at com.baomidou.mybatisplus.extension.service.IService.getOne(IService.java: 192 ) ~[mybatis-plus-extension- 3.1 . 1 .jar: 3.1 . 1 ]

     at com.baomidou.mybatisplus.extension.service.IService

FastClassBySpringCGLIB

FastClassBySpringCGLIB

f8525d18.invoke(<generated>) ~[mybatis-plus-extension- 3.1 . 1 .jar: 3.1 . 1 ]

     at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java: 218 ) ~[spring-core- 5.1 . 6 .RELEASE.jar: 5.1 . 6 .RELEASE]

     at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java: 684 ) ~[spring-aop- 5.1 . 6 .RELEASE.jar: 5.1 . 6 .RELEASE]

     at cn.rkang.enterprise.local.service.EmployeeInfoService

EnhancerBySpringCGLIB

EnhancerBySpringCGLIB

7e12f21b.getOne(<generated>) ~[classes/:na]

跟进源码发现是methodProxy.invoke(target, argsToUse)报错

?

1

2

3

4

5

6

if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) {

     Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method, args);

     retVal = methodProxy.invoke(target, argsToUse);

} else {

     retVal = ( new CglibAopProxy.CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy)).proceed();

}

在invoke方法组装sqlmand的时候,MappedStatement没有组装成功,始终是null

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

public SqlCommand(Configuration configuration, Class<?> mapperInterface, Method method) {

     String methodName = method.getName();

     Class<?> declaringClass = method.getDeclaringClass();

     MappedStatement ms = this .resolveMappedStatement(mapperInterface, methodName, declaringClass, configuration);

     if (ms == null ) {

         if (method.getAnnotation(Flush. class ) == null ) {

             throw new BindingException( "Invalid bound statement (not found): " + mapperInterface.getName() + "." + methodName);

         }

 

         this .name = null ;

         this .type = SqlCommandType.FLUSH;

     } else {

         this .name = ms.getId();

         this .type = ms.getSqlCommandType();

         if ( this .type == SqlCommandType.UNKNOWN) {

             throw new BindingException( "Unknown execution method for: " + this .name);

         }

     }

}

解决方法

将mybatis的sqlSessionFactory替换成mybatis-plusd的MybatisSqlSessionFactoryBean,添加配置类MybatisPlusConfig

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

package cn.rkang.enterprise测试数据mon.config;

import com.baomidou.mybatisplus.core.MybatisConfiguration;

import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;

import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;

import org.apache.ibatis.mapping.DatabaseIdProvider;

import org.apache.ibatis.plugin.Interceptor;

import org.mybatis.spring.boot.autoconfigure.MybatisProperties;

import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.io.DefaultResourceLoader;

import org.springframework.core.io.ResourceLoader;

import org.springframework.util.StringUtils;

import javax.sql.DataSource;

 

@Configuration

public class MybatisPlusConfig {

 

     @Autowired

     private DataSource dataSource;

 

     @Autowired

     private MybatisProperties properties;

 

     @Autowired

     private ResourceLoader resourceLoader = new DefaultResourceLoader();

 

     @Autowired (required = false )

     private Interceptor[] interceptors;

 

     @Autowired (required = false )

     private DatabaseIdProvider databaseIdProvider;

 

     /**

      *   mybatis-plus分页插件

      */

     @Bean

     public PaginationInterceptor paginationInterceptor() {

         PaginationInterceptor page = new PaginationInterceptor();

         page.setDialectType( "mysql" );

         return page;

     }

     /**

      * 这里全部使用mybatis-autoconfigure 已经自动加载的资源。不手动指定

      * 配置文件和mybatis-boot的配置文件同步

      * @return

      */

     @Bean

     public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() {

         MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean();

         mybatisPlus.setDataSource(dataSource);

         mybatisPlus.setVfs(SpringBootVFS. class );

         if (StringUtils.hasText( this .properties.getConfigLocation())) {

             mybatisPlus.setConfigLocation( this .resourceLoader.getResource( this .properties.getConfigLocation()));

         }

         if (!ObjectUtils.isEmpty( this .interceptors)) {

             mybatisPlus.setPlugins( this .interceptors);

         }

         MybatisConfiguration mc = new MybatisConfiguration();

         mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver. class );

         //数据库字段设计为驼峰命名,默认开启的驼峰转下划线会报错字段找不到

         mc.setMapUnderscoreToCamelCase( false );

         mybatisPlus.setConfiguration(mc);

         if ( this .databaseIdProvider != null ) {

             mybatisPlus.setDatabaseIdProvider( this .databaseIdProvider);

         }

         if (StringUtils.hasLength( this .properties.getTypeAliasesPackage())) {

             mybatisPlus.setTypeAliasesPackage( this .properties.getTypeAliasesPackage());

         }

         if (StringUtils.hasLength( this .properties.getTypeHandlersPackage())) {

             mybatisPlus.setTypeHandlersPackage( this .properties.getTypeHandlersPackage());

         }

         if (!ObjectUtils.isEmpty( this .properties.resolveMapperLocations())) {

             mybatisPlus.setMapperLocations( this .properties.resolveMapperLocations());

         }

         return mybatisPlus;

     }

}

问题解决!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/noob9527/article/details/90229837

查看更多关于解决mybatis-plus通用mapper调用报错:Invalid bound statement的详细内容...

  阅读:28次