Mybatis-plus 自定义SqlSessionFactory

本文详细解释了如何在Mybatis-Plus项目中正确配置插件,避免失去Mybatis-Plus特性,重点介绍了如何自定义SqlSessionFactory和实现DateAutoFillHandler来处理时间戳填充。

项目中需要用到Mybatis的插件,配置插件的时候需要自定义SqlSessionFactory

网上的信息不太准确,本文记录订正并共享大家。

Mybatis-plus 和Mybatis 是兼容的。

所以网上的配置 mybatis 的SqlSessionFactory 的方法基本上可行,但是对于mybatis-plus 的一些特性会丢失
例如

@TableField(fill = FieldFill.INSERT)
注解

正确的配置方式:

@Component
public class DateAutoFillHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {

        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("modifyTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {

        this.setFieldValByName("modifyTime", new Date(), metaObject);
    }
}
   @Autowired
    MybatisPlusInterceptor mybatisPlusInterceptor;

    @Autowired
    SqlPrintInterceptor sqlPrintInterceptor;



  @Bean(name = "globalConfig")
    public GlobalConfig globalConfig(@Qualifier("dateAutoFillHandler") DateAutoFillHandler dateAutoFillHandler) {
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setMetaObjectHandler(dateAutoFillHandler);
        return globalConfig;
    }

    /**
     * mybatis-plus sqlSessionFactory config
     *
     * @param ds
     * @param globalConfig
     * @return
     * @throws Exception
     */
    @Bean(name = "sqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("db1") DataSource ds, @Qualifier("globalConfig") GlobalConfig globalConfig) throws Exception {
        MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
        factoryBean.setPlugins(new Interceptor[]{mybatisPlusInterceptor, sqlPrintInterceptor});
        factoryBean.setDataSource(ds);

        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
        configuration.setJdbcTypeForNull(JdbcType.NULL);
        factoryBean.setConfiguration(configuration);
        factoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
        factoryBean.setGlobalConfig(globalConfig);

        return factoryBean.getObject();
    }

这样 mybatis-plus 自定义sqlSessionFactory 就配置好了

参考资料:https://www.fancv.com/article/1646836381

<think>我们正在讨论MyBatis-Plus框架中SqlSessionFactory的作用和使用方式。用户的问题很明确:在MyBatis-Plus中,程序员是否需要显式调用SqlSessionFactory对象?根据之前的讨论和引用材料,我们可以总结如下:1.**MyBatis-Plus底层依赖MyBatis**,因此SqlSessionFactory作为MyBatis的核心工厂对象,在MyBatis-Plus中仍然是必需的。2.**使用场景不同,程序员的介入程度不同**:-在**SpringBoot**项目中,通常通过自动配置(`MybatisPlusAutoConfiguration`)来创建和管理`SqlSessionFactory`,程序员无需手动创建或调用。-在**非Spring环境**(如纯Java项目)中,程序员需要手动配置`SqlSessionFactory`(通过`SqlSessionFactoryBuilder`或`MybatisSqlSessionFactoryBean`)。3.**显式调用场景**:-多数据源配置时,需要为每个数据源显式创建独立的`SqlSessionFactory`。-需要自定义插件(如分页插件、性能分析插件)时,可能通过配置类显式设置到`SqlSessionFactory`中。因此,我们可以这样回答用户的问题:**核心答案**:>在MyBatis-Plus中,**程序员通常不需要显式调用`SqlSessionFactory`对象**,尤其是在SpringBoot自动配置环境下。但在特定场景(如多数据源、深度定制)中可能需要显式配置。###详细解释:####1.**SpringBoot自动配置场景(无需显式调用)**-MyBatis-Plus的SpringBootStarter(`mybatis-plus-boot-starter`)会自动配置`SqlSessionFactory`[^2]。-开发者只需配置`application.yml`中的数据库连接和MyBatis-Plus参数,例如:```yamlmybatis-plus:mapper-locations:classpath*:mapper/**/*.xmlconfiguration:log-impl:org.apache.ibatis.logging.stdout.StdOutImpl```-此时`SqlSessionFactory`由Spring容器管理,程序员通过注入`Mapper`接口直接使用,无需接触`SqlSessionFactory`。####2.**非Spring环境或需要深度定制(需显式配置)**-**纯Java项目**:必须手动构建`SqlSessionFactory`[^1]:```javaDataSourcedataSource=getDataSource();//创建数据源MybatisConfigurationconfiguration=newMybatisConfiguration();configuration.addMapper(UserMapper.class);//注册MapperSqlSessionFactorysqlSessionFactory=newMybatisSqlSessionFactoryBuilder().build(configuration);```-**多数据源场景**:在Spring中需显式声明多个`SqlSessionFactory`[^2]:```java@Bean@ConfigurationProperties(prefix="spring.datasource.db1")publicDataSourcedataSource1(){returnDruidDataSourceBuilder.create().build();}@BeanpublicSqlSessionFactorysqlSessionFactory1(DataSourcedataSource1)throwsException{MybatisSqlSessionFactoryBeanfactory=newMybatisSqlSessionFactoryBean();factory.setDataSource(dataSource1);returnfactory.getObject();}```####3.**为什么大多数情况无需显式调用?**-**封装简化**:MyBatis-Plus的`MybatisSqlSessionFactoryBean`封装了XML解析、插件注入等复杂流程[^2]。-**约定优于配置**:默认加载`classpath*:/mapper/**/*.xml`作为SQL映射文件,自动扫描`@Mapper`接口。-**Spring容器托管**:`SqlSessionFactory`被注册为Bean后,由Spring负责其生命周期和依赖注入。###总结对比表|场景|是否需要显式调用/配置`SqlSessionFactory`|示例方式||--------------------------|-------------------------------------------|------------------------------||SpringBoot单数据源|否|自动配置||SpringBoot多数据源|是|声明多个`@Bean`方法||非Spring环境(JavaSE)|是|`newMybatisSqlSessionFactoryBuilder().build()`||自定义插件/特殊配置|是|通过`MybatisSqlSessionFactoryBean`设置插件|>关键结论:**是否显式调用取决于项目环境和定制需求**。SpringBoot的便利性使开发者远离底层细节,但在复杂场景中仍需直接操作`SqlSessionFactory`。###相关问题1.MyBatis-Plus在SpringBoot中如何实现自动配置`SqlSessionFactory`?2.多数据源场景下,如何确保不同的Mapper使用正确的`SqlSessionFactory`?3.如何通过`SqlSessionFactory`自定义MyBatis插件(如分页优化插件)?4.在非Spring项目中,MyBatis-Plus的最小化配置流程是什么?5.MyBatis-Plus的`SqlSessionFactory`与原生MyBatis的构建方式有何差异?[^1]:MyBatis官方文档中SqlSessionFactory的基础构建方式[^2]:Spring环境下通过配置类管理SqlSessionFactory的典型实践</think>### MyBatis-PlusSqlSessionFactory 的调用方式 **核心结论:** **在标准 Spring Boot 项目中,程序员通常不需要显式调用 `SqlSessionFactory` 对象。** MyBatis-Plus 通过自动配置机制隐藏了直接操作,但在特定场景下可能需要显式配置。 #### 一、无需显式调用的场景(主流用法) 1. **Spring Boot 自动配置** MyBatis-Plus 的官方 Starter(`mybatis-plus-boot-starter`)会自动创建并管理 `SqlSessionFactory`。只需配置数据源和 MyBatis-Plus 参数: ```yaml # application.yml spring: datasource: url: jdbc:mysql://localhost:3306/test username: root password: 123456 mybatis-plus: mapper-locations: classpath:mapper/*.xml ``` 2. **直接使用 Mapper 接口** 开发者只需注入 Mapper 接口,无需接触底层 `SqlSessionFactory`: ```java @Autowired private UserMapper userMapper; // 直接使用 public User getUserById(Long id) { return userMapper.selectById(id); // 自动关联SqlSession } ``` #### 二、需要显式配置的场景 1. **多数据源支持** 每个数据源需独立配置 `SqlSessionFactory`: ```java @Bean @ConfigurationProperties(prefix = "spring.datasource.db1") public DataSource dataSource1() { return DruidDataSourceBuilder.create().build(); } @Bean public SqlSessionFactory sqlSessionFactory1(DataSource dataSource1) throws Exception { MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean(); factory.setDataSource(dataSource1); factory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mapper/db1/*.xml")); return factory.getObject(); // 显式创建[^2] } ``` 2. **深度定制需求** - 添加自定义插件(如分页优化) - 修改 MyBatis 原生配置 - 特殊事务管理 ```java @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean(); factory.setDataSource(dataSource); factory.setPlugins(new MyCustomInterceptor()); // 添加自定义插件 factory.setConfiguration(myBatisConfiguration()); // 自定义配置 return factory.getObject(); // 显式构建[^2] } ``` #### 三、框架底层交互原理 ```mermaid graph LR A[DataSource] --> B(MybatisSqlSessionFactoryBean) B --> C[SqlSessionFactory] C --> D[SqlSession] D --> E[MapperProxy] E --> F[执行SQL] ``` 1. **启动阶段**: Spring 容器通过 `MybatisSqlSessionFactoryBean` 自动构建 `SqlSessionFactory`[^2] 2. **运行时阶段**: Mapper 接口被调用时,通过动态代理自动获取 `SqlSession` 3. **资源管理**: `SqlSession` 的生命周期由 Spring 事务管理器控制 #### 四、显式 vs 隐式对比 | 场景 | 是否显式调用 | 代码侵入性 | |--------------------|----------------------|------------| | 单数据源标准项目 | 否 | 低 | | 多数据源 | 是 | 中 | | 添加自定义插件 | 是 | 高 | | 非 Spring 环境 | 必须显式创建 | 高 | > **最佳实践建议**:除非需要多数据源或深度定制,否则应优先使用 Spring Boot 自动配置,避免直接操作 `SqlSessionFactory`。 ### 相关问题 1. MyBatis-Plus 在 Spring Boot 中如何实现 `SqlSessionFactory` 的自动装配? 2. 多数据源场景下如何确保不同 Mapper 使用正确的 `SqlSessionFactory`? 3. 如何通过自定义 `SqlSessionFactory` 集成 MyBatis 原生插件? 4. 非 Spring 项目中 MyBatis-Plus 的最小化配置流程是什么? 5. `SqlSessionFactory` 与 MyBatis-Plus 的分页插件是如何协作的? [^1]: SqlSessionFactoryMyBatis 中的基础作用 [^2]: MyBatis-Plus 配置类中显式创建 SqlSessionFactory 的典型方式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值