spring jdbc 事物的使用心得

15 篇文章 0 订阅

Spring的配置文件

[html]  view plain copy
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3. xmlns:context="http://www.springframework.org/schema/context"  
  4. xmlns:aop="http://www.springframework.org/schema/aop"  
  5. xmlns:tx="http://www.springframework.org/schema/tx"  
  6. xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  7. http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd  
  8. http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  9. http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  10. <context:component-scan base-package="action,biz,dao"/>  
  11. </beans>  

配置数据源

[html]  view plain copy
  1. <bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">  
  2.     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>  
  3.     <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>  
  4.     <property name="username" value="bam1"/>  
  5.     <property name="password" value="bam1"/>  
  6.      <!-- 连接池启动时的初始值 -->  
  7.      <property name="initialSize"value="1"/>  
  8.      <!-- 连接池的最大值 -->  
  9.      <property name="maxActive"value="500"/>  
  10.      <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
  11.      <property name="maxIdle"value="2"/>  
  12.      <!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请一些连接,以避免洪峰来时再申请而造成的性能开销 -->  
  13.      <property name="minIdle"value="1"/>  
  14.   </bean>  
  15. Spring容器中给我们提供了专门针对JDBC操作的辅助类,需要使用注入的方式给JDBC辅助类注入数据源对象,在XML文件中进行添加如下代码:  
  16.   <bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">  
  17.     <constructor-arg ref="dataSource"></constructor-arg>  
  18.     //注入数据源对象需要使用构造函数的方法注入,第三方类需要手动注入  
  19.   </bean>  

实体类Person

[java]  view plain copy
  1. public class Person  
  2. {  
  3.    private int personId;  
  4.    private String personName;  
  5. }  

DAO层数据操作类

[java]  view plain copy
  1. @Repository  
  2. public class PersonDaoImpl implements PersonDao  
  3. {  
  4.     @Resource(name="jdbc"//注入的第三方的bean需要指明name设置  
  5.     private JdbcTemplate jdbc;  
  6.     @Override  
  7.     public int add(Person per)  
  8.     {   //update执行数据库操作  
  9.        return jdbc.update("insert intoperson(pid,pname) values(?,?)",per.getPersonId(),per.getPersonName());  
  10.     }  
  11.     @Override  
  12.     public Person queryById(int id)  
  13.     {  //queryForObject执行数据库查询操作查询一个  
  14.        return jdbc.queryForObject("select* from person where pid=?",new Object[]{id}, new PersonRowMapper());  
  15.     }  
  16.     @Override  
  17.     public List<Person> queryAll()  
  18.     {   //query查询多个  
  19.        return jdbc.query("select* from person",new PersonRowMapper());   // PersonRowMapper为RowMapper的实现类  
  20.     }  
  21. }  

实现RowMapper接口的实现类

[java]  view plain copy
  1. public class PersonRowMapper implementsRowMapper<Person>  
  2. {  
  3.     @Override  
  4.     public Person mapRow(ResultSet set, int index) throws SQLException  
  5.     {  
  6.        return  new Person(set.getInt("pid"),set.getString("pname"));  
  7.     }  
  8. }  

Spring容器获取Bean的工具类编写

[java]  view plain copy
  1. public class BeanUtil {  
  2.     private static AbstractApplicationContext app;  
  3.     static {  
  4.        app = new ClassPathXmlApplicationContext("beans.xml");  
  5.     }  
  6.     //使用工具类getBean方法返回需要获取的bean对象,使用了泛型  
  7.     public static <T> T getBean(String name,Class<T> tClass) {  
  8.        return app.getBean(name, tClass);  
  9.     }  
  10. }  

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添加事务

[java]  view plain copy
  1. @Resource  
  2.    private PersonBiz personBiz;   //注入依赖对象person的业务操作类  
  3.    //添加事物处理  
  4.    @Transactional                  //声明事务处理  
  5.    public String addPerson()  
  6.    {  
  7.       return "ok";  
  8.    }  

//为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

[java]  view plain copy
  1. public class PersonServiceBean implements PersonService {  
  2.     @Resource   
  3. Private OtherService otherService ;  
  4. @Transactional  
  5.     public void xxx(){  
  6.     stmt.executeUpdate("update person set name='888' whereid=1");  
  7.     otherService.update();//OtherService的update方法的事务传播属性为NESTED  
  8.     stmt.executeUpdate("delete from person where id=9");  
  9.       }  
  10. }  
  11.    

NESTED是一个比较特殊的属性,可以理解为事务的嵌套,就如上面的xxx方法是使用了事务的,也就是说一整个方法体属于一个事务,但是因为otherService.update被nested属性修饰了所以当这个方法出现异常而,其他操作没有出现异常的话,整个事务也会提交,除了otherService.update的事务不被提交

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值