MyBatis-Plus【踩坑记录01】
不要使用Mybatis原生的SqlSessionFactory,而应使用MybatisSqlSessionFactory。
原因
-
依赖关系如下
因此会在使用Mybaits-Plus
时默认的时Mybatis原生的SqlSessionFactory -
因为
MybatisPlus
中自定义了MybatisSqlSessionFactoryBean
这个类,而这个类是实现了FactoryBean<SqlSessionFactory>
,InitializingBean
,ApplicationListener<ApplicationEvent>
这些接口,而在Mybatis
中有一个SqlSessionFactoryBean
类也实现了这些接口,所以在MybatisPlus
的配置文件中配置SqlSessionFactoryBean
时需要换成MybatisPlus
中自定义的这个类MyBatisSqlSessionFactoryBean
,否则使用原生的SqlSessionFactoryBean
会产生很多问题,这也是官方文档出现-invalid-bound-statement-not-found-异常中的最后第4点特别说明并推荐的
解决方案
相应的配置类如下
package zeyfra.com.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import zeyfra.com.aspect.mybatis_plus.MyMetaObjectHandler;
import javax.sql.DataSource;
/**
* MyBatis-Plus配置类
* @author ZeyFra
* @date 2021/2/16 13:27
*/
@Configuration
@EnableTransactionManagement
@MapperScan("zeyfra.com.modules.**.mapper")
public class MybatisPlusConfig {
@Bean("sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Autowired @Qualifier("dataSource") DataSource dataSource) throws Exception {
// 未使用MyBatis-Plus的分页插件的小伙伴可忽略此部分
// MybatisPlus内部拦截器
// 为自动分页插件设置DB类型
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 可添加自定义拦截器,没有自定义拦截器的小伙伴可忽略此部分
// MybatisConfiguration
MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
mybatisConfiguration.addInterceptor(mybatisPlusInterceptor);
// 开启缓存,可自行选择
mybatisConfiguration.setCacheEnabled(true);
// 使用MybatisSqlSessionFactoryBean
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
// 设置数据源
sqlSessionFactoryBean.setDataSource(dataSource);
// 添加MybatisConfiguration
sqlSessionFactoryBean.setConfiguration(mybatisConfiguration);
// 设置mapper相应的xml路径
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:zeyfra/com/modules/**/*.xml"));
// 返回MybatisSqlSessionFactoryBean从而替代原生的sqlSessionFactory
return sqlSessionFactoryBean.getObject();
}
}
注意:
1、使用MybatisSqlSessionFactory
之后配置应重新在此注入相应的拦截器
2、在3.4.0过后已弃用PaginationInterceptor
,应使用MybatisPlusInterceptor
添加自动分页插件PaginationInnerInterceptor
3、应在自动分页插件设置DB类型,否则容易出现分页查询后total
为0的问题
4、pageHelper
依赖会与自动分页插件产生冲突,也会出现分页查询后total
为0的问题