spring声明式事务管理

1注解方式

模拟lucy向marry转钱的过程

1在配置文件中创建事务管理器

<!--先引入名称变量context再写下面的代码-->
<!--组件扫描进行对象创建和属性注入-->
<context:component-scan base-package="com.spring"></context:component-scan>
<--数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destory-method="close">
<property name="url" value="jdbc:mysql:///user_db"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
</bean>
<!--正常连接数据库的代码是
        Class.forName("com.mysql.jdbc.Driver");
		String url="jdbc:mysql://localhost:3306/scdb?characterEncoding=utf8";
		String name="root";
		String pwd="123456";
		Connection con=DriverManager.getConnection(url,name,pwd);
		String sql="delete from stin where sno="+sno;
		PreparedStatement ps=(PreparedStatement) con.prepareStatement(sql);
		ps.executeUpdate();
        con.close();
JdbcTemplate是spring对JDBC的封装,目的是使JDBC更加易于使用。它帮助我们避免一些常见的错误,比如忘了关闭连接。使用JdbcTemplate需要DruidDataSource连接池,还需要导入一些jar包
-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--创建事务管理器-->
<bean id="transaction" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--先引入名称空间tx再写下面的代码-->
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"><tx:annotation-driven>

2在service类上面或者方法上面添加事务注解

@Component//创建该类的对象
public class UserService{
    @AutoWired//根据属性类型进行注入
    private UserDao userDao;
    @Transactional//可以添加到方法上也可以添加到类上
//如果添加到类上,该类的所有方法都加上了事务
    public void accountMoney(){
        userDao.reduceMoney();
        userDao.addMoney();
}
}
@Component
public class UserDao{
    @AutoWired
    private JdbcTemplate jdbcTemplate;
    public void addMoney(){
        String sql="update account set money=money+? where username=?";
        jdbcTemplate.update(sql,100,"marry");
}
    public void reduceMoney(){
        String sql="update account set money=money-? where username=?";
        jdbcTemplate.update(sql,100,"lucy");
}
}

2xml方式

<!--组件扫描-->
<context:component-scan base-package="com.spring"></context:component-scan>
<--数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destory-method="close">
<property name="url" value="jdbc:mysql:///user_db"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--创建事务管理器-->
<bean id="transaction" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置通知(加强)-->
<tx:advice id="txadvice"><!--事务通知-->
<tx:attributes><!--事务属性-->
<!--在符合name规则的方法上面配置事务通知.propagation是事务的传播属性-->
    <tx:method name="accountMoney" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<--配置切入点和切面-->
<aop:config>
<!--配置切入点(要对哪些方法进性加强)-->
<aop:pointcut id="pt" expression="execution(* com.spring.UserService.*(..))"/>
<!--配置切面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>

3完全注解方式

配置类

@Configuration//代表该类是一个配置类
@ComponentScan(basePackages="com.spring")//开启组件扫描,将符合条件的组件加入到IOC容器中
@EnableTransactionManagement//开启事务
//创建一个配置类
public class Txconfig{
//创建数据库连接池
    @Bean
    public DruidDataSource getDruidDataSource(){
        DruidDataSource dataSource=new DruidDataSource();
        dataSource.setDriverClassName("");
        dataSource.setUrl("");
        dataSource.setUserame("");
        dataSource.setPassword("");
        return dataSource;
}
//
    @Bean
    public JdbcTemplate setJdbcTemplate(DataSource da){
        JdbcTemplate jd=new JdbcTemplate();
        jd.setDataSource(da);
        return jd;
}
//创建事务管理器
    @Bean
    public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
        DataSourceTransactionManager da=new DataSourceTransactionManager();
        da.setDataSource(dataSource);
        return da;
}
}

测试类

public class Test{
    @Test
    public void test(){
        ApplicationContext con=new AnnotationConfigApplicationContext(Txconfig.class);
        UserService user=con.getBean("userService",UserService.class);
        user.accountMoney();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值