1、 在pom文件里添加相关maven文件
org.springframework.boot spring-boot-starter-parent 2.0.3.RELEASE org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java 5.1.21 org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2 org.springframework.boot spring-boot-starter-test test junit junit test org.springframework.boot spring-boot-maven-plugin
2、 在application.properties配置文件中引入数据源,创建数据库表,并插入两条原始数据:andy 余额200元,lucy 余额300元
1 spring.datasource.url=jdbc:mysql://localhost:3306/springboot_demo 2 spring.datasource.username=root 3 spring.datasource.password=root 4 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
DROP TABLE IF EXISTS tbl_account; CREATE TABLE tbl_account ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(20) NOT NULL, balance float, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; insert into tbl_account(id,name,balance) values(1, 'andy','200'); insert into tbl_account(id,name,balance) values(2, 'lucy','300');
数据库初始值如下:
3、 开发实体类,dao,service,controller,mapper等
实体类 :
public class Account { private int id; private String name; private float balance; public Account() { } // 省略setter / getter }
dao :
public interface AccountDao { public void moveIn(@Param("id") int id, @Param("money") float money); // 转入 public void moveOut(@Param("id") int id, @Param("money") float money); // 转出 }
service :
1 public interface AccountService { 2 //转账 3 public void transfer(int outter,int inner,Integer money); 4 5 }
service 实现类:
1 @Service 2 public class AccountServiceImpl implements AccountService{ 3 4 @Autowired 5 private AccountDao accountDao; 6 7 public void transfer(int outter, int inner, Integer money) { 8 9 accountDao.moveOut(outter, money); //转出 10 accountDao.moveIn(inner, money); //转入 11 12 } 13 }
controller:
1 @RestController 2 @RequestMapping(value = "/account") 3 public class AccountController { 4 5 @Autowired 6 private AccountService accountService; 7 8 9 @RequestMapping("/transfer") 10 public String test(){ 11 try { 12 // andy 给lucy转账50元 13 accountService.transfer(1, 2, 50); 14 return "转账成功"; 15 } catch (Exception e) { 16 e.printStackTrace(); 17 return "转账失败"; 18 } 19 } 20 }
mapper:
update tbl_account set balance = balance + #{money } where id= #{id,jdbcType=INTEGER} update tbl_account set balance = balance - #{money } where id= #{id,jdbcType=INTEGER}
4、 在application.properties配置文件中添加对mapper文件的扫描
1 mybatis.typeAliasesPackage: cn.yideng.*.entity 2 mybatis.mapperLocations: classpath:mapper/*.xml
5、 在启动类中添加对mapper包扫描@MapperScan
1 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 2 @EnableAutoConfiguration 3 @MapperScan("cn.yideng.*.dao") 4 public class DemoApplication { 5 6 public static void main(String[] args) { 7 SpringApplication.run(DemoApplication.class, args); 8 } 9 }
6、 浏览器测试 http://localhost:8080/account/transfer , 测试显示 转账成功,看看数据库的数据,andy余额是150, lucy余额350,都是对的,如下图所示。
7,接着我们修改service,在实现类里,转出之后抛个异常,代码如下
1 @Service 2 public class AccountServiceImpl implements AccountService{ 3 4 @Autowired 5 private AccountDao accountDao; 6 7 public void transfer(int outter, int inner, Integer money) { 8 9 accountDao.moveOut(outter, money); //转出 10 int i = 1/0; // 抛出异常 11 accountDao.moveIn(inner, money); //转入 12 13 } 14 }
8,把数据库的数据恢复成最初的 andy-200, lucy-300, 然后启动类测试,浏览器输入 http://localhost:8080/account/transfer , 测试显示 转账失败,看看数据库的数据,andy余额是150, lucy余额300,如下图所示。
相当于转出成功,转入没有成功,这是不对的,应该都成功,或者都不成功。
9, 我们接着在service实现类上添加@Transactional 注解,声明一个事务,如下
1 @Service 2 public class AccountServiceImpl implements AccountService{ 3 4 @Autowired 5 private AccountDao accountDao; 6 7 @Transactional 8 public void transfer(int outter, int inner, Integer money) { 9 10 accountDao.moveOut(outter, money); //转出 11 int i = 1/0; // 抛出异常 12 accountDao.moveIn(inner, money); //转入 13 14 } 15 }
10,再把数据库的数据恢复成最初的 andy-200, lucy-300, 然后启动类测试,浏览器输入 http://localhost:8080/account/transfer , 测试显示 转账失败,看看数据库的数据,andy余额是200, lucy余额300,如下图所示。
说明转出和转入都没有成功,这才是合乎逻辑的。
springboot 开启事物很简单,只需要加注解@Transactional 和 @EnableAutoConfiguration,声明事务就可以了,