SpringBoot使用@Mapper和@MapperScan注解无效的解决方法
在使用@Mapper注解时,注解无效,service层,dao层该添加的注解都添加了,最后发现是少加了一个jar包
<!--缺少此jar包,导致@Mapper注解无效-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
添加此依赖,注解即可正常使用。
还有就是可能是版本号有问题。除此之外,SpringBoot项目别忘了要在properties配置文件中配置mapper.xml文件存放路径,否则会报Invalid bound statement (not found): cn.hzr0523.dao.UserMapper.insertUserInfo错误。
mybatis.mapper-locations=classpath:mapper/*.xml
2019-04-23 遇一问题:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.mybatis.spring.boot</groupId>-->
<!-- <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!-- <version>2.0.1</version>-->
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <groupId>org.mybatis</groupId>-->
<!-- <artifactId>mybatis</artifactId>-->
<!-- </exclusion>-->
<!-- <exclusion>-->
<!-- <groupId>org.mybatis</groupId>-->
<!-- <artifactId>mybatis-spring</artifactId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<!-- </dependency>-->
使用当前最新版本的MyBatis Plus, 如果使用mybatis-plus-boot-starter依赖,一切正常,但是我想使用下面两个依赖替换上面的依赖,结果老是有问题。排除jar包冲突之后,启动项目虽然正常,但访问Mapper时报错。遇到的错误有一下几个:
- 只去掉mybatis-plus-boot-starter依赖,Mapper中继承了BaseMapper<>接口,想使用mybatisplus提供的方法,但是一调用方法就报invalid bind statement, 提示我调用selectOne()找不到。
- 如果把mybatis-spring-boot-starter整个依赖去掉,只留下mybatis-plus依赖,则会报:java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.mybatis.spring.annotation.MapperScan.factoryBean(),没有此jar包,导致mapperscan注解无法使用。
???为什么会这样,后面两个依赖和第一下依赖的效果难道不是一样的吗。。。
经过对官方文档的理解,应该后面两个依赖使用springMVC框架,一些配置需要写到xml中,在springboot中无法实现自动绑定,需要自己手动创建配置文件。
解决方法:加个MyBatisConfig文件
@Configuration
@MapperScan(basePackages = { "cn.hezhiren.funshop.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory")
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
@Primary
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor page = new PaginationInterceptor();
page.setDialectType("mysql");
return page;
}
/**
* 这里全部使用mybatis-autoconfigure 已经自动加载的资源。不手动指定 配置文件和mybatis-boot的配置文件同步
*
* @return
*/
@Primary
@Bean(name = "sqlSessionFactory")
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()));
}
// mybatisPlus.setConfiguration(properties.getConfiguration());
if (!ObjectUtils.isEmpty(this.interceptors)) {
mybatisPlus.setPlugins(this.interceptors);
}
// MP 全局配置,更多内容进入类看注释
// GlobalConfiguration globalConfig = new GlobalConfiguration();
// globalConfig.setDbType(DBType.MYSQL.name());
// // ID 策略 AUTO->`0`("数据库ID自增")
// // INPUT->`1`(用户输入ID") ID_WORKER->`2`("全局唯一ID") UUID->`3`("全局唯一ID")
// globalConfig.setIdType(0);
// mybatisPlus.setGlobalConfig(globalConfig);
// MybatisConfiguration mc = new MybatisConfiguration();
// mc.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
// 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;
}
/**
* SQL执行效率插件
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
}
主要原因应该就是SqlSessionFactory
,没有使用第一个依赖,没有配置sqlSessionFactory的话,则Spring会加载默认的原生mybatis自带的sqlSessionFactory,而没有使用mybatisplus提供的MyBatisSqlSessionFactory,导致invalid bind statement的出现。使用配置文件配置MyBatisSqlSessionFactory之后,则就可以正常只用BaseMapper中提供的方法。
当然,现在有第一个与springboot集成的jar包了,直接使用即可,很方便,配置也更加容易,不需要额外添加配置文件。
那么…问题又来了,mybatis-plus-boot-start又是如何实现与springboot集成的呢,首先开下jar包目录:
在这里就帮你配置了上面的那种配置文件(MyBatisAutoConfiguratuion)。
代码中重要的一点,使用MyBatisSqlSessionFactory取代SqlSessionFactory。
除此之外,还有一个spring.factory文件
这个spring.factories里面配置的类,主要作用是告诉Spring Boot这个stareter所需要加载的那些xxxAutoConfiguration类,也就是你真正的要自动注册的那些bean或功能。然后,我们实现一个spring.factories指定的类,标上@Configuration注解,一个starter就定义完了。
读取spring.factories文件的实现是通过org.springframework.core.io.support.SpringFactoriesLoader实现。
更多推荐
所有评论(0)