package com.sf.config;


import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

/**
 * @author WanJl
 * @version 1.0
 * @title MybatisConifg
 * @description Mybatis核心配置类
 * @create 2025/11/30
 */
public class MybatisConfig {
    /*
        之前在使用mybatis的时候，需要手动创建SqlSessionFactory(SQL会话工厂)对象，
        通过工厂对象开启一个SqlSession会话对象。
        在使用spring整合mybatis的时候，SqlSessionFactory和Mapper对象都可以交给spring管理。
        我们只需要向IOC容器注入Bean就可以了
        为了方便我们注入Bean，mybatis-spring依赖为我们提供了一个类
        就是SqlSessionFactoryBean类型，通过创建它的对象，把它注入到IOC容器作为bean对象
        以后我们也是通过IOC容器获取到SqlSessionFactoryBean对象
        然后再获取到SqlSessionFactory对象，就可以创建SqlSession对象

        之所以这么麻烦，因为以spring、mybatis为代表的框架，属于通用型框架，作用是为了让一切项目都可以使用，
        所以步骤会很多。
     */
    @Bean
    public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource) {
        //创建SqlSessionFactory(SQL会话工厂)对象的bean对象
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        //1、扫描整个包，为里面的所有实体类取别名
        bean.setTypeAliasesPackage("com.sf.entity");
        //2、设置mybatis使用的数据源(连接池)
        bean.setDataSource(dataSource); //会在IOC容器中找到这个对象，传入方法，如果没有就报错--这种方式属于注入引用数据类型
        //把这个对象作为bean注入到IOC容器
        return bean;
    }

    /*
        MapperScannerConfigurer对象直译就是Mapper扫描的配置类
        MapperScannerConfigurer替换的就是mybatis核心配置文件中的<mappers>标签
        用来自动扫描mapper接口并且创建接口的代理对象，自动注入到IOC容器中。
        mapper接口是定了访问数据库的方法接口
        我们在service层就可以直接使用mapper接口了
        MapperScannerConfigurer作用：
            1、扫描指定路径下所有mapper接口
            2、把扫描到的mapper接口生成代理对象，注入到IOC容器中
     */
    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer() {
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.sf.mapper");
        return msc;
    }
}
