spring开启注解的三种方式

本文介绍了Spring框架中的事务管理实现方式,包括编程式事务管理和声明式事务管理两种方式,并重点讲解了如何通过注解的方式简化事务的开启过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章使用c3p0做演示

方法一,编辑试事务

开启事务核心类 DataSourceTransactionManager,不管是哪一种方式都需要创建该对象,该方式需要记住的类 TransactionTemplate,

其实很好记,使用spring操作数据库创建jdbcTemplate ,使用spring开启事务创建TransactionTemplate

public class Transaction_01  {

    public void Test_demo() throws PropertyVetoException {

        //创建Spring提供的事务模板
        TransactionTemplate template = new TransactionTemplate();

        //创建c3p0连接池
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //设置数据库账号
        dataSource.setUser("root");
        //设置密码
        dataSource.setPassword("1039191520");
        //设置驱动
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        //设置url
        dataSource.setJdbcUrl("jdbc:mysql:///springTransaction");

        //创建数据库管理员
        DataSourceTransactionManager manager = new DataSourceTransactionManager();

        //封装参数
        manager.setDataSource(dataSource);

        //设置管理员
        template.setTransactionManager(manager);

//        开启事务
        template.execute(new TransactionCallback<Object>() {

            @Override
            public Object doInTransaction(TransactionStatus transactionStatus) {
                try {
                    //创建jdbcTemplate来操作数据库
                    JdbcTemplate jdbcTemplate = new JdbcTemplate();
                    jdbcTemplate.setDataSource(dataSource);

                    //编写sql
                    String sql = "insert into dNmae values('zs')";

//                执行sql
                    jdbcTemplate.update(sql);
                } catch (DataAccessException e) {
                    e.printStackTrace();
                    //回滚事务
                    transactionStatus.setRollbackOnly();
                }

                return null;            //doInTransaction : 表示这个方法是在事务内容执行

            }
        });
    }
}

注解式事务(AOP方式)

创建一个需要开启事务的演示类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class demo {

    @Autowired
    private JdbcTemplate jdbc;

    @Test
    public void save(){

        //编写sql
        String sql = "insert into table_name values('ws')";
        jdbc.update(sql);
    }
}

配置xml

 <!--创建数据库实例-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="jdbc:mysql:///spring_day04"/>
        <property name="username" value="root"/>
        <property name="password" value="1039191520"/>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    </bean>

    <!--创建jdbc模板-->
    <bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--必须创建数据库管理者-->
    <bean id="manager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <!--设置数据库属性-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:advice id="advice" transaction-manager="manager">

        <!-- 这段代码的意思就是: 到底前面的表达式找到的方法,哪些才能用事务?
     save 表示,前面的表达式找到的所有方法都用事务管理
     如果只写了一个save , 表示前面的表达式如果找到1万个方法,但是也只能有save方法用事务管理起来。
  -->

        <tx:attributes>
            <tx:method name="save" />
        </tx:attributes>
    </tx:advice>


    <!--使用aop-->
    <aop:config >
        <!--创建切入点-->
        <aop:pointcut id="transaction" expression="execution(* cn.itcast.demo.demo.*(..))"/>

        <aop:advisor advice-ref="advice" pointcut-ref="transaction"/>
    </aop:config>

以上俩种方法都是很麻烦的,spring怕没有人使用,就创建了一种很简单的用法,

开发中常用的开启事务方式

<!--创建数据库实例-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="jdbc:mysql:///spring_day04"/>
        <property name="username" value="root"/>
        <property name="password" value="1039191520"/>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    </bean>

    <!--创建jdbc模板-->
    <bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--必须创建数据库管理者-->
    <bean id="manager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <!--设置数据库属性-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:annotation-driven transaction-manager="manager"/>

编写测试类 (只需要在测试类上加上注解(@Transactional)即可)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@Transactional
public class demo {

    @Autowired
    private JdbcTemplate jdbc;

    @Test
    public void save(){

        String sql = "insert into table_name values('ws')";
        jdbc.update(sql);
    }
}

以上就是spring提供的注解方式,第一种第二种都是纯了解的,,,开发不会有人用的,所以只需要记第三种就行

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值