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

目录

  • mybatis-plus通用mapper调用报错
  • 解决方法

mybatis-plus通用mapper调用报错
使用springboot整合mybatis-plus后,调用自定义的方法正常,调用BaseMapper中自带的方法报错如下:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.rkang.enterprise.mapper.EmployeeInfoMapper.selectOneat org.apache.ibatis.binding.MapperMethod$SqlCommand.(MapperMethod.java:227) ~[mybatis-3.4.6.jar:3.4.6]at org.apache.ibatis.binding.MapperMethod.(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.IServiceFastClassBySpringCGLIBFastClassBySpringCGLIBf8525d18.invoke() ~[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.EmployeeInfoServiceEnhancerBySpringCGLIBEnhancerBySpringCGLIB7e12f21b.getOne() ~[classes/:na]

跟进源码发现是methodProxy.invoke(target, argsToUse)报错
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
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
package cn.rkang.enterprise.common.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; @Configurationpublic class MybatisPlusConfig {@Autowiredprivate DataSource dataSource; @Autowiredprivate MybatisProperties properties; @Autowiredprivate ResourceLoader resourceLoader = new DefaultResourceLoader(); @Autowired(required = false)private Interceptor[] interceptors; @Autowired(required = false)private DatabaseIdProvider databaseIdProvider; /***mybatis-plus分页插件*/@Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor page = new PaginationInterceptor(); page.setDialectType("mysql"); return page; }/*** 这里全部使用mybatis-autoconfigure 已经自动加载的资源。不手动指定* 配置文件和mybatis-boot的配置文件同步* @return*/@Beanpublic 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; }}

问题解决!
【解决mybatis-plus通用mapper调用报错:Invalid|解决mybatis-plus通用mapper调用报错:Invalid bound statement】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读