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的详细内容...