spring第四天纯注解的声明式事务配置
1.所需jar包
业务层接口及实现类
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);
}
}
测试类