Spring : 征服数据库 (四)

本文主要介绍Spring 和 MyBatis整合的事务处理。

值得一提的是,你不需要为MyBaits单独创造一个事务管理器,MyBatis-Spring可以使用针对JDBC的DataSourceTransactionManager来管理事务,不像Hibernate,有其自己的事务管理器。

首先,你去定义一个事务管理器,

<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

这里的dataSource和你在定义SqlSessionFactoryBean时所引用的dataSource必须是一样的,否则事务管理不起作用。

一旦配置好事务管理器,就可以在Spring里按Spring的方式去配置,不论你喜欢声明式的配置或AOP的方式。

在早期的Spring版本,定义事务是很麻烦的,因为使用快废弃的TransactionProxyFactoryBean会使配置文件特别臃肿。现在,Spring提供了一个tx的命名空间,简化了配置。(同时也得引入aop命名空间,因为在有一些事务会依赖它)

	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx= "http://www.springframework.org/schema/tx"

我们知道,描述一个事务需要五个维度:(来自Spring实战第三版)

传播行为(propagation): 定义客户端和被调用方法的事务边界。也就是方法是否该在一个事务环境里运行。Spring定义了7个:

第二个是隔离等级,第三个只读(是否为只读事务),第四个是事务超时,最后一个是回滚规则。

这些都是事务本身的知识点,这里不展开讨论。

Spring使用<tx-advice>来定义事务策略。如下:

<tx:advice id="txadvice"
           transaction-manager="txManager">
<tx:attributes>
   <tx:method name="save*" propagation="SUPPORTS"
       read-only="true" />
</tx:attributes>

</tx:advice>

在定义的attributes下面可以定义若干method,method可以指定上面提到的事务的五个维度。

另外,<tx-advice>的transaction-manager是事务管理器的ID,默认是transactionManager。

但上面的描述是不完全的,因为它只是定义的AOP的通知,没有指出哪些Bean被通知;这时需要定义一个切点,并且引用txadvice。(详细的AOP编程的细节这里也不展开)。

如果你不会AOP的写法,可能会一头雾水,不要紧,Spring还支持声明的事务管理。

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

就这么一句话就够了,如果事务管理器的iD恰好是transactionManager,就可简写成:

<tx:annotation-driven />

接下来就可以在类和方法前添加@Transaction注解。

@Transactional
	public void getSpitterByEmail(String email){

你可以在Transactional里面指定readOnly等属性.

文章的最后我们给出其默认属性:

Propagation.REQUIRED

Isolation.DEFAULT

false
(readOnly)

-1
(超时)

时间: 2024-10-10 22:23:34

Spring : 征服数据库 (四)的相关文章

Spring : 征服数据库(一)

严格的说.这里征服的是关系型数据库.之后笔者会以MongoDB为例,给出非关系型数据库的解决方式,敬请期待. 获取连接,操作,关闭,不知所云的异常...是的,你受够了.在使用纯JDBC时你訪问数据库时写的80%的代码是反复的,对此,Spring给的方案是 模板 + 回调.模板就是訪问数据库时的固定操作.回调是变化的部分. 针对不同的持久化平台.你可选的模板是不同的:假设使用的是JDBC,能够选择JdbcTemplate,假设使用特定的ORM框架,能够选择HibernateTemplate或Sql

Spring征服数据库

DAO:数据访问对象(data access object)的缩写. 如何你曾经编写过JDBC代码,你肯定会意识到如果不强制捕获SQLException,你几乎不能使用JDBC做任何事情.SQLException表示在尝试访问数据库时出现了问题,但是这个异常却没有告诉你哪里出错了以及如何进行处理. 可能导致抛出SQLException的常见问题包括: 1.应用程序无法连接数据库. 2.要执行的查询有语法错误. 3.查询中所使用的表和(或)列不存在. 4.试图插入或更新的数据违反了数据库的完整性约

Spring : 征服数据库 (二)

这部分介绍Spring和ORM框架的整合.虽然Hibernate在开源ORM 社区很流行,但本文会以MyBatis为例讲解.另外关于MyBatis和Hibernate的优劣之分是没有意义的,主要是看实际需求,有兴趣可以百度.谷歌查看. 首先配置环境,你得有mybatis和mybatis-spring在Spring工程的build path里,如果你使用的是Maven,只需添加下面的依赖:(都是目前最新版本) <dependency> <groupId>org.mybatis<

Spring : 征服数据库 (三)

上一篇我们简单的讲解了Spring和MyBatis的整合,但你不难发现,其配置起来还是够麻烦的.最明显的一点是,我们需要在自定义的Mapper接口写个很长的SQL注解,并且还要手动注册到Spring容器.本文主要讲解简化的方法. 首先,还是定义接口,但你已看不到任何框架的痕迹, package org.chen.mybatis.mapper; import org.chen.domain.Spitter; public interface SpitterMapper { Spitter getS

第五章 征服数据库(Spring对DB的使用)——开发持久层

本章内容: 定义Spring对数据库访问的支持 配置数据库资源 使用Spring的JDBC模板 在几乎所有的企业级应用中,都需要构建数据持久层.现在意义上的数据持久层是指把对象或者数据保存到数据库中,以及从数据库中取出数据. Spring提供了一组数据访问框架,它集成了多种数据访问技术.不管是JDBC.iBATIS还是Hibernate. ? 一.Spring的数据访问哲学 Spring开发者一直坚持的一个目标之一就是:允许开发人员在开发应用软件时能够遵循面向对象原则的"针对接口编程"

Spring(四)Spring与数据库编程

Spring最重要的功能毫无疑问就是操作数据.数据库的百年城是互联网编程的基础,Spring为开发者提供了JDBC模板模式,那就是它自身的JdbcTemplate.Spring还提供了TransactionTemplate支持事务的模板.Spring并没有支持MyBatis,好在MyBatis社区开发了接入Spring的开发包,该包也提供了SqlSessionTemplate给开发者使用,该包还可以屏蔽SqlSessionTemplate这样的功能性代码,可以在编程中擦除SqlSessionTe

Spring Security3的四种方法概述

使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过,并经过验证: 二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置,目前这种方式已经实现,并经过验证. 三种是细分角色和权限,并将用户.角色.权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器,     并分别实现Ac

使用Spring Security3的四种方法概述

使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过,并经过验证: 二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置,目前这种方式已经实现,并经过验证. 三种是细分角色和权限,并将用户.角色.权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器,     并分别实现Ac

实现spring事务的四种方式

用一个银行账号转钱的案例来说明spring事务的实现.在转钱过程中,一个账号钱增加,另一个减少,那么当有异常产生时,就会出现钱转丢了的现象一个减少了,而另一个没有增加,这个时候就需要把这两个行为绑定到一起,要么同时发生,要么都不发生这就用到了事务,事务就是指在逻辑上的一组操作,这组操作要么全部成功,要么全部失败 实现spring事务的四种方式分别为:(1)编程式事务管理:需要手动编写代码,在实际开发中很少使用(2)声明式事务管理:(2.1)基于TransactionProxyFactoryBea