写点什么

【Spring 学习笔记 (十五)】Spring AOP 事务管理

作者:倔强的牛角
  • 2022 年 6 月 20 日
  • 本文字数:2579 字

    阅读完需:约 8 分钟

【Spring 学习笔记(十五)】Spring AOP 事务管理

写在前面😘

大一电子信息工程新生,请多多关照,希望能在 InfoQ 社区记录自己的学习历程!

【Spring 学习笔记】 系列教程基于 Spring 5.2.10.RELEASE讲解。

6.1.3 转账案例-环境搭建

步骤 1:准备数据库表

之前我们在整合 Mybatis 的时候已经创建了这个表,可以直接使用


create database spring_db character set utf8;use spring_db;create table tbl_account(    id int primary key auto_increment,    name varchar(35),    money double);insert into tbl_account values(1,'Tom',1000);insert into tbl_account values(2,'Jerry',1000);
复制代码
步骤 2:创建项目导入 jar 包

项目的 pom.xml 添加相关依赖


<dependencies>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-context</artifactId>      <version>5.2.10.RELEASE</version>    </dependency>    <dependency>      <groupId>com.alibaba</groupId>      <artifactId>druid</artifactId>      <version>1.1.16</version>    </dependency>
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.10.RELEASE</version> </dependency>
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.10.RELEASE</version> </dependency>
</dependencies>
复制代码
步骤 3:根据表创建模型类
public class Account implements Serializable {
private Integer id; private String name; private Double money; //setter...getter...toString...方法略 }
复制代码
步骤 4:创建 Dao 接口
public interface AccountDao {
@Update("update tbl_account set money = money + #{money} where name = #{name}") void inMoney(@Param("name") String name, @Param("money") Double money);
@Update("update tbl_account set money = money - #{money} where name = #{name}") void outMoney(@Param("name") String name, @Param("money") Double money);}
复制代码
步骤 5:创建 Service 接口和实现类
public interface AccountService {    /**     * 转账操作     * @param out 传出方     * @param in 转入方     * @param money 金额     */    public void transfer(String out,String in ,Double money) ;}
@Servicepublic class AccountServiceImpl implements AccountService {
@Autowired private AccountDao accountDao;
public void transfer(String out,String in ,Double money) { accountDao.outMoney(out,money); accountDao.inMoney(in,money); }
}
复制代码
步骤 6:添加 jdbc.properties 文件
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/spring_db?useSSL=falsejdbc.username=rootjdbc.password=root
复制代码
步骤 7:创建 JdbcConfig 配置类
public class JdbcConfig {    @Value("${jdbc.driver}")    private String driver;    @Value("${jdbc.url}")    private String url;    @Value("${jdbc.username}")    private String userName;    @Value("${jdbc.password}")    private String password;
@Bean public DataSource dataSource(){ DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(userName); ds.setPassword(password); return ds; }}
复制代码
步骤 8:创建 MybatisConfig 配置类
public class MybatisConfig {
@Bean public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){ SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); ssfb.setTypeAliasesPackage("com.itheima.domain"); ssfb.setDataSource(dataSource); return ssfb; }
@Bean public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.itheima.dao"); return msc; }}
复制代码
步骤 9:创建 SpringConfig 配置类
@Configuration@ComponentScan("com.itheima")@PropertySource("classpath:jdbc.properties")@Import({JdbcConfig.class,MybatisConfig.class})public class SpringConfig {}
复制代码
步骤 10:编写测试类
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = SpringConfig.class)public class AccountServiceTest {
@Autowired private AccountService accountService;
@Test public void testTransfer() throws IOException { accountService.transfer("Tom","Jerry",100D); }
}
复制代码

6.1.4 事务管理

上述环境,运行单元测试类,会执行转账操作,Tom的账户会减少 100,Jerry的账户会加 100。


这是正常情况下的运行结果,但是如果在转账的过程中出现了异常,如:


@Servicepublic class AccountServiceImpl implements AccountService {
@Autowired private AccountDao accountDao;
public void transfer(String out,String in ,Double money) { accountDao.outMoney(out,money); int i = 1/0; accountDao.inMoney(in,money); }
}
复制代码

写在后面🍻

感谢观看啦✨

有什么不足,欢迎指出哦💖

发布于: 刚刚阅读数: 4
用户头像

把学问造就,还期身健行优。 2022.06.02 加入

大一在读,电子信息工程专业。 希望在InfoQ写作社区记录自己的学习历程!

评论

发布
暂无评论
【Spring 学习笔记(十五)】Spring AOP 事务管理_6月月更_倔强的牛角_InfoQ写作社区