导入Mybatis和mysql的依赖
我使用的eclipse
```java
<properties>
<maven-jar-plugin.version>3.0.0</maven-jar-plugin.version>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot整合mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!-- mysql 5.1.14 版本 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.14</version>
</dependency>
```java
application.properties属性文件中配置 数据库的信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/firstonedataku
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
//javaBean,日志
mybatis.type-aliases-package=com.example.demo.model
logging.level.com.example.demo.dao=debug
**Controller层**
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.service.AccountServicelmpt;
@RestController
@RequestMapping("/account")
public class AccountController {
@Autowired //自动装配
private AccountServicelmpt service;//可以来切换绑定的不同的Service
@RequestMapping("/operator")
public String operatorAccount()
{
System.out.println("AccountController is operatorAccount start.... ");
//李欣借钱给谢一凡
try
{
this.service.operatorAccount(1, 2, 50,"啦啦");
return "转账成功";
}
catch(Exception e)//自己来写一个try{}catch(){}来捕获异常,转账可能会失败
{
return "转账失败";
}
}
}
**Service层**
```java
**接口**
package com.example.demo.service;
public interface IAccountService {
public void operatorAccount(int outa,int ina,Integer money,String name);
}
**接口的实现类**
```java
package com.example.demo.service;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.demo.dao.IAccountDao;
@Service//可以来切换绑定的不同的Service,作用是承上启下
public class AccountServicelmpt implements IAccountService {
@Autowired
private IAccountDao dao;
/**
* @Transactional()这个注解无效的情况: 1、private修饰的方法,一定一定一定要是public方法
* 2、出现了检查异常,会失效
* 3.数据库的引擎不支持事务也会失效
* 出现了检查异常 解决办法: 1,@Transactional(rollbackFor=Exception.class)
* 2,throw new RuntimeException();
*
*
* **/
@Transactional(rollbackFor=Exception.class) //事务性的 rollbackFor=的意思是回滚的异常的类型是Exception类型的包含了所有的异常,exception是父类型
@Override
public void operatorAccount(int outa,int ina,Integer money,String name) {
System.out.println("开始操作两个用户之间转账的事务...............");
//出现了非检查异常的时候,Transactional注解是有效的
//调用数据库中转出帐的方法
//this.dao.out(outa, money);
// 手动制造了一个异常 非检查异常
//int i = Integer.parseInt(name);
//调用数据库中转入帐的方法
//this.dao.in(ina, money);
//出现了检查异常,Transactional注解会失效,但是可以解决
//设置一个检查异常
try {
this.dao.out(outa, money);
FileInputStream fin=new FileInputStream("a.txt");//检查异常
this.dao.in(ina, money);//出现异常了,要抛出异常,让这几个操作回滚
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException();//要抛出这个异常
}
}
}
``
Dao层
package com.example.demo.dao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;
@Mapper //这个接口在编译时会生成相应的实现类
public interface IAccountDao {
//转出
@Update("UPDATE t_accout SET balance=balance-#{money} WHERE id=#{id}")
public void out(int id,Integer money);//Integer????如果返回字段值为null,int类型会报错,Integer不会报错。因为int类型声明的是变量,而null是对象所以会报错。
//转入
@Update("UPDATE t_accout SET balance=balance+#{money} WHERE id=#{id}")
public void in(int id,Integer money);//Integer????int类型的默认值为0,Integer类型的默认值为null。
}