SSM即Spring、SpingMVC、MyBatis三种框架的结合使用,Spring框架可以看做为一个粘合剂的作用,用来粘合SrpingMVC和MyBatis框架。
我个人是想着把SSM框架整合分成两部分,Spring和MyBatis,然后再整合SpringMVC。
首先来看一下Spring和Mybatis。
第一步:首先是先配置数据源
<!-- 引入properties文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:database.properties</value>
</property>
</bean>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${password}" />
</bean>
- 作为Bean容器,Sring框架提供了Ioc机制,可以接管所有组件的创建工作并进行依赖管理,因而整合的主要工作就是把MyBAtis框架使用中所涉及的核心组件配置到Spring容器中,交给Spring来创建和管理。
- 具体来说,业务逻辑对象依赖基于MyBAtis技术实现的DAO对象,核心是获取SqlSession实例。要获得SqlSession实例,则需要依赖SqlSessionFactory实例。而SqlSessionFactory是SqlSessionFactoryBuilder依据配置文件中的数据源、SQL映射文件等信息来构建的。(也就是通过SqlSessionFactoryBuilder的builder()方法来构建的,builder()方法中的参数为InputStream文件流对象。
- 上面有提到我们需要使用的SqlSessionFactory是SqlSessionFactoryBuilder依据配置文件中的数据源、SQL映射文件等信息来构建的,而在集成环境中则可以使用MyBatis-Spring整合包中的SqlSessionFactoryBean来代替。SqlSessionFactoryBean封装了使用SqlSessionFactoryBuilder创建SqlSessionFactory的过程,我们可以在Spring中以配置文件的形式通过配置SqlSessionFactoryBean获得SqlSessionFactory实例。
- 可能会有人忘记了SqlSessionFactory以及SqlSession是用来干什么的,那么我们就来回顾一下SqlSessionFactory以及SqlSession。
- SqlSessionFactory:每个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心,首先获取SqlSessionFactoryBuilder对象,可以根据XML配置文件或Configuration类的实例构建该对象,然后通过SqlSessionFactoryBuilder的builder()方法来获得SqlSessionFactory对象实例,有了SqlSessionFactory对象之后,通过openSession()的方法进而获取SqlSession实例,SqlSession对象中完全包含以数据库为背景的所有自行SQL操作的方法。可以用该实例来直接执行已映射的SQL语句。(简单的一句话就是说SqlSessionFactory是用来获取SqlSession的,而SqlSession则是用来执行SQL语句的。)
- 备注:SqlSessionFactory对象一旦创建,就会在整个应用运行过程中使用存在。没有理由去销毁或者在创建,最佳作用域为Application,跟随应用的声明周期一同存在。
- 备注:SqlSession是用于执行持久化操作的对象类似于JDBC中的Connection。它提供了面向数据库执行SQL命令所需的所有方法,可以通过SqlSession实例直接运行已映射的SQL语句,SqlSession对应着一次数据库会话,由于数据库会话不是永久的,因此SqlSession的生命周期也不应该是永久的。相反,在每次访问数据库时都需要创建它,并不是说在SqlSession里只能执行一次SQL语句,可以执行多次,但是若是关闭了SqlSession,就要通过SqlSessionFactory的openSession()方法创建。
第二步:配置SqlSessionFactoryBean:
<!-- 配置SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 引用MyBAtis配置文件中的配置 -->
<property name="configLocation" value="classpath:MyBatise.xml"/>
<property name="mapperLocations">
<list>
<value>
ClassPath:com/it/dao/*.xml
</value>
</list>
</property>
</bean>
- 那么我们SqlSessinFactoryBean配置完成之后应该做什么呢?对于MyBatis而言得到SqlSession,就可以进一步获取SqlSession示例进行数据库操作了,而在集成环境中,为更好的使用SqlSession,充分利用Spring框架提供的服务,MyBatis-Spring整合包中提供了SqlSessionTemplate类。
- SqlSessionTemplate类实现了MyBatis的SqlSession接口,可以替换MyBatis中原有的SqlSession实现类提供数据库访问操作。使用SqlSessionTemplate可以更好地与Spring服务融合并简化部分流程化的工作,可以保证和当前Srping事务相关联,自动管理会话的声明周期,包括必要的关闭、提交和回滚操作。
- 但是如果只使用SqlSessionTemplate执行基本的数据库访问的操作,而不包含其他的非MyBatis的工作,可以不必手工编码使用SqlSessionTemplate或SqlSessionDaoSupport来实现此类Dao。MyBatis-Spring提供了MapperFactoryBean,能够已配置的方式生成映射器实现并注入给业务组件。(简单来说,就是我们没有必要在Dao层使用Dao接口的实现类来执行数据库增删改查的操作了,配置注入映射器它自己就帮我们执行了)
所以第三步:配置注入映射器
<bean id="xxxMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.it.dao.xxxMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
- 在Spring配置文件中使用MapperFactoryBean对映射器做配置,简化了Dao模块的编码,不过如果映射器很多的话,相应的配置项也会很多。为了简化配置工作量,MyBatis-Spring中提供MapperScannerConfigurer,它可以扫描指定包中的接口并将他们注册为MapperFactoryBean。
配置信息如下:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value=""/>
</bean>
value里的信息为Dao层所在的包的路径。
- 到这里为止,关于DAO层的配置文件就已经配置完了,接下来是Service层的配置文件,大家现在都是用注解的方式来配置Service层,所以我们只需要在Service加上@Service(***),以及在相对应的需要调用的Mapper接口的上加上@Autowired或@Resource注解,然后再Spring配置文件中扫描Service注解就ok了。
第四步:扫描Service注解
<context:component-scan base-package="com.it.service"/>
- 但是业务层的只能不仅仅是调用DAO这么简单,事务处理是任何企业级应用开发中不能回避的一个重要问题,以往我们通过业务方法中硬编码的方式进行业务控制,这样做的弊端显而易见:事务代码分散在业务方法中难以重用,需要调整时工作量也比较大;复杂事务的编码难度较高,增加了开发难度等。Spring提供了声明式事务处理机制,它基于AOP实现,无需编写任何事务管理代码,左右的工作全在配置文件中完成,这意味着与业务代码完全分离,配置即可用,降低了开发和维护的难度。
所以第五步:使用注解的方式配置声明式事务管理器
- <!-- 事务管理器 --> <bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/> </bean>
<tx:annotation-driven transaction-manager="txManager"/>
-
配置完成以后再业务层通过@Transactional注解即可为该类所有业务方法统一添加事务处理,如果某一业务方法需要采用不同的事务规则,可以在该业务方法上添加@Transactional注解进行单独设置。
@Transactional(propagation = Propagation.REQUIRED)
public int insertBill(Bill bill) {
try {
return billMapper.insertBill(bill);
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
}
- 至此,Spring配置文件已经完成,那么MyBatis配置文件中需要什么呢? 使用的时候只需要设置一下实体类别名就好了
<configuration>
<typeAliases>
<!-- 设置别名 -->
<!-- <typeAlias alias="user" type="cn.smbms.pojo.User"/> -->
<package name="com.it.pojo"/>
</typeAliases>
</configuration>
SSM框架
最新推荐文章于 2023-03-14 11:39:52 发布