前面已经有一篇利用idea整合ssm框架的helloworld入门项目(http://blog.csdn.net/zyf2333/article/details/77623537),这里主要跟着课本把基本配置说明一下。以供参考
1)概述
MyBatis-Spring项目是MyBatis社区自己编写出来的项目,使得MyBatis3能在Spring中使用。因此我们先要去下载MyBatis-Spring的jar包(http://mvnrepository.com/artifact/org.mybatis/mybatis-spring/1.3.1),然后自行添加到运行环境中去
配置MyBatis-Spring分为下面几个部分
- 配置数据源
- 配置SqlSessionFactory
- 配置SqlSessionTemplate
- 配置Mapper
- 事务处理
在学习mybatis基础入门时候(http://blog.csdn.net/zyf2333/article/details/77528279)我们知道了,要构建SqlSessionFactory对象,让它来产生SqlSession,而在MyBatis-Spring项目中是通过SqlSessionTemplate来实现的,它提供了对SqlSession的封装。所以通过SqlSessionTemplate可以得到Mapper。下面开始配置
2)配置SqlSessionFactory
SqlSessionFactory作用就是生产SqlSession。而MyBatis-Spring项目提供了org.mybatis.springSqlSessionFactoryBean类给我们配置。一般而言,我们要给出两个参数,一个是数据源,一个是mybatis的配置文件路径,这样SpringIOC容器就会初始化这个SqlSessionFactoryBean,解析MyBatis配置文件并连同数据源一同保存在SpringBean里面,接下来看看配置的代码清单:
配置SqlSessionFactory:(applicationContext.xml)
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<!-- MySQL中有个example数据库 -->
<value>jdbc:mysql://localhost:3306/example</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value><!-- 写上你自己的MySQL的密码 --></value>
</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
</bean>
sqlMapConfig.xml(和applicationContext.xml在同一目录下)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//iBATIS.com//DTD SQL Map Config 3.0//EN"
"mybatis-3-config.dtd" >
<configuration>
<!-- 这些settings一般用不到,现阶段写出来知道就好了。主要还是写别名和指定映射器路径 -->
<settings>
<!-- 这个配置使全局的映射器启用或者禁用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 允许jdbc支持生成的键 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认执行器。SIMPLE执行器没什么特别的,REUSE执行器重用预处理语句,BATCH执行器重用语句和批量更新 -->
<setting name="defaultExecutorType" value="REUSE" />
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 设置超时时间,单位是毫秒 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
<!-- 别名配置 -->
<typeAliases>
<typeAlias alias="role" type="com.mkyong.common.po.Role" />
</typeAliases>
<!-- 指定映射器路径 -->
<mappers>
<mapper resource="com\mkyong\common\po\role.xml" />
</mappers>
</configuration>
到此SqlSessionFactory配置完成。总的来说其实变化不是很大,就是mybatis基础配置文件中配置数据库的部分放入了spring的配置文件中,然后这个spring的配置文件引用了mybatis的基本配置文件
3)配置SqlSessionTemplate
SqlSessionTemplate(org.mybatis.spring.SqlSessionTemplate)是个模板类,通过调用SqlSession来完成工作,所以在MyBatis-Spring项目中它是核心。有两种构建它的方法,一种是只有一个SqlSessionFactory作为参数;另一种是有2个参数(SqlSessionFactory和执行器类型)。接下来看看代码:
方法一,使用SqlSessionFactory
//该代码接着上面的spring的配置文件
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
方法二,使用两个参数构建
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"
scope="prototype">
<constructor-arg index="0" ref="sqlSessionFactory" />
<constructor-arg index="1" value="BATCH" />
</bean>
通过这些配置就意味着Spring会把我们之前配置的SqlSessionFactory设置到SqlSessionTemplate中(感觉就是SqlSessionFactory创建出来就是专门为了让SqlSessionTemplate合并的)。
接下来通过Mapper来看看SqlSessionTemplate是如何使用的
4)配置Mapper
按照课本的说法,在代码中,大部分场景不建议使用SqlSessionTemplate或者SqlSession的方式,这里我们采用Mapper接口编程的方式,让SqlSessionTemplate在开发过程中“消失”,这样更符合面向对象,也更容易理解
4.1 MapperFactoryBean
在mybatis中,Mapper只需要是一个接口即可,它是由MyBatis体系通过动态代理的形成生成代理对象去运行的,所以Spring也没有办法为其生成实现类。为了处理这个问题,MyBatis-Spring提供了MapperFactoryBean作为中间。我们通过它来配置想要的Mapper。主要有以下三个参数
- mapperInterface:制定接口,当我们的接口继承了配置的接口,那么MyBatis就认为它是个Mapper
- SqlSessionFactory:当SqlSessionTemplate未配置时候,MyBatis-Spring才会去设置它。
- SqlSessionTemplate:注入DAO中,当它设置时候,SqlSessionFactory将被作废,如代码所示
<bean id="userDAO" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- UserDAO接口将被扫描为Mapper,上面创建的sqlSessionTempalte也引用了 -->
<property name="mapperInterface" value="com.dao.UserDAO"/>
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>
4.2 MapperScannerConfigurer
一个复杂的系统中存在很多DAO,不仅仅UserDAO,还有角色的RoleDAO,产品的ProductDAO,如果一个个配置,工作量很大。MyBatis-Spring处理了这种状况,采用自动扫描的形式来配置我们的映射器,这样可以在很少的代码情况下完成对映射器的配置
在MyBatis-Spring项目中,采用的是MapperScannerConfigurer。它有下面几个属性
- basePackage:指定让Spring自动扫描什么包
- annotationClass:表示如果类被这个注解标识的时候,才进行扫描
- sqlSessionFactoryBeanName:指定Spring中定义sqlSessionFactory的bean名称,如果被定义,sqlSessionFactory将不起作用
- sqlSessionTemplateBeanName:类似上面一条
- markerInterface:指定是实现了什么接口就认为它是Mapper。我们需要提供一个公共的接口去标记。在Spring配置前需要给DAO一个@Repository注解
比如
import org.springframework.stereotype.Repository;
@Repository
public interface UserDAO {
...
}
然后在Spring中配置它
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.learn.dao" />
<property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate" />
<property name="annotationClass" value="org.springframework.stereotype.Repository"></property>
</bean>
这样Spring上下文就会自动扫描com.learn.dao来找到@Repository注解的接口,自动生成Mapper,从而无需多余的配置
5)配置事务
学Spring时候我们就是用的AOP,此处也一样。它分为声明式事务和编程式事务。主流是声明式事务。此处看简单举例
<!--事务管理器-->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--使用声明式事务管理器-->
<tx:annotation-driven transaction-manager="txManager" />
这时候我们需要业务层,通过spring扫描配置,代码如下
<context:component-scan base-package="com">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Service" />
</context:component-scan>
这样Spring会自动扫描这些Service对象的bean读取到上下文中。MyBatis的事物就交给Spring控制,我们只需要在Spring中通过注解注入即可,如下
@Service("userService")
public class UserServiceImpl implements UserService{
...
@Autowired
private UserDAO userDAO;//注解注入userDAO
}