MyBatis源码分析(六):Spring整合分析

一、Mybatis-Spring源码结构

 

二、Myabtis交给Spring管理的组件

1. dataSource 数据源

配置一个数据源,只要是实现了javax.sql.DataSource接口就可以,可以使任意第三方数据源

 

 1 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 2     <property name="driverClassName">
 3         <value>com.mysql.jdbc.Driver</value>
 4     </property>
 5     <property name="url">
 6         <value>jdbc:mysql://localhost:3306:/mybatis?zeroDateTimeBehavior=convertToNull</value>
 7     </property>
 8     <property name="username">
 9         <value>root</value>
10     </property>
11     <property name="password">
12         <value>root</value>
13     </property>
14 </bean>

 

 

 

2. sqlSessionFactory 生成sqlSession的工厂

  给出两个参数,一个是dataSource数据源,另一个是和Mybatis配置文件路径,classpath说明它在.class文件里面。这样Spring初始化IOC容器时区初始化SqlSessionFactoryBean,它是通过解析Myabtis配置文件得到Myabtis运行所需要的上下文。

 

1 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
2     <property name=dataSource" ref="dataSource" />
3     <property name=configLocation" value="classpath:sqlMapConfig.xml" />
4 </bean>

 

 

 

3. sqlSessionTemplate 调用sqlSession的模板类

SqlSessionTemplate是Mybatis-Spring的一个核心类。可以通过SqlSessionFactory作为参数,另一个是SqlSessionFactory和执行器类型作为参数。

 

<bean id="sqlSessionTemplate" calss="org.mybatis.spring.SqlSessionTemplate">
    <construct-arg index="0" ref="sqlSessionFactory"/>
</bean>

 

或者

1 <bean id="sqlSessionTemplate" calss="org.mybatis.spring.SqlSessionTemplate">
2     <construct-arg index="0" ref="sqlSessionFactory" />
3     <construct-arg name="1" value="BATCH" />  
4 </bean>

  这就意味着Spring会把之前配置好的SqlSessionFactory设置到SqlSessionTemplate中,同时使用SqlSessionTemplate和SqlSessionFactory,系统会用SqlSessionTemplate覆盖掉另外一个。它的效果等同SqlSession对象。

4. mapper 映射器

  Mapper只是一个接口,而不是一个实现类,是由Myabtis动态代理的形式生成代理对象去运行的,Spring也没有办法为其生成实现类。MapperFactoryBean类作为中介,通过配置实现为我们所想要的Mapper,它有三个参数MapperInterface 定制接口、SqlSessionFactory SqlSessionTemplate属性没有被配置时设置,SqlSessionTemplate 设置后SqlSessionFactory作废。这个效果等同于SqlSession.getMapper(UserDao.class)

 

1 <bean id="userDao" calss="org.mybatis.spring.mapper.MapperFactoryBean">
2     <property name="mapperInterface" value="org.wusf.dds.model.mapper" />
3     <property name="sqlSessionTemplate" ref="sqlSessionTemplate" />
4     <!-- 如果同时注入SqlSessionTemplate和SqlSessionFactory,只启用SqlSessionTemplate -->
5 </bean>

 

  MapperScannerConfigurer 配置自动扫描信息。basePackage,指定让Spring自动扫描什么包,会逐层深入扫描;annotationClass,表示类被这个注解标识后被扫描;sqlSessionFactoryBeanName,指定Spring中定义sqlSessionFactory的bean名称,被定义后sqlSessionFactory不起作用;sqlSessionTemplateBeanName,指定Spring中定义sqlSessionTemplate的bean名称,被定义后sqlSessionFactory不起作用;markerInterface,指定实现了什么接口就认为他是Mapper。

 

 

1 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
2     <property name="basePackage" value="org.wusf.dds.model.mapper" />
3     <property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate" />
4     <property name="annotationClass" value="org.springframework.stereotype.Repository" />
5 </bean>

 

 

 

5. transactionManager 事务管理器

Myabtis和Spring结合后是使用Spring AOP去管理事务的,分为 声明式事务(比较方便,大部分场景下适用,主流) 和 编程式事务 两种

配置配置Spring声明式事务

 

1 <bean id="txManager" class="org.springframework.jdbc.dataSource.DataSourceTransactionManager">
2     <property name="dataSource" ref="dataSource" />
3 </bean>
4 <!-- 使用声明式事务管理方式(注解) -->
5 <tx:annotation-driven transation-manager="txManager" />

 

业务层是处理业务的地方,也是处理数据库事务的地方。Spring配置业务层,使用@Service表示哪个类是业务层的类,也可以同自动扫描的方法读取Service对象到Spring上下文中

1 <context:component-scans base-package="org" use-default-filters="false">
2     <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
3 </context:component-scan>

 

posted @ 2019-07-21 10:59  賣贾笔的小男孩  阅读(234)  评论(0编辑  收藏  举报