前言:个人感觉spring boot 配置mybatis还是挺简单的,省去了在xml中sqlsession工厂的配置和一些事务配置,使用注解就可以代替
一.先搭建mybatis环境
第一步:在pom文件里面导入我们用到的包,如图
第二步:在application.yml中配置
server:
port: 8082
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/day20?characterEncoding=utf-8
username: root
password: 123
mybatis:
type-aliases-package: com.asiainfo.bean #实体类位置
mapper-locations: classpath:mapper/*.xml #mapper文件路径
logging:
level:
com.asiainfo.dao: debug #简单实现sql打印日志
接下来就是大家熟知的mapper.xml文件的编写,和对应dao类的编写。贴上我写好的代码目录
第三步:不要忘记在启动类上加@mapperscan注释 //扫描的是mapper.xml中namespace指向值的包位置
基本步骤完毕。
二.基本事务的管理
贴上一段代码,我用的idea的 阿里代码规范约束,不指定异常类会有波浪提示
//开启事务的注解 指定了回滚的异常类
@Transactional(rollbackFor =Exception.class)
public void add(User u){
try {
userDao.add(u);
int i = 9/0; //构造异常
}catch (Exception e){
//手动进行回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
@Transactional可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。因此可以在Service层和Controller层使用。
- 通过@Transactional,实现了事务操作。
- Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对RuntimeException()异常或是其子类进行事务回滚;checked异常,即Exception可try{}捕获的不会回滚,因此对于我们自定义异常,通过rollbackFor进行设定
- 如果我们需要捕获异常后,同时进行回滚,通过TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚操作。
- 使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
设置回滚点,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滚到savePoint。
常用注解配置:
readOnly | 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true) |
rollbackFor | 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class}) |
rollbackForClassName | 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”}) |
noRollbackFor | 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class}) |
noRollbackForClassName | 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”}) |
propagation | 该属性用于设置事务的传播行为。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true) |
isolation | 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置 |
timeout | 该属性用于设置事务的超时秒数,默认值为-1表示永不超时 |