使用注解配置声明式事务

       spring中为事务操作提供了支持,我们不必每次自己打开事务,提交事务,回滚事务。spring利用aop,能够实现往我们的代码中插入事务代码,从而简化我们的编程。

    使用声明式事务时,配置文件中必须导入一些命名空间,才能支持aop和事务。

 

    修改beans 标签 如下:

    


 

    为了支持注解,需要添加:

   


    配置事务:

 

	
  	   
    


      使用的时候:如果我们想为某个类添加事务支持,可以在类上添加
@Transactional注解。

      先看看注解的一些基本使用:

   

package cn.itcast.service.impl;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.itcast.bean.Person;
import cn.itcast.service.PersonService;

@Transactional
public class PersonServiceBean implements PersonService {
	private JdbcTemplate jdbcTemplate;
	
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	// unchecked ,
	// checked
	@Transactional(noRollbackFor=RuntimeException.class)
	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 RuntimeException("运行期例外");
	}
	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	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());
	}

	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	@SuppressWarnings("unchecked")
	public List getPersons() {
		return (List)jdbcTemplate.query("select * from person", new PersonRowMapper());
	}

	public void save(Person person) {
		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});
	}
}


 

     @Transactional(noRollbackFor=RuntimeException.class)

     表示对运行期异常不进行回滚,spring提供的事务支持默认对运行期异常是进行回滚的。

    @Transactional(propagation=Propagation.NOT_SUPPORTED)

    设置事务的传播行为 为不支持事务,也就是不需要事务支持了。

   

 

    完整代码:

   

package cn.itcast.bean;

public class Person {
	private Integer id;
	private String name;
	
	public Person(){}
	
	public Person(String name) {
		this.name = name;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}


 

  

package cn.itcast.service;

import java.util.List;

import cn.itcast.bean.Person;

public interface PersonService {
	/**
	 * 保存person
	 * @param person
	 */
	public void save(Person person);
	/**
	 * 更新person
	 * @param person
	 */
	public void update(Person person);
	/**
	 * 获取person
	 * @param personid
	 * @return
	 */
	public Person getPerson(Integer personid);
	/**
	 * 获取所有person
	 * @return
	 */
	public List getPersons();
	/**
	 * 删除指定id的person
	 * @param personid
	 */
	public void delete(Integer personid) throws Exception;
}


  

package cn.itcast.service.impl;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.itcast.bean.Person;
import cn.itcast.service.PersonService;

@Transactional
public class PersonServiceBean implements PersonService {
	private JdbcTemplate jdbcTemplate;
	
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	// unchecked ,
	// checked
	@Transactional(noRollbackFor=RuntimeException.class)
	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 RuntimeException("运行期例外");
	}
	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	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());
	}

	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	@SuppressWarnings("unchecked")
	public List getPersons() {
		return (List)jdbcTemplate.query("select * from person", new PersonRowMapper());
	}

	public void save(Person person) {
		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});
	}
}


 

   

package cn.itcast.service.impl;

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

import org.springframework.jdbc.core.RowMapper;

import cn.itcast.bean.Person;

public class PersonRowMapper implements RowMapper {

	public Object mapRow(ResultSet rs, int index) throws SQLException {
		Person person = new Person(rs.getString("name"));
		person.setId(rs.getInt("id"));
		return person;
	}
}


 

  配置文件:




	 
	 
	    
	    
	    
	    
	     
		 
		 
		 
		 
		 
		 
		 
	 

	
  	   
    
	
	
	
		
	


 

 属性文件:

driverClassName=org.gjt.mm.mysql.Driver
url=jdbc\:mysql\://localhost\:3306/itcast?useUnicode\=true&characterEncoding\=UTF-8
username=root
password=123456
initialSize=1
maxActive=500
maxIdle=2
minIdle=1


 

     

你可能感兴趣的:(spring)