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.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;
@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