Mybatis升级Mybatis-plus,解决jar冲突问题

Mybatis升级Mybatis-plus,解决jar冲突问题

  • 项目介绍
  • 准备事项
    • 注意事项
  • 升级操作
  • 依赖冲突解决

项目介绍

基于若依迭代的一个后台管理系统,之前是SpringBoot 2.0 + mybaits框架,为了以后架构问题决定升级成为mybatis-plus架构

准备事项

  1. mybatis-plus官方文档 :点这里;
  2. GitHub地址 :点这里;
  3. mybaits-plus版本选址:点这里 ;

注意事项

当我们准备升级mybatis-plus时,我们需要舍弃之前的mybatis。也就是两者不可兼容。mybatis-plus完全可以替代mybatis的。
Mybatis升级Mybatis-plus,解决jar冲突问题_第1张图片

升级操作

  1. 选择合适的jar包:目前最新的是 3.4.3.4,应为兼容性问题最后采用的是 3.2.0 版本的jar
  2. 在pom.xml中导入对应的jar (springboot 可以直接复制使用)
	<dependency>
		<groupId>com.baomidou</groupId>
		<artifactId>mybatis-plus-boot-starter</artifactId>
		<version>3.2.0</version>
	</dependency>
  1. 这时候我们需要删除之前使用的mybatis-spring-boot-starter
  2. 修改配置 SqlSessionFactory,如果之前有应用SqlSessionFactoryBean,我们需要替换成MybatisSqlSessionFactoryBean
	@Bean
	    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
	    {
	    	// 搜索指定包别名
	        String typeAliasesPackage = env.getProperty("mybatis-plus.type-aliases-package");
	        //配置mapper的扫描,找到所有的mapper.xml映射文件
	        String mapperLocations = env.getProperty("mybatis-plus.mapper-locations");
	        //加载全局的配置文件
	        String configLocation = env.getProperty("mybatis-plus.config-location");
	
	//        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
	        final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
	        sessionFactory.setDataSource(dataSource);
	        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
	        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
	        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
	        return sessionFactory.getObject();
	    }
  1. 修改配置文件信息
    具体可以参考官方提供的配置文件信息:点这里
	mybatis-plus:
	  type-aliases-package: com.qzh.project.**.domain
	  mapper-locations: classpath*:mybatis/**/*Mapper.xml
	  config-location: classpath:mybatis/mybatis-config.xml

取代

	mybatis:
	    # 搜索指定包别名
	    typeAliasesPackage: com.qzh.project.**.domain
	    # 配置mapper的扫描,找到所有的mapper.xml映射文件
	    mapperLocations: classpath*:mybatis/**/*Mapper.xml
	    # 加载全局的配置文件
	    configLocation: classpath:mybatis/mybatis-config.xml

当我们完成以上配置修改后,如果服务中没有jar冲突的话就可以正常的启动项目。。。

依赖冲突解决

当mybatis存在依赖冲突的时候,反馈以下错误:

20:12:14.766 [main] ERROR o.s.b.SpringApplication - [reportFailure,826] - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataDelRecordAspect': Unsatisfied dependency expressed through field 'delMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysDelMapper' defined in file [D:\Program Files\WorkSoftware\company_qzh\qiaozhihui\qiaozhihui-java\target\classes\com\qzh\project\system\mapper\SysDelMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/qzh/framework/config/MyBatisPlusConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
	at com.qzh.QzhApplication.main(QzhApplication.java:17)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysDelMapper' defined in file [D:\Program Files\WorkSoftware\company_qzh\qiaozhihui\qiaozhihui-java\target\classes\com\qzh\project\system\mapper\SysDelMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/qzh/framework/config/MyBatisPlusConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1526)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1406)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1287)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
	... 19 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/qzh/framework/config/MyBatisPlusConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:656)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1287)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1511)
	... 30 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651)
	... 43 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory
	at com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean.<clinit>(MybatisSqlSessionFactoryBean.java:94)
	at com.qzh.framework.config.MyBatisPlusConfig.sqlSessionFactory(MyBatisPlusConfig.java:103)
	at com.qzh.framework.config.MyBatisPlusConfig$$EnhancerBySpringCGLIB$$6963a30e.CGLIB$sqlSessionFactory$0(<generated>)
	at com.qzh.framework.config.MyBatisPlusConfig$$EnhancerBySpringCGLIB$$6963a30e$$FastClassBySpringCGLIB$$535e1cd1.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
	at com.qzh.framework.config.MyBatisPlusConfig$$EnhancerBySpringCGLIB$$6963a30e.sqlSessionFactory(<generated>)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
	... 44 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.mybatis.logging.LoggerFactory
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 56 common frames omitted

可以看到我们在对MybatisSqlSessionFactoryBean实例话的时候出现了错误,导致我们的sqlSessionFactory,加载失败,我这里碰到的问题的是mybatis依赖冲突了,因为我之前应用了分页插件pagehelper,中带了mybatis的版本,和我们mybatis-plus中的mybatis起了冲突,所以我们需要剔除pagehelper中的mybatis

	<exclusions>
		<exclusion>
			<artifactId>mybatisartifactId>
			<groupId>org.mybatisgroupId>
		exclusion>
		<exclusion>
			<artifactId>mybatis-springartifactId>
			<groupId>org.mybatisgroupId>
		exclusion>
	exclusions>

如果习惯使用eclipse的可以下载个 maver helper插件
Mybatis升级Mybatis-plus,解决jar冲突问题_第2张图片
当我们安装重启以后在pom.xml文件下面可以看到一个选择弹框(在Text边上)点击进去以后可以看到冲突的jar包
Mybatis升级Mybatis-plus,解决jar冲突问题_第3张图片
点击左框中的jar,后可以在右框中的jar包来源,右击排除就可以了,会自动早pom.xml文件中添加《exclusions》。

你可能感兴趣的:(学习,java,mybatis)