spring第四天纯注解的声明式事务配置

 

1.所需jar包

spring第四天纯注解的声明式事务配置

 业务层接口及实现类

com.pro.service.IAcountService

package com.pro.service;

import com.pro.domain.Acount;



//账户的业务实现层
public interface IAcountService {
	
	//根据地查询账户 信息
	Acount findByAcount(Integer id);
	
	
	//转账业务 
	/*
	sourcename 转出账号  
	targetname 转入账号
	money  转账金额*/
	void transfer(String sourcename,String targetname,double money);
		
}

com.pro.service.impl.IAcountServiceImpl

package com.pro.service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.pro.dao.IAcountDao;
import com.pro.domain.Acount;
import com.pro.service.IAcountService;


@Service("iacountservice")
//@Transactional
//@Transactional  含有多个属性 
@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
public class IAcountServiceImpl implements IAcountService{
	@Resource(name="acountdao")
	private IAcountDao acountdao;
	@Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
	public Acount findByAcount(Integer id) {
		// TODO Auto-generated method stub
		return acountdao.findByAcount(id);
	}

	public void transfer(String sourcename, String targetname, double money) {
		//1根据账户查询账户信息 
		Acount source = acountdao.findByName(sourcename);
		Acount target = acountdao.findByName(targetname);
		
		//2转账
		source.setMoney(source.getMoney()-money);
		target.setMoney(target.getMoney()+money);
		
		//更新账户信息
		
		acountdao.updateAcount(source);
		//int i=1/0;
		acountdao.updateAcount(target);
		
		
	}

}

持久层接口和实现类

com.pro.dao.IAcountDao

package com.pro.dao;

import com.pro.domain.Acount;

public interface IAcountDao {

	Acount findByAcount(Integer id);

	Acount findByName(String sourcename);

	void updateAcount(Acount source);

}

com.pro.dao.IAcountDaoImpl

package com.pro.dao;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pro.domain.Acount;
@Repository("acountdao")
public class IAcountDaoImpl implements IAcountDao {
	
	@Resource(name="jdbcTemplete")
	private JdbcTemplate jdbctemplete;

	@Override
	public Acount findByAcount(Integer id) {
		// TODO Auto-generated method stub
		List<Acount> list = jdbctemplete.query(
				"select * from acount where id=?",
				new BeanPropertyRowMapper<Acount>(Acount.class), id);
		return list.isEmpty() ? null : list.get(0);
	}

	@Override
	public Acount findByName(String sourcename) {
		// TODO Auto-generated method stub
		List<Acount> list = jdbctemplete.query("select * from acount where name=?", 
				new BeanPropertyRowMapper<Acount>(Acount.class), sourcename);
		return list.isEmpty()?null:list.get(0);
	}

	@Override
	public void updateAcount(Acount source) {
		// TODO Auto-generated method stub
		jdbctemplete.update("update acount set money=? where name=?",source.getMoney(),source.getName());
	}

}

javabean

com.pro.domain.Acount

package com.pro.domain;

public class Acount {
	private int id;
	private String name;
	private double money;
	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 double getMoney() {
		return money;
	}
	public void setMoney(double money) {
		this.money = money;
	}
	@Override
	public String toString() {
		return "Acount [id=" + id + ", name=" + name + ", money=" + money + "]";
	}
	
	
}

配置类

config.SpringConfugration

package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.transaction.annotation.EnableTransactionManagement;

//springDe 配置类  相当于bean.xml

@Configuration
@ComponentScan("com.pro")
@Import(value={JdbcConfig.class,TransactionManager.class})
@EnableTransactionManagement
public class SpringConfugration {

}

config.JdbcConfig

package config;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;


//连接数据库的配置类
public class JdbcConfig {
	
	@Value("jdbc:mysql://localhost:3306/springtest")
	String url;
	@Value("root")
	String username;
	@Value("123456")
	String password;
	@Value("com.mysql.jdbc.Driver")
	String driverClassName;
	
	@Bean(name="jdbcTemplete")
	public JdbcTemplate createJdbcTenplete(DataSource datasource){ 
		return new JdbcTemplate(datasource);
		
		
	}
 	@Bean(name="datasource")
	public DataSource createDatasouce(){
		DriverManagerDataSource datasource = new DriverManagerDataSource(url, username, password);
		datasource.setDriverClassName(driverClassName);
		return datasource;
		
	}
	
	
}

config.TransactionManager

package config;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;


//事务控制的配置类 
public class TransactionManager {
	@Bean(name="transactionManager")
	public PlatformTransactionManager createTransactionManager(DataSource datasource){
		return new DataSourceTransactionManager(datasource);
	}
	
	
}

测试类

spring第四天纯注解的声明式事务配置