【MyBatis-Spring】Mybatis和并入Spring框架

时间:2022-02-10 15:57:52

1.参考书籍:《深入浅出MyBatis技术原理与实战》

2.知识基础:Spring、Mybatis、Spring MVC。

配置数据源

配置SqlSessionFactory

  SqlSessionFactory的作用是生成SqlSession。

  org.mybatis.spring.SqlSessionFactoryBean类负责读取数据源和Mybatis的配置文件路径。解析配置文件后连同数据源一起保存在Spring Bean里面

<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <!--驱动类名 -->
        <property name="driverClass" value="${mysql.driver}" />
        <!-- url -->
        <property name="jdbcUrl" value="${mysql.url}" />
        <!-- 用户名 -->
        <property name="user" value="${mysql.username}" />
        <!-- 密码 -->
        <property name="password" value="${mysql.password}" />
        <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 -->
        <property name="acquireIncrement" value="${mysql.acquireIncrement}"></property>
        <!-- 初始连接池大小 -->
        <property name="initialPoolSize" value="${mysql.initialPoolSize}"></property>
        <!-- 连接池中连接最小个数 -->
        <property name="minPoolSize" value="${mysql.minPoolSize}"></property>
        <!-- 连接池中连接最大个数 -->
        <property name="maxPoolSize" value="${mysql.maxPoolSize}"></property>
    </bean>
     <!--3 会话工厂bean sqlSessionFactoryBean -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 配置文件路径 -->
        <property name="configLocation" value="classpath:MyBatisCfg.xml"></property>
        <!-- 数据源 -->
        <property name="dataSource" ref="datasource"></property>
        <!-- sql映射文件路径 -->
        <property name="mapperLocations" value="classpath*:com/xdsux/spring2/mapping/*Mapper.xml"></property>
    </bean>

数据源使用C3P0数据源,具体参数单独用一个db.properties配置。

Spring在初始化IOC容器的时候将初始化SqlSessionFactoryBean。

映射文件路径可以在这一步配置,也可以在Mybatis配置文件中配置。

<configuration>
    <!-- 指定数据库连接信息的位置 -->
    <properties resource="db.properties"></properties>
    <settings>
        <!--指定mybatis使用日志组件 -->
        <setting
            name="logImpl"
            value="LOG4J2" />
        <!--开启全局的二级缓存 -->
        <setting
            name="cacheEnabled"
            value="false" />
        <!--开启延时加载,如果有关联关系,则默认不会获取数据 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 
            在association中指定fetchType="eager(立即)" 或者 lazy(延迟) 默认:false -->
        <setting
            name="lazyLoadingEnabled"
            value="true" />
        <!--true时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载; false,每种属性将会按需加载。 默认为:true -->
        <setting
            name="aggressiveLazyLoading"
            value="false" />
    </settings>
    <!--类型别名,默认引入com.xdsux.spring2.entities下的所有类 -->
    <typeAliases>
        <package name="com.xdsux.spring2.entities" />
    </typeAliases>
    <!-- <environments default="development"> <environment id="development"> 
        <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" 
        value="${driver}" /> <property name="url" value="${url}" /> <property name="username" 
        value="${username}" /> <property name="password" value="${password}" /> </dataSource> 
        </environment> </environments> <mappers> 引入映射文件 <mapper resource="com/xdsux/spring2/mapping/GoodsMapper.xml" 
        /> </mappers> -->
</configuration>

environments、mappers在Spring那里已经配置了,所以这里注释掉了。<setting>还有更多设置,再说。

其实Spring IOC已经可以配置非常多的属性了,但是遇到复杂的配置时,建议使用MyBatis的配置文件,因为一般实际项目中,Spring的配置文件已经相当复杂了。配置在Mybatis中更便于管理,可读性也更高。

 

配置SqlSessionTemplete

一般使用SqlSessionFactoryBean就可以了,但在定制化编程时可以配置SqlSessionTemplete。

配置Mapper

   <!--4 自动扫描对象关系映射 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定会话工厂,如果当前上下文中只定义了一个则该属性可省去 -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
        <!-- 指定要自动扫描接口的基础包,实现接口 -->
       <!--  <property name="basePackage" value="com.xdsux.spring2.mapper"></property> -->
        <property name="basePackage" value="com.xdsux.spring2.dao"></property>
    </bean>

Mapper只是接口,不是实现类。

Spring-MyBatis通过MapperFactoryBean作为中介,动态代理生成实现类。他有三个参数:

mapperInterface:用于制定接口,其继承者就被认为时一个Mapper

SqlSessionFactory:SqlSessionTemplete属性不被配置时,该属性将被设置

SqlSessionTemplete:这个属性被设置的时候,SqlSessionFactory属性作废。

Spring-Mybatis项目通常采用的配置:

MapperScannerConfiger:采用自动扫描的形式配置映射器。

 

配置事务处理

MyBatis-Spring使用Spring AOP管理事务:

 <!--5 声明式事务管理 -->
    <!--定义事物管理器,由spring管理事务 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="datasource"></property>
    </bean>
    <!--支持注解驱动的事务管理,指定事务管理器 -->
    <tx:annotation-driven transaction-manager="transactionManager" />