1.springboot开启事务,只需要一个注解@Transactional 就可以了
(1)因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事务
(2)引入它们依赖的时候,事物就默认开启
(3)如果需要用其他的orm,比如beatlsql,就需要手动配置相关的事物管理器
2.环境依赖
(1)在pom文件中引入mybatis启动依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
(2)引入mysql 依赖和数据库连接池
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
3.创建配置文件application.properties
(1)配置数据源
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
mybatis.mapper-locations=classpath*:mybatis/*Mapper.xml
mybatis.type-aliases-package=com.user.entity
<1>mybatis.mapper-locations来指明mapper的xml文件存放位置
<2>上面存放位置是放在resources/mybatis文件下的
<3>mybatis.type-aliases-package来指明和数据库映射的实体的所在包
(2)经过以上步骤,springboot就可以通过mybatis访问数据库来
4.创建数据库表(略,自行创建)
5.具体实现:通过xml的形式实现
(1)创建实体:
public class Account {
private int id ;
private String name ;
private double money;
getter../setter.. }
(2)数据访问Dao层
public interface AccountMapper {
int update( @Param("money") double money, @Param("id") int id);}
(3)Mapper:接口实现
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.user.dao.AccountMapper">
<update id="update">
UPDATE account set money=#{money} WHERE id=#{id}
</update></mapper>
(4)Service层
@Service
public class AccountService {
@Autowired
AccountMapper accountMapper;
@Transactional//@Transactional注解开启声明式事务
public void transfer() throws RuntimeException{
accountMapper2.update(90,1);//用户1减10块 用户2加10块
int i=1/0;accountMapper2.update(110,2);}}
6.@Transactional放在类级别和方法级别的区别
(1)@Transactional放在类级别上等同于该类的每个方法都放上了@Transactional
(2)方法的@Transactional会覆盖类上面声明的事务
(3)代码示例如下:
//默认将类中的所有函数纳入事务管理.
@Transactional(readOnly=true) //配置事务 查询使用只读
public Demo{
//方法的写法 (增删改要写 ReadOnly=false 为可写)
@Transactiona(propagation=Propagation.REQUIRED,
isolation=Isolation.DEFAULT,
readOnly=false)
public void saveUser(){}}
<1>Propagation.REQUIRED :有事务就处于当前事务中,没事务就创建一个事务
<2>isolation=Isolation.DEFAULT:事务数据库的默认隔离级别
<3>readOnly=false:可写 针对 增删改操作