Spring源码:spring-mybatis重要类

本文详细解析了MyBatis的配置方式,包括SqlSessionFactoryBean的属性与作用,以及如何通过MapperFactoryBean和MapperScannerConfigurer自动扫描和注册Mapper接口,实现数据访问对象的动态代理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置一:

<bean id="defaultSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="defaultDataSource" />
    <property name="mapperLocations">
        <array>
            <value>classpath*:dal/mapper/**/*.xml</value>
            <value>classpath*:mapper/*.xml</value>
        </array>
    </property>
    <property name="configLocation" value="classpath:dal/youzan-ibatisCfg.xml" />
    <property name="typeAliasesPackage" value="com.youzan.ump.marketing.dal.*.dataobject"/>
</bean>

<bean id="pointDeductionMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.mapper.pointdeduction.PointDeductionMapper"/>
    <property name="sqlSessionFactory" ref="defaultSqlSessionFactory"/>
</bean>

<bean id="pointDeductionRecordMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.mapper.pointdeduction.PointDeductionRecordMapper"/>
    <property name="sqlSessionFactory" ref="defaultSqlSessionFactory"/>
</bean>

配置二:

<bean id="defaultSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="defaultDataSource" />
    <property name="mapperLocations">
        <array>
            <value>classpath*:dal/mapper/**/*.xml</value>
            <value>classpath*:mapper/*.xml</value>
        </array>
    </property>
    <property name="configLocation" value="classpath:dal/youzan-ibatisCfg.xml" />
    <property name="typeAliasesPackage" value="com.youzan.ump.marketing.dal.*.dataobject"/>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.mapper" />
    <property name="sqlSessionFactoryBeanName" ref="defaultSqlSessionFactory" />
</bean>
  • SqlSessionFactoryBean结构

    public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent>{
        private Resource configLocation; // mybatis配置文件位置
        private Resource[] mapperLocations; // mapper文件位置
        private DataSource dataSource;      // 数据源
        private TransactionFactory transactionFactory;
        private Properties configurationProperties;
        private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        private SqlSessionFactory sqlSessionFactory;
        private String environment = SqlSessionFactoryBean.class.getSimpleName();
        private boolean failFast;
        private Interceptor[] plugins;
        private TypeHandler<?>[] typeHandlers;
        private String typeHandlersPackage;
        private Class<?>[] typeAliases;
        private String typeAliasesPackage;
        private Class<?> typeAliasesSuperType;
        private DatabaseIdProvider databaseIdProvider;
        private ObjectFactory objectFactory;
        private ObjectWrapperFactory objectWrapperFactory;
        //.......
    }
    

    该类可以取代mybatis的配置,直接注入属性值,即你完全可以取消配置中的configLocation属性,而把其中的属性直接写在SqlSessionFactoryBean中

  • SqlSessionFactoryBuilder:用于构造SqlSessionFactory

  • SqlSessionFactory:创建SqlSession的工厂,默认实现是DefaultSqlSessionFactory

    SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像.SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例.每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心.同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在.在应用运行期间不要重复创建多次,建议使用单例模式

  • MapperFactoryBean:MapperFactoryBean的出现为了代替手工使用SqlSessionDaoSupport或SqlSessionTemplate编写数据访问对象(DAO)的代码,使用动态代理实现

    public class MapperFactoryBean<T> extends SqlSessionDaoSupport implements FactoryBean<T> {
      private Class<T> mapperInterface;
      // ......
    }
    
  • MapperScannerConfigurer:查找类路径下的映射器并自动将它们创建成MapperFactoryBean。

    public class MapperScannerConfigurer implements BeanDefinitionRegistryPostProcessor, InitializingBean, ApplicationContextAware, BeanNameAware {
    
    private String basePackage;
    
    private SqlSessionFactory sqlSessionFactory;
    
    private SqlSessionTemplate sqlSessionTemplate;
    
    private String sqlSessionFactoryBeanName;
    
    //......
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bboyzqh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值