Spring事务注意事项-代码案例

    xiaoxiao2022-07-12  148

    Controller控制层代码

    package springTransaction.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import springTransaction.service.UserService; @Controller @Transactional //指定这个类可以受Spring事务管理了 public class UserController { @Autowired //类型 private UserService userService; public void test() { String saveSql = "insert into user_info values(?,?,?,?,?)"; String deleteSql = "delete from user_info"; Object[] param = {"3","王五","789","m",30}; //不能加try catch,加了之后异常被try{}捕捉到,那么事务管理器就无法再捕捉异常,所以就无法做出反应,事务不回滚 //删除表中所有的数据 userService.delete(deleteSql, null); //插入两条主键重复的数据 userService.save(saveSql, param); userService.save(saveSql, param); } }

    在controller层中,添加了@Transactional //指定这个类可以受Spring事务管理了。如果违反事务的四大特性,将会发生回滚事件,保证事务的原子性。

    dao层的代码实例

    package springTransaction.dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @Repository("userDao") public class UserDao { @Autowired //默认按照类型进行自动装配 private JdbcTemplate jdbcTemplate; // @Override public int save(String sql, Object[] param) { return jdbcTemplate.update(sql, param); } // @Override public int delete(String sql, Object[] param) { return jdbcTemplate.update(sql, param); } }

    @Repository(“userDao”)此注解用在和数据库的处理上。

    service层的代码示例

    package springTransaction.service; import javax.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import springTransaction.dao.UserDao; @Service(value="userService")//受spring Ioc容器管理 public class UserService { @Resource //名称 private UserDao userDao; public int save(String sql, Object[] param) { return userDao.save(sql, param); } public int delete(String sql, Object[] param) { return userDao.delete(sql, param); } }

    最主要的是XML文件中的配置 下面的这个扫描哪个包下面的注解。<context:component-scan base-package>

    <!-- 注解支持 --> <context:component-scan base-package="springTransaction"></context:component-scan>

    为了不把Spring中的数据源不要写死。

    <!-- 引入属性文件 --> <context:property-placeholder location="springTransaction/dbInfo.properties"/> ~~~~ ~~~xml <!-- 数据源配置信息 c3p0 需要mysql-connector-java 5.1.8和c3p0 0.9.1.2这两个jar--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${driverClass}"/> <property name="jdbcUrl" value="${jdbcUrl}"/> <property name="user" value="${user}"/> <property name="password" value="${password}"/> <!-- <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/> <property name="user" value="root"/> <property name="password" value="root"/> --> </bean>

    为数据源添加事务管理

    <!-- 为数据源添加事务管理器 --> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>

    添加事务注解支持

    <!-- 加载事务注解支持 --> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
    最新回复(0)