Spring与JDBC整合、事务处理
2012-11-01 21:41
344 查看
Spring的配置文件
配置数据源
实体类Person
DAO层数据操作类
实现RowMapper接口的实现类
Spring容器获取Bean的工具类编写
Spring采用注解方式配置事务
Spring配置文件
<bean
id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property
name="dataSource"ref="dataSource"/>
</bean>
<!– 采用@Transactional注解方式使用事务 -->
<tx:annotation-driven
transaction-manager="txManager"/>
一般的话事务都是在action中添加,因为在action中更会涉及到多个事务的操作,操作不同表,我们可以对整个action添加事务,也可以对具体方法添加事务,在为方法添加了事务后,对业务操作类就不需要再添加事务了
比如在PersonAction中为addPerson添加事务
//为addPerson声明事务处理后,在方法体中如果有涉及到多个操作,在操作中发生异常操作失败的时候,就会进行事务的回滚,回到事务处理的起始
@Transactional(类型=值)
事物传播行为介绍:
@Transactional(propagation=Propagation.REQUIRED)
如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED)
容器不为这个方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY)
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS)
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
事务传播属性NESTED
NESTED是一个比较特殊的属性,可以理解为事务的嵌套,就如上面的xxx方法是使用了事务的,也就是说一整个方法体属于一个事务,但是因为otherService.update被nested属性修饰了所以当这个方法出现异常而,其他操作没有出现异常的话,整个事务也会提交,除了otherService.update的事务不被提交
<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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <context:component-scan base-package="action,biz,dao"/> </beans>
配置数据源
<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/> <property name="username" value="bam1"/> <property name="password" value="bam1"/> <!-- 连接池启动时的初始值 --> <property name="initialSize"value="1"/> <!-- 连接池的最大值 --> <property name="maxActive"value="500"/> <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 --> <property name="maxIdle"value="2"/> <!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请一些连接,以避免洪峰来时再申请而造成的性能开销 --> <property name="minIdle"value="1"/> </bean> Spring容器中给我们提供了专门针对JDBC操作的辅助类,需要使用注入的方式给JDBC辅助类注入数据源对象,在XML文件中进行添加如下代码: <bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate"> <constructor-arg ref="dataSource"></constructor-arg> //注入数据源对象需要使用构造函数的方法注入,第三方类需要手动注入 </bean>
实体类Person
public class Person { private int personId; private String personName; }
DAO层数据操作类
@Repository public class PersonDaoImpl implements PersonDao { @Resource(name="jdbc") //注入的第三方的bean需要指明name设置 private JdbcTemplate jdbc; @Override public int add(Person per) { //update执行数据库操作 return jdbc.update("insert intoperson(pid,pname) values(?,?)",per.getPersonId(),per.getPersonName()); } @Override public Person queryById(int id) { //queryForObject执行数据库查询操作查询一个 return jdbc.queryForObject("select* from person where pid=?",new Object[]{id}, new PersonRowMapper()); } @Override public List<Person> queryAll() { //query查询多个 return jdbc.query("select* from person",new PersonRowMapper()); // PersonRowMapper为RowMapper的实现类 } }
实现RowMapper接口的实现类
public class PersonRowMapper implementsRowMapper<Person> { @Override public Person mapRow(ResultSet set, int index) throws SQLException { return new Person(set.getInt("pid"),set.getString("pname")); } }
Spring容器获取Bean的工具类编写
public class BeanUtil { private static AbstractApplicationContext app; static { app = new ClassPathXmlApplicationContext("beans.xml"); } //使用工具类getBean方法返回需要获取的bean对象,使用了泛型 public static <T> T getBean(String name,Class<T> tClass) { return app.getBean(name, tClass); } }
Spring采用注解方式配置事务
Spring配置文件
<bean
id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property
name="dataSource"ref="dataSource"/>
</bean>
<!– 采用@Transactional注解方式使用事务 -->
<tx:annotation-driven
transaction-manager="txManager"/>
一般的话事务都是在action中添加,因为在action中更会涉及到多个事务的操作,操作不同表,我们可以对整个action添加事务,也可以对具体方法添加事务,在为方法添加了事务后,对业务操作类就不需要再添加事务了
比如在PersonAction中为addPerson添加事务
@Resource private PersonBiz personBiz; //注入依赖对象person的业务操作类 //添加事物处理 @Transactional //声明事务处理 public String addPerson() { return "ok"; }
//为addPerson声明事务处理后,在方法体中如果有涉及到多个操作,在操作中发生异常操作失败的时候,就会进行事务的回滚,回到事务处理的起始
@Transactional(类型=值)
事物传播行为介绍:
@Transactional(propagation=Propagation.REQUIRED)
如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED)
容器不为这个方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY)
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS)
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
事务传播属性NESTED
public class PersonServiceBean implements PersonService { @Resource Private OtherService otherService ; @Transactional public void xxx(){ stmt.executeUpdate("update person set name='888' whereid=1"); otherService.update();//OtherService的update方法的事务传播属性为NESTED stmt.executeUpdate("delete from person where id=9"); } }
NESTED是一个比较特殊的属性,可以理解为事务的嵌套,就如上面的xxx方法是使用了事务的,也就是说一整个方法体属于一个事务,但是因为otherService.update被nested属性修饰了所以当这个方法出现异常而,其他操作没有出现异常的话,整个事务也会提交,除了otherService.update的事务不被提交
相关文章推荐
- Spring学习5-Spring整合JDBC及其事务处理(注解方式)
- Spring整合JDBC及事务处理
- Spring学习5-Spring整合JDBC及其事务处理(注解方式)
- hibernate整合进spring后的事务处理
- Spring MVC +Spring +mybatis 整合事务处理
- MyBatis3整合Spring3的Transaction事务处理
- spring04 数据库操作 spring+jdbc/hibernate 及其声明式事务处理
- hibernate整合进spring后的事务处理
- Spring学习心得(22)-- spring声明式事务处理(使用jdbc操作数据库)
- Spring的事务处理机制 ---以及spring整合hibernate事务管理配置
- Spring(十三)JDBC相关概念、事务隔离级别、事务传播属性、事务管理及Spring整合JDBC
- Hibernate整合进spring---使用自己的事务处理
- JAVAEE——spring03:spring整合JDBC和aop事务
- Spring-jdbc-事务处理详解及案例<五>
- 关于Spring4+Hibernate4架构升级-整合的细节处理-由nested transactions not supported错误解决引申到事务嵌套问题处理
- 18.01.24,web学习第四十五天,还有半年,努力吧青年 Spring第三天 aop事务配置+Spring整合jdbc操作
- 【Spring七】JDBC编程之声明式事务处理
- Spring整合Hibernate时,配置事务处理
- Spring和Hibernate4.1.4整合(事务处理)
- ASP.NET MVC3 中整合 NHibernate3.3、Spring.NET2.0 使用AOP执行事务处理