【MyBatis-Spring】Mybatis和并入Spring框架
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" />