SpringJDBC整合及Aop事务处理
SpringJDBC整合及Aop事务处理
1、JdbcDaoSupport
可用DaoImpl的类直接继承,这样就不需要手动准备Jdbc模板,从父类方法中获得即可,它实现原理是根据DataSource来实现的。`
public class UserDaoImpl extends JdbcDaoSupport implements UserDao{
//JdbcDaoSupport 根据连接池来创建JdbcTemplate
@Override
public void save(User user) {
String sql = "insert into user values(?,?)";
super.getJdbcTemplate().update(sql,user.getUsername(),user.getPassword());
}
2、在xml中指定spring读取db.properties配置
<context:property-placeholder location=“classpath:db.properties” />
相对应的db.properties内容如下:(之所以前面加个jdbc是防止跟数据库表名一致导致冲突)
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=123456
根据依赖用spring来创建对象步骤:
3、spring中aop事务
事务特性:acid
事务并发问题:脏读 、不可重复读、幻读
注意:在spring中玩事务管理.最为核心的对象就是TransactionManager对象
事务传播行为:有七个,通常默认是PROPAGATION_REQUIRED(支持当前事务,如果不存在,就新建一个)
4、spring管理事务的方式
无论进行以下哪种配置,都需要在spring容器中配置事务核心管理器,有datasource.DataSourceTransactionManager或者HibernateTransactionManager,该对象依赖于连接池。
1、xml配置(aop)
导包:基本4+2 +aop+ aspect+ aop联盟 + weaving织入包
导约束:beans: 最基本 context:读取properties配置 aop:配置aop tx:配置事务通知
配置事务管理器:
配置通知:
配置将通知织入目标对象:
2、注解配置(aop):
1、导包、导约束
2、配置事务管理器
3、开启注解管理事务:
<tx:annotation-driven/>
4、在需要使用的事务的方法使用注解:
//如果想对类中所有方法都应用,可将注解加在类上,如果相对某个方法进行修改,在方法上重新写一个
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)
public class AccountServiceImpl implements AccountService {
private AccountDao ad;
@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
public void transfer(Integer from, Integer to, Double money) {
ad.decreaseMoney(from, money);
int i=1/0;
ad.increaseMoney(to, money);
}
public void setAd(AccountDao ad) {
this.ad = ad;
}
}
最终在demo中测试转账,成功;并在出现异常时可以保持数据的一致性。
5、总结:
通过这个转账的小例子,比较深入理解了spring的两大特性,控制反转和面向切面,即spring可以很方便的解决对象创建时的依赖问题,而且在需要创建对象的时候才创建,极大方便了开发;而aop更是对事务操作带来了很大的便利,让service层处理事务逻辑变得简单。