Spring&Mybatis整合

这里使用的Spring真正的意义上应该是Spring ioc,官方的话不谈,在项目中使用到Spring这款轻量级的框架,主要看重的就是其对于多个框架之间的整合,包容性。Spring在项目开发的各个层面中几乎都有涉及,Spring扮演者管家的角色,是的项目的开发更为的轻便。

Mybatis则是一款持久层的框架,其主要优势在于可适应多种开发环境,而且无侵入,性能优,重用性强,可维护性高。那么这两款框架结合在一起会发挥出怎样的化学反应呢。

Spring业务&配置

既然使SM的强强联合,那么就主要涉及到了数据业务的处理,Spring与Mybatis都可以通过配置来连接数据源,既然如此,那当然将这个担当交给了Spring,Spring的多面性能够减少以后项目维护的任务量。Mybatis只处理持久层的业务,当倘若更换了业务需求,无法使用Mybatis则需要另外的配置维护。

<!-- 加载db.properties配置文件 -->
<context:property-placeholder location="classpath:db.properties" />

<!-- 配置数据源需要commons-dbcp.jar和commons-pool.jar- -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
	destroy-method="close">
	<property name="driverClassName" value="${driver}" />
	<property name="url" value="${url}" />
	<property name="username" value="${db.username}" />
	<property name="password" value="${db.password}" />
	<!-- 连接池启动时的初始值 -->
	<property name="initialSize" value="${initialSize}" />
	<!-- 连接池的最大值 -->
	<property name="maxActive" value="${maxActive}" />
	<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
	<property name="maxIdle" value="${maxIdle}" />
	<!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
	<property name="minIdle" value="${minIdle}" />
</bean>

 Mybatis与Hibernate相似也有一个会话工厂,其名为SqlSessionFactory,Mybatis与Spring整合后,Spring同样的可以配置一个SqlSessiongFactory会话工厂的bean节点。在节点中可以注入一些Mybatis的配置信息

在Spring配置文件中配置的会话工厂节点的配置不能与另外在Mybatis-spring.xml中单独配置的Mybatis信息有冲突或重复。否则会出错。

<!-- SqlSessionFactory注册 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<!-- 注入数据库连接池 -->
	<property name="dataSource" ref="dataSource" />
	<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
	<property name="configLocation" value="classpath:mybatis-spring.xml" />
	<!-- 扫描entity包 使用别名 -->
	<!-- <property name="typeAliasesPackage" value="com.glmapper.framerwork.entity" /> -->
	<!-- 扫描sql配置文件:mapper需要的xml文件;**表示包下的全部子包内容 -->
	<property name="mapperLocations" value="classpath:com/**/*Mapper.xml" />
</bean>

 Spring有两种方式可以管理Dao业务层,一种是最为流行的Map映射的方式,还有一种使用Mybatis会话模板以及基类j接口搭配使用。

扫描映射不需要声明Dao类,Spring会动态的映射Dao类,但扫描的接口需要添加Respository注解才能被映射。

<!-- 扫描basePackage下的所有@Respository注解的接口,动态创建Dao接口实现类 -->
	<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
		<property name="basePackage" value="com.ozc"/>
		<property name="annotationClass" value="org.springframework.stereotype.Repository"></property>
	</bean>

 使用Mybatis会话模板

<!-- Mybatis会话模板 -->
	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg index="0" ref="sqlSessionFactory"/>
	</bean>

 使用第二种方式需要在基类中添加注解,不然会配置的会话工厂节点会无效。基类需要继承SqlSessionDaoSupport类。继承了该类后,可以直接通过父类获取会话SqlSession。

@Resource
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate){
    //注入Mybatis操作模板
	super.setSqlSessionTemplate(sqlSessionTemplate);
}

除此之外,数据操作的事务管理也都是由Spring来处理。这里不再作赘述。 

Mybatis持久层&映射

Mybatis的数据源连接交给了Spring。基本只要要配置少量内容,在这里使用到了Mybatis插件,所以需要独立的再Mybaits中作配置说明,否则插件无法使用。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<!-- 全局设置 -->
	<settings>
		<!--按照以下规则映射:把表字段名的下划线删除,并且单词首字母变大写, 得到相应属性名,默认是false -->
		<setting name="mapUnderscoreToCamelCase" value="true" />
	</settings>
	<!-- 配置别名 -->
	<typeAliases>
		<!-- 查找类时,默认到该包下找 -->
		<package name="com.ozc.entity" />
	</typeAliases>
	<!-- 分页插件 -->
	<plugins>
		<!-- com.github.pagehelper为PageHelper类所在包 -->
		<plugin interceptor="com.**.**.Page*">
			<property name="dialect" value="oracle"/>
		</plugin>
	</plugins>
</configuration>

上面的内容Spring已经配置了自行扫描sql配置文件的信息,只要告知扫描的范围,将Mapper映射文件放在范围内的包中,Mybatis的映射为间的namespace就只需要定义其文件名即可。到此,整合的配置需要注意的方面基本就这些了。