spring JDBC事务管理

原创 2013年12月04日 10:03:36

一直想学习怎么使用spring 的事务,在网上查了很多资料,还是不知道怎么写,大都是基于注解方式的,要么就是基于hibernate的事务,而且没有完整的例子,都是代码片段,这里我自己写了一个简单的demo,供给大家学习

 

1、建立一个对象(跟数据库中的表对应)

 

package hb.bean;

public class Book {
	private int id;
	private String name;
	private String author;
	private int num;

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}
}

 

 2、建立一个接口(实现对表的相关操作)

 

package hb.dao;

import hb.bean.Book;
import java.util.List;
import org.springframework.transaction.annotation.Transactional;

@Transactional
public interface BookDAO {
	
	//查看book表中的所有数据
	public List listBook();
	
	//向book表中插入一条数据
	public void insertBook(Book book);
}

 

 3、实现接口的操作

 

package hb.dao.imp;

import hb.bean.Book;
import hb.dao.BookDAO;
import hb.row.UserRowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

import sun.jdbc.odbc.ee.DataSource;

@Transactional
public class BookDAOImpl extends JdbcDaoSupport implements BookDAO {
	
	public DataSourceTransactionManager transactionManager;

	public void setTransactionManager(DataSourceTransactionManager transactionManager) {
		this.transactionManager = transactionManager;
	}

	@SuppressWarnings("unchecked")
	public List listBook() {
		String sql = "select * from book";
		//JdbcDaoSupport里面有jdbcTemplate这个对象的set方法.JdbcTemplate这个类需要配置数据源
		List list = this.getJdbcTemplate().query(sql, new UserRowMapper());
		return list;
	}

	public void insertBook(final Book book) {
		final String sql = "insert into book(id,name,author,num)values(?,?,?,?)";
		TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
		final JdbcTemplate jdbcTemplate = this.getJdbcTemplate();
		transactionTemplate.execute(new TransactionCallbackWithoutResult(){
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus arg0) {
                Object[] params = new Object[] {book.getId(), book.getName(), book.getAuthor(),book.getNum() };
                //下面的语句是用来测试事务异常的情况
//                new Integer("huangbiao");
                jdbcTemplate.update(sql, params);
			}
		});
		
	}

}

 

 4、继承RowMapper 接口接受返回过来的结果集

 

package hb.row;

import hb.bean.Book;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

public class UserRowMapper implements RowMapper {

	public Object mapRow(ResultSet rs,int index) throws SQLException {
		Book book = new Book();
		System.out.println(rs.getString("name"));
		book.setName(rs.getString("name"));
		return book;
	}
}

 

5、相关的配置信息

 

<?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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context2.5.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
        
        <!--  配置数据源   -->
		<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		  <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
		  <property name="username" value="huangbiao"/>
		  <property name="password" value="huangbiao"/>
		  
		  <!-- 连接池启动时的初始值   -->
		  <property name="initialSize" value="1" />
		  <!-- 连接池的最大值  -->
		  <property name="maxActive" value="500"/>
	      <!-- 最大空闲值,当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接释放,一直减少到msxIdle为止  -->
		  <property name="maxIdle" value="2" />
		  <!-- 最小空闲值,当空闲的连接数小于阀值时,连接池就会预申请一些连接,以免洪峰到来时来不及申请  -->
		  <property name="minIdle" value="1" />
		</bean>
  
		<!-- 配置事务管理器 -->
		<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		  <property name="dataSource" ref="dataSource"/>
		</bean>
        
		<!-- 采用@Transactional注解方式使用事务   -->
        <tx:annotation-driven transaction-manager="txManager"/>
        
        <bean id="bookDao" class="hb.dao.imp.BookDAOImpl" >
        <!-- 因为继承了JdbcDaoSupport类,该类需要注入 JdbcTemplate类对象 -->
        	<property name="jdbcTemplate" ref="jdbcTemplate"></property>
        	<property name="transactionManager" ref="transactionManager"></property>
        </bean>
        
        
        <!-- jdbcTemplate需要配置dataSource,因为里面有一个set方法,所以注入给它 -->
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        	<property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <!-- 事务处理类,该类用于管理事务,里面有set方法注入数据源 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   			<property name="dataSource" ref="dataSource" />
   		</bean>
        
</beans> 

 

6、写一个测试类(使用JUnint)

 

package hb.test;

import hb.bean.Book;
import hb.dao.BookDAO;

import java.util.Iterator;
import java.util.List;


import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

public class SpringTest {

	private BookDAO bookDao;
	
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		
	}
	
	@SuppressWarnings("unchecked")
	@Test
	//执行查询的方式
	public void doQueryTest(){
		try{
			ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
			bookDao = (BookDAO) ctx.getBean("bookDao");
			List list = bookDao.listBook();
			Iterator iter = list.iterator();
			while(iter.hasNext()){
				Book book = (Book)iter.next();
				System.out.println(book.getName());
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}	
	
	@Test
	public void doInsertTest(){
		Book book = new Book();
		book.setAuthor("huangbiao");
		book.setId(90);
		book.setName("hb");
		book.setNum(44);
		try{
			ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
			bookDao = (BookDAO) ctx.getBean("bookDao");
			bookDao.insertBook(book);
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

 

 

Spring学习5-Spring整合JDBC及其事务处理(注解方式)

一、整合的步骤   1、步骤一:首先要获得DataSource连接池(推荐使用B方式): 要对数据库执行任何的JDBC操作,需要有一个Connection.在Spring中,Connectio...
  • salonzhou
  • salonzhou
  • 2014年12月25日 18:29
  • 1965

Spring事务管理;hibernate事务管理;jdbc事务管理

Spring事务处理你未关注过的原理 本文对Spring实现事务处理的真正原理进行追究,从而从中提炼出一些见解。其中讲解内容可能会存在一定的误导,还希望指出,内容仅供参考!(经过本人后期继续研读Spr...
  • zhangyayun0991
  • zhangyayun0991
  • 2017年03月15日 23:34
  • 192

Spring学习(四)Jdbc连接池交个spring管理和事务操作

一、连接池的配置交给Spring管理1,添加jar包2,spring的jdbc连接池配置 ...
  • tianyejun6
  • tianyejun6
  • 2017年03月28日 00:10
  • 991

使用自己的jdbc类,使用spring的事务管理.自己的类里面不依赖spring框架.

把自己的Dao改造成线程安全的类了,也就是每个方法都是互不关联了 通过试验,成功通过测试 使用自己的jdbc类,使用spring的事务管理.自己的类里面不依赖spring框架. 部...
  • tigeryu
  • tigeryu
  • 2014年05月19日 23:07
  • 517

JDBC应用中的事务管理

在开发中,对数据库的多个表或者对一个表中的多条数据执行更新操作时要保证对多个更新操作要么同时成功,要么都不成功,这就涉及到对多个更新操作的事务管理问题了。比如银行业务中的转账问题,A用户向B用户转账1...
  • yerenyuan_pku
  • yerenyuan_pku
  • 2016年08月31日 18:29
  • 3140

Spring的事务管理实现原理初探

这里主要是通过分析部分源码进行剖析Spring事务管理的实现原理。 再分析源码前,现从理论上大概分析哈: 纯JDBC操作数据库的基本步骤: 1. 获取连接 Connection conn = Driv...
  • u012358984
  • u012358984
  • 2014年01月19日 00:53
  • 6730

spring声明式事务处理(使用jdbc操作数据库)

声明式:针对编程人员,声明spring容器遇到哪些目标方法时需要开启事务,哪些不用开启事务。 事务处理:把事务处理交给spring容器来完成。 spring声明式事务处理的目标: 让程序...
  • andy_px
  • andy_px
  • 2015年09月23日 17:10
  • 476

spring学习笔记10--Spring+jdbc组合开发(注解方式配置事务)

Spring+jdbc组合开发 步骤: 一、配置数据源 主流数据库连接池之一(DBCP、c3p0、proxool),单独使用DBCP需要使用commons-dbpc.jar、commons-co...
  • Hollboy
  • Hollboy
  • 2013年05月05日 13:42
  • 1930

Spring事务管理(详解+实例)

写这篇博客之前我首先读了《Spring in action》,之后在网上看了很多关于Spring事务管理的文章,具体参考文章如下: 1、将相应的接口依赖图理清出 2、将每个类的具体配置弄明白 3...
  • Trigl
  • Trigl
  • 2016年03月25日 23:20
  • 26366

Spring事务管理及几种简单的实现

事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败,最为典型的就是银行转账的案例:A要向B转账,现在A,B各自账户中有1000元,A要给B转200元,那么这个转账就必须保证是一个事务,防止中途...
  • zhuxinquan61
  • zhuxinquan61
  • 2017年05月01日 22:30
  • 2625
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring JDBC事务管理
举报原因:
原因补充:

(最多只允许输入30个字)