项目结构
![](https://img.haomeiwen.com/i5492471/bee2278e8a2fc3aa.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
注解
网友评论