1 问题
RuoYi-Vue目前的orm框架是mybatis,希望改造为mybatisplus。
2 流程
2.1 删除所有跟mybatis相关的包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
2.2 修改项目配置类(sqlsessionfactory)
要用的是MybatisSqlSessionFactoryBean
而不是SqlSessionFactoryBean
从MybatisPlusAutoConfiguration
的源码中,我们可以得知,当项目已经有配置SqlSessionFactory
。mybatis-plus
将不会自动帮我们注入SqlSessionFactory
,而使用我们自己定义的SqlSessionFactory
。而若依项目配置的SqlSessionFactory
不是MybatisSqlSessionFactoryBean
。
方法一:
找到若依的mybatis配置类:
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
{
String typeAliasesPackage = env.getProperty("mybatis.type-aliases-package");
String mapperLocations = env.getProperty("mybatis.mapper-locations");
String configLocation = env.getProperty("mybatis.config-location");
typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
VFS.addImplClass(SpringBootVFS.class);
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
return sessionFactory.getObject();
}
将其中的SqlSessionFactoryBean
修改为MybatisSqlSessionFactoryBean
也就是:
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
{
String typeAliasesPackage = env.getProperty("mybatis.type-aliases-package");
String mapperLocations = env.getProperty("mybatis.mapper-locations");
String configLocation = env.getProperty("mybatis.config-location");
typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
VFS.addImplClass(SpringBootVFS.class);
final MybatisSqlSessionFactoryBeansessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
return sessionFactory.getObject();
}
方法二:
把上面的这段代码,全删了。这样mybatis-plus
就会自动帮我们注入sqlSessionFactory
引入的base类:
BaseMapper
必须是
扫描二维码关注公众号,回复:
13219518 查看本文章
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
而不是
import com.baomidou.mybatisplus.mapper.BaseMapper;
不过出现这个问题,通常也是引入不同版本的mybatis-plus jar才会出现。如果你是只用3+以上版本,他引入就只有
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
3 常见问题
3.1 找不到Mapper方法
Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.lybgeek.admin.file.mapper.FileMapper.insert
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53)
at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:107)
at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:94)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)
at com.sun.proxy.$Proxy129.insert(Unknown Source)
at com.baomidou.mybatisplus.extension.service.IService.save(IService.java:59)
at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
解决方法:
通常就是没有删掉所有的mybatis包,或者配置类没有修改。
3.2 方法不存在
Handler dispatch failed nested exception is java.lang.NoSuchMethodError
解决办法:删掉你多余的相同依赖
- 你的pom文件中可能存在多个一样的依赖,而且版本号还不一样去看看你的pom文件吧
- 总之, 遇到这个异常应该留意一下各模块之间是否有重复依赖的问题
有其他交流的想法,可以加我创建的Q群:820080257