-- 开启事务 BEGIN; DELETE FROM t_comment WHERE id = 7; SELECT article_id FROM t_comment WHERE id = 7; UPDATE t_statistic SET comments_num = comments_num + 1 WHERE article_id = 3; -- 提交事务 COMMIT;在mapper里面写
时间: 2024-02-20 22:59:20 浏览: 69
您的问题是在MyBatis的mapper里如何写一个包含事务操作?
可以使用MyBatis的注解@来实现事务。示例代码如下:
```java
@Mapper
public interface ArticleMapper
@Transactional
default void deleteCommentAndUpdateStatistic(int commentId, int articleId) {
try {
// 开启事务
sqlSessionTemplate.getConnection().setAutoCommit(false);
// 删除评论
CommentMapper commentMapper = sqlSessionTemplate.getMapper(CommentMapper.class);
commentMapper.deleteComment(commentId);
// 查询文章id
int articleIdFromComment = commentMapper.getArticleIdFromComment(commentId);
// 更新评论数
if (articleIdFromComment == articleId) {
StatisticMapper statisticMapper = sqlSessionTemplate.getMapper(StatisticMapper.class);
statisticMapper.updateCommentStatistic(articleId);
}
// 提交事务
sqlSessionTemplate.getConnection().commit();
} catch (Exception e) {
// 回滚事务
sqlSessionTemplate.getConnection().rollback();
// 抛出异常
throw new RuntimeException(e);
} finally {
// 关闭连接
sqlSessionTemplate.getConnection().close();
}
}
}
```
上述代码使用了MyBatis的注解@Transactional来表示该方法需要进行事务管理。该方法中通过SqlSessionTemplate获取Mapper对象,然后调用该Mapper的方法进行数据库操作。在方法中,我们使用getConnection()方法获取连接,并手动开启、提交、回滚事务。最后,我们在finally中关闭连接。
阅读全文