美文网首页
Spring boot 配合 Mybatis 使用事务

Spring boot 配合 Mybatis 使用事务

作者: MrDcheng | 来源:发表于2019-05-12 17:09 被阅读0次

项目结构

1.png

主要演示代码

1、Application(添加 @EnableTransactionManagement 注解)

@SpringBootApplication
@EnableTransactionManagement
@MapperScan("defaultpackage.dao")
public class Application {

    public static void main(String[] args) {
        Logger log= LoggerFactory.getLogger(Application.class);
        SpringApplication.run(Application.class, args);
        log.info("测试开始!");
    }
}

2、Entity

public class Entity {

    private Integer id;
    private String name;
    private String age;

    ……省略 get、set 以及构造等内容
}

3、UserService(在需要事务的 service 方法添加 @Transactional 注解)
其中的 insertUserDataAuto 方法展示了事务特性。循环插入 5 条数据,当 index == 2 时报运行时错误,此时查看数据库,发现已经回滚,没有相关数据出现。

@Service
public class UserService {

    @Autowired
    private UserMapping userMapping;

    public List<Entity> getUserDataByID(int id) {
        return userMapping.getUserDataByID(id);
    }

    public void insertUserData(Entity entity) {
        userMapping.insertUserData(entity);
    }

    @Transactional
    public void insertUserDataAuto() {
        for (int index = 5; index > 0; index--) {
            if (index == 2) {
                throw new RuntimeException("this is a wrong!");
            }
            userMapping.insertUserData(new Entity("newApple", String.valueOf(index)));
        }
    }
}

4、Controller

@RestController
public class Controller {

    @Autowired
    private UserService userService;

    @RequestMapping("/find/{id}")
    public List<Entity> findElement(@PathVariable int id) {
        return userService.getUserDataByID(id);
    }

    @RequestMapping("/add/{name}/{age}")
    public Entity addElement(@PathVariable String name, @PathVariable String age) {
        Entity element = new Entity(name, age);
        userService.insertUserData(element);
        return element;
    }

    @RequestMapping("/add/run")
    public void addNElement() {
        userService.insertUserDataAuto();
    }
}

5、WebRunTest(仅为启动首页,与事务演示无关)

@Controller
public class WebRunTest {
    @RequestMapping("/")
    public String GotoIndexWeb() {
        return "index";
    }
}

6、UserMapping

@Repository
public interface UserMapping {
    List<Entity> getUserDataByID(int id);
    void insertUserData(Entity entity);
}

7、DataMapping.xml

<?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="defaultpackage.dao.UserMapping">
    <select id="getUserDataByID" resultType="defaultpackage.domain.Entity">
        SELECT * FROM users WHERE id=#{id}
    </select>

    <insert id="insertUserData" parameterType="defaultpackage.domain.Entity">
        REPLACE into users (id, name, age) SELECT
        #{id}, #{name}, #{age}
        FROM DUAL
        WHERE NOT EXISTS(SELECT name, age FROM users WHERE name=#{name} AND age=#{age})
    </insert>
</mapper>

8、application.yml

spring:
  profiles:
    active: product
  datasource:
    url: jdbc:mysql://localhost:3306/datatest?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    username: root
    password: 123456
  thymeleaf:
    prefix: classpath:/

server:
  port: 8089

mybatis:
  mapper-locations: classpath:mapper/*.xml

要点

  • Application 添加 @EnableTransactionManagement 注解
  • 在需要事务的 service 方法添加 @Transactional 注解

相关文章

网友评论

      本文标题:Spring boot 配合 Mybatis 使用事务

      本文链接:https://www.haomeiwen.com/subject/llncaqtx.html