• 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>
  • 相关阅读:
    第一次JAVA课,第一次课堂考,课后感受【代码部分】
    第一次JAVA课,第一次课堂考,课后感受
    小学期的开始【9.2进度报告】
    暑假的最后一周【8.26进度报告】
    一周质量报告【8.19进度报告】
    人月神话读后感(一)
    Web版记账本开发记录(二)开发过程遇到的问题小结1 对数据库的区间查询
    Web版记账本开发记录(一)代码和功能展示
    tomcat错误The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    库存物资管理系统
  • 原文地址:https://www.cnblogs.com/magic-sea/p/11219561.html
Copyright © 2020-2023  润新知