一、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>