aop (spring 事物对于unchecked可以回滚,但是对于checked例外不回滚)

来源:互联网 发布:淘宝app图标素材 编辑:程序博客网 时间:2024/05/29 09:06

cn.itcast.bean

[java] view plaincopy
  1. package cn.itcast.bean;  
  2.   
  3. public class Person {  
  4.     private Integer id;  
  5.     private String name;  
  6.     public Integer getId() {  
  7.         return id;  
  8.     }  
  9.     public void setId(Integer id) {  
  10.         this.id = id;  
  11.     }  
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.       
  19.     public Person()  
  20.     {}  
  21.     public Person (String name)   
  22.     {  
  23.         this.name=name;  
  24.     }  
  25.       
  26. }  

cn.itcast.service
[java] view plaincopy
  1. package cn.itcast.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import cn.itcast.bean.Person;  
  6.   
  7. public interface PersonService {  
  8.     public void save(Person person);  
  9.     public void update(Person person);  
  10.     public  Person getPerson(Integer personid);  
  11.     public List<Person>getPerson();  
  12.     public void delete(Integer personid);  
  13.       
  14.   
  15. }  

cn.itcast.service.impl

[java] view plaincopy
  1. package cn.itcast.service.impl;  
  2.   
  3. import java.sql.ResultSet;  
  4. import java.sql.SQLException;  
  5.   
  6. import org.springframework.jdbc.core.RowMapper;  
  7.   
  8. import cn.itcast.bean.Person;  
  9.   
  10. public class PersonRowMapper implements RowMapper {  
  11.   
  12.     public Object mapRow(ResultSet rs, int index) throws SQLException {  
  13.           
  14.         Person person=new Person(rs.getString("name"));  
  15.         person.setId(rs.getInt("id"));  
  16.         return person;  
  17.     }  
  18.   
  19. }  
package cn.itcast.service.impl;import java.util.List;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.transaction.annotation.Transactional;import cn.itcast.bean.Person;import cn.itcast.service.PersonService;@Transactionalpublic class PersonServiceBean implements PersonService {private JdbcTemplate jdbcTemplate;public void setDataSource(DataSource dataSource) {this.jdbcTemplate = new JdbcTemplate(dataSource);}//unchecked,可以回滚//checked不会回滚(这个例子就是checked例外)public void delete(Integer personid) throws Exception{jdbcTemplate.update("delete from person  where id=?", new Object[]{personid},new int[]{java.sql.Types.INTEGER});throw new Exception("运行期例外");}public Person getPerson(Integer personid) {return (Person)jdbcTemplate.queryForObject("select * from person where id=?",new Object[]{personid} ,new int[]{java.sql.Types.INTEGER},new PersonRowMapper());}@SuppressWarnings("unchecked")public List<Person> getPerson() {return (List<Person>)jdbcTemplate.query("select * from person",new PersonRowMapper());}public void save(Person person) {//第一个参数是sql语句,第二个参数是参数(数组),第三个是参数的类型(数组)jdbcTemplate.update("insert into person(name) values(?)", new Object[]{person.getName()},new int[]{java.sql.Types.VARCHAR});}public void update(Person person) {jdbcTemplate.update("update person set name=? where id=?", new Object[]{person.getName(),person.getId()},new int[]{java.sql.Types.VARCHAR,java.sql.Types.INTEGER});}}


junit.test

package junit.test;import org.junit.BeforeClass;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.transaction.annotation.Transactional;import cn.itcast.bean.Person;import cn.itcast.service.PersonService;public class PersonServiceTest {private static PersonService personService;@BeforeClasspublic static void setUpBeforeClass() throws Exception {try {ApplicationContext cxt=new ClassPathXmlApplicationContext("beans.xml");personService=(PersonService)cxt.getBean("personService");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Testpublic void save(){personService.save(new Person("传智播客"));}@Testpublic void getPerson(){Person person=personService.getPerson(1);System.out.println(person.getName());}@Testpublic void update(){Person person=personService.getPerson(1);person.setName("sun**");personService.update(person);}@Testpublic void delete(){try {personService.delete(4);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Testpublic void getBeans(){for(Person person:personService.getPerson()){System.out.println(person.getName());}}}



beans.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:context="http://www.springframework.org/schema/context"   
  5.        xmlns:aop="http://www.springframework.org/schema/aop"  
  6.        xmlns:tx="http://www.springframework.org/schema/tx"  
  7.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
  8.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  9.            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  10.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  11.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  12.   
  13.      <context:property-placeholder location="classpath:jdbc.properties"/>  
  14.      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  15.         <property name="driverClassName" value="${driverClassName}"/>  
  16.         <property name="url" value="${url}"/>  
  17.         <property name="username" value="${username}"/>  
  18.         <property name="password" value="${password}"/>  
  19.          <!-- 连接池启动时的初始值 -->  
  20.          <property name="initialSize" value="${initialSize}"/>  
  21.          <!-- 连接池的最大值 -->  
  22.          <property name="maxActive" value="${maxActive}"/>  
  23.          <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->  
  24.          <property name="maxIdle" value="${maxIdle}"/>  
  25.          <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->  
  26.          <property name="minIdle" value="${minIdle}"/>  
  27.      </bean>  
  28.   
  29.     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  30.        <property name="dataSource" ref="dataSource"/>  
  31.     </bean>  
  32.     <tx:annotation-driven transaction-manager="txManager"/>  
  33.       
  34.     <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">  
  35.         <property name="dataSource" ref="dataSource"/>  
  36.     </bean>  
  37. </beans>