【Java】MyBatis与Spring框架整合(二)

本文讲解 Spring 注入映射器及事务功能的实现。

注入映射器实现

MyBatis 可以使用 SqlSession 的 getMapper ( Class<T> type ) 方法,根据指定的映射器和映射文件直接生成实现类。这样不必自行编写映射器的实现类,就可以调用映射器的方法进行功能实现。

SqlSessionTemplate 也有对应的 getMapper()方法,利用 MyBatis-Spring 提供的组件,可以不必每次调用 getMapper()方法,而是通过配置的方式直接为业务对象注入映射器实现。对于不包含其他非 MyBatis 的工作的数据访问操作,这是首选的做法。

使用 MapperScannerConfigurer 注入映射器

SQL 映射文件中须遵循以下命名原则:

1)映射的命名空间和映射器接口的名称相同。

2)映射元素的 id 和映射器接口的方法相同。

首先,有关 DAO 接口的实现类可以删除了。

配置注入映射器的代码如下:

    <!-- 配置 DAO -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="cn.xxxx.mapper" />
    </bean>

basePackage 属性指定了扫描的基准包,MapperScannerConfigurer 将递归扫描基准包下所有接口。如果它们在 SQL 映射文件中定义过,则将它们动态注册为 MapperFactoryBean 。

注意:

1)basePackage 属性中可以包含多个包名。多个包名之间使用逗号或分号隔开。

2)MapperScannerConfigurer 创建的所有映射器实现都会被自动注入 SqlSessionFactory 实例。

3)若环境中配置了多个 SqlSessionFactory 实例,自动装载将无法进行。此时应显式指定所依赖的 SqlSessionFactory 实例。下面是示例

   <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />        <property name="basePackage" value="cn.bdqn.mapper" />
    </bean>

映射器被注册到 Spring 的容器时,Spring 会根据其接口名称为其命名,默认规则是首字母小写的非完全限定类名。如 UserMapper 类型组件会被默认命名为 userMapper。

在业务逻辑实现类中使用 @Resource 或 @AutoWried 注解实现对业务组件的依赖注入。

Spring 配置文件中需要引入 context 命名空间,并添加一行配置代码

    <!-- 配置扫描注解定义的业务 Bean -->
    <context:component-scan base-package="cn.xxxx.service" />

声明式事务

首先了解一下事务相关的理论知识

原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。

一致性(Consistency):事务在完成时,必须是所有的数据都保持一致状态。

隔离性(Isolation):并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性。

持久性(Durability):一旦事务完成,数据库的改变必须是持久化的。

事务并发所可能存在的问题:

脏读:一个事务读到另一个事务未提交的更新数据。
不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样。
幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。
丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。

JDBC定制了五种事务隔离级别处理事务并发:

TRANSACTION_NONE JDBC :驱动不支持事务

TRANSACTION_READ_UNCOMMITTED: 允许脏读、不可重复读和幻读。


TRANSACTION_READ_COMMITTED: 禁止脏读,但允许不可重复读和幻读。


TRANSACTION_REPEATABLE_READ: 禁止脏读和不可重复读,单运行幻读。


TRANSACTION_SERIALIZABLE: 禁止脏读、不可重复读和幻读。

隔离级别越高,意味着数据库事务并发执行性能越差,能处理的操作就越少。

JDBC规范虽然定义了事务的以上支持行为,但是各个JDBC驱动,数据库厂商对事务的支持程度可能各不相同。

出于性能的考虑我们一般设置 TRANSACTION_READ_COMMITTED

通过Spring,我们无需处理获得连接、关闭连接、事务提交和回滚等这些操作,使得我们把更多的精力放在处理业务上。

事实上Spring并不直接管理事务,而是提供了多种事务管理器。它们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。

本文主要讲解 Spring 提供的声明式事务处理机制,它基于 AOP 实现,无须编写任何事务管理代码,所有的工作全在配置文件中完成。

配置

需要用到 tx 和 aop 两个命名空间,所以首先要导入这两个命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/tx
     http://www.springframework.org/schema/tx/spring-tx.xsd
     http://www.springframework.org/schema/aop
     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<beans/>

配置一个事务管理器组件,这里使用 Spring 提供的事务管理器类 DataSourceTransactionManager

    <!-- 定义事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

这里的 dataSource 是上文中配置的数据源组件。

可以通过 <tx :advice> 标签配置事务增强,设定事务的属性,为不同的业务方法指定具体的事务规则。

    <!-- 为指定事务管理器设置事务属性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 定义属性,声明事务规则 -->
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" isolation="DEFAULT"
                read-only="false"  />
            <tx:method name="del*" propagation="REQUIRED" isolation="DEFAULT"
                read-only="false" />
            <tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT"
                read-only="false" />
            <tx:method name="query*" propagation="NEVER" read-only="true" />
            <tx:method name="get*" propagation="NEVER" read-only="true" />
        </tx:attributes>
    </tx:advice>

transaction-manager 属性引用一个事务管理器 Bean

<tx:attributes> 子标签用来定制事务属性。事务属性通过 <tx:method> 标签进行设置。

<tx:method> 标签中 name 属性是必须的,用于指定匹配的方法,可以使用通配符( * )。其他属性均为可选,用于指定具体的事务规则。

Spring 事务的传播属性

名称 解释
 PROPAGATION_REQUIRED  0   支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是Spring默认的事务的传播。
 PROPAGATION_SUPPORTS  1   支持当前事务,如果当前没有事务,就以非事务方式执行。
 PROPAGATION_MANDATORY  2   支持当前事务,如果当前没有事务,就抛出异常。
 PROPAGATION_REQUIRES_NEW  3   新建事务,如果当前存在事务,把当前事务挂起。
 PROPAGATION_NOT_SUPPORTED  4   以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
 PROPAGATION_NEVER  5   以非事务方式执行,如果当前存在事务,则抛出异常。
 PROPAGATION_NESTED  6   如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

Spring 事务的隔离级别

名称 解释
 ISOLATION_DEFAULT -1   这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应
 ISOLATION_READ_UNCOMMITTED  1   这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。
 ISOLATION_READ_COMMITTED  2   保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
 ISOLATION_REPEATABLE_READ  4   这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。
 ISOLATION_SERIALIZABLE  8   这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。

最后是定义切面

    <!-- 定义切面 -->
    <aop:config>
        <!-- 定义切入点 -->
        <aop:pointcut expression="execution(* cn.xxxx.service..*.*(..))" id="pointcutTransaction" />
        <!-- 将事务增强与切入点组合 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutTransaction"/>
    </aop:config>

使用注解实现声明式事务处理

Spring 支持使用注解配置声明式事务,所使用的注解是 @Transactional

首先需要在 Spring 配置文件中添加对注解配置的事务的支持

    <tx:annotation-driven transaction-manager="transactionManager"/>

在 Service 业务逻辑实现类中添加注解

@Transactional
@Service("userSerivce")
public class UserService implements IUserService{

    @Autowired
    @Qualifier("userMapper")
    private UserMapper userMapper;

    @Override
    @Transactional(propagation=Propagation.SUPPORTS)
    public List<USER> queryUsers() {
        return userMapper.queryUsers();
    }
}

注意:

1)在类上添加 @Transactional 注解可为该类的所有业务方法统一添加事务处理。如果某一业务方法需要采用不同的事务规则,可以在该业务方法上添加 @Transactional 注解单独进行设置。

2)不建议在查询方法上使用事务,会影响查询的性能。

使用注解配置事务时,所使用的属性与在 Spring 配置文件中使用的属性一致。

原文地址:https://www.cnblogs.com/xiaotie666/p/LiujinSpring_MyBatis2Summary.html

时间: 2024-11-06 22:36:49

【Java】MyBatis与Spring框架整合(二)的相关文章

spring框架整合使用定时任务框架java quartz的示例代码配置

原创整理不易,转载请注明出处:spring框架整合使用定时任务框架java quartz的示例代码配置 代码下载地址:http://www.zuidaima.com/share/1775583461723136.htm 有时候我们的任务(Job)需要再某些任务完成之后才能进行:例如从旧的数据库批量导数据的时候:需要现将被其他数据依赖的数据导入新的数据库:然后再进行关系的导入..在这种情况下我们就可以使用Quartz的listener来做文章了. 首先我们写一个主任务的类,命名为MainJob:她

由“单独搭建Mybatis”到“Mybatis与Spring的整合/集成”

在J2EE领域,Hibernate与Mybatis是大家常用的持久层框架,它们各有特点,在持久层框架中处于领导地位. 本文主要介绍Mybatis(对于较小型的系统,特别是报表较多的系统,个人偏向Mybatis),对于它,个人比较喜欢的是: 使用简单.方便: 支持的XML动态SQL的编写,方便浏览.修改,同时降低SQL与应用程序之间的耦合. 不喜欢的是: 出现错误时,调试不太方便 本文主要介绍Mybatis的搭建,是学习Mybatis过程后整理的札记,其中包括“单独搭建Mybaits”和常用的“M

Spring框架整合Struts2使用Validation框架验证表单用户输入数据的详细教程

原创整理不易,转载请注明出处:Spring框架整合Struts2使用Validation框架验证表单用户输入数据的详细教程 代码下载地址:http://www.zuidaima.com/share/1778685765291008.htm 在<Struts2教程4:使用validate方法验证数据>中曾讲到使用validate方法来验证客户端提交的数据,但如果使用validate方法就会将验证代码和正常的逻辑代码混在一起,但这样做并不利于代码维护,而且也很难将过些代码用于其他程序的验证.在St

spring框架整合ibatis的项目实例代码

原创整理不易,转载请注明出处:spring框架整合ibatis的项目实例代码 代码下载地址:http://www.zuidaima.com/share/1780211932679168.htm 这两天一直在研究ibatis与spring的整合 一个小小的demo搞的我头晕目眩的,但程序一旦跑起来了,突然有一种豁然开朗,重见天日,感觉生活很美好的感觉!,也许,这就是那一行行的代码带给我们的不同享受吧.呵呵,废话就不多说了. 在此先引用几句别人的资料... Spring通过DAO模式,提供了对iBA

Java EE互联网轻量级框架整合开发— SSM框架(中文版带书签)、原书代码

Java EE互联网轻量级框架整合开发 第1部分 入门和技术基础 第1章 认识SSM框架和Redis 2 1.1 Spring框架 2 1.2 MyBatis简介 6 1.3 Spring MVC简介 11 1.4 最流行的NoSQL——Redis 12 1.5 SSM+Redis结构框图及概述 13 第2章 Java设计模式 15 2.1 Java反射技术 15 2.2 动态代理模式和责任链模式 19 2.3 观察者(Observer)模式 30 2.4 工厂模式和抽象工厂模式 35 2.5

好程序员Java干货分享Spring框架之IOC原理

好程序员Java干货分享Spring框架之IOC原理,前言:Spring框架是我们进行企业级开发的最常用框架,本章我们将了解Spring框架,并学习Spring的IOC特性以及IOC的实现原理:注解和反射. Spring框架简介 Spring是一种轻量级的控制反转(IOC)和面向切面编程(AOP)的容器框架,能够为企业级开发提供一站式服务. Spring的优点有 1.方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度

MyBatis和Spring的整合

 MyBatis和Spring整合(XML版) 所需要导入的jar文件 <!--MyBatis和Spring的整合包 由MyBatis提供--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <!

Spring+Spring MVC+MyBatis实现SSM框架整合详细教程【转】

关于Spring+SpringMVC+Mybatis 整合,见还有不少初学者一头雾水,于是写篇教程,初学者按部就班的来一次,可能就会少走不少弯路了. 一:框架介绍(啰嗦两句,可自行度娘) 1.1:Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的

spring,hibernate,spring框架整合

SSH框架作为javaEE最经典的框架, 初学者整合这几个框架可能也是一件比较头痛的事情(包括我自己), 下面来进行框架的整合!   一:   准备   SSH框架介绍 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet, 处于MVC的控制层,Struts 2是Struts的下一代产品,个人认为: struts2~~struts+xwork; Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表