springboot开发论坛学习 ---- 3.3+3.4

本文介绍了在SpringBoot项目中如何开发论坛的帖子详情页面,涉及DiscusPostMapper、Service、Controller及视图的配置。同时,深入探讨了事务管理,包括事务的ACID特性、隔离级别及其对并发异常的影响,讲解了数据库的悲观锁和乐观锁机制。最后,讨论了Spring的声明式和编程式事务管理,提供了在不同业务场景下的选择建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

帖子详情

DiscusPostMapper

增加查看帖子的方法

    //增加查看帖子的方法
    DiscussPost selectDiscussPostById(int id);

//在discuss-mapper.xml中
<!-- 实现查看帖子的select语句 -->
    <select id="selectDiscussPostById" resultType="DiscussPost">
        select <include refid="selectFields"></include>
        from discuss_post
        where id = #{id}
    </select>

DiscussPostService

增加一个查询方法

//添加一个查看帖子的方法
    public DiscussPost findDiscussPostById (int id) {
        return discussPostMapper.selectDiscussPostById(id);
    }

DiscussPostController

在controller处理查询请求

//处理查看帖子的请求
    @RequestMapping(path = "/detail/{discussPostId}", method = RequestMethod.GET)
    public String getDiscussPost(@PathVariable("discussPostId") int discussPostId, Model model) {
        //查询帖子
        DiscussPost post = discussPostService.findDiscussPostById(discussPostId);
        model.addAttribute("post", post);
        //查询帖子的作者
        User user = userService.findUserById(post.getUserId());
        model.addAttribute("user", user);

        return "/site/discuss-detail";
    }

index.html

  • 在帖子标题上增加访问详情页面的链接

discuss-detail.html

  • 处理静态资源的访问路径

  • 复用index.html的header区域

  • 显示标题、作者、发布时间、帖子正文等内容

事务管理

为添加评论做准备

回顾

  • 什么是事务
    事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。
  • 事务的特性(ACID)
  1. 原子性(Atomicity):事务是应用中不可再分的最小的执行体。
  2. 一致性(Consistency):事务执行的结果,须使数据从一个一致性状态,变为另一个一致性状态。
  3. 隔离性(Isolation):各个事务的执行互不干扰,任何事务的内部操作对其他的事务都是隔离的。
  4. 持久性(Durability):事务一旦提交,对数据所做的任何改变都要记录到永久存储器中。

事务的隔离性(面试重要)

  • 常见的并发异常
    • 第一类丢失更新、第二类丢失更新。
    • 脏读、不可重复读、幻读。
  • 常见的隔离级别(由上到下安全级别逐级递增) ---- 互联网应用中一般都选择中间的级别,因为它既能满足我业务的需要,保证我业务的安全性
    • Read Uncommitted:读取未提交的数据。
    • Read Committed:读取已提交的数据。
    • Repeatable Read:可重复读。
    • Serializable:串行化,序列化。可以解决所有的并发异常,但是它需要对数据加锁,而加锁会降低数据库处理的性能,使得性能下降得很快。
      在这里插入图片描述
      第一类丢失更新:如果不做事务的隔离,就会发生这样的问题
      在这里插入图片描述
      第二类丢失更新:
      在这里插入图片描述
      脏读:
      在这里插入图片描述
      不可重复读:查询一条数据导致不一致
      在这里插入图片描述
      幻读:查询多条数据导致不一致
      在这里插入图片描述

实现机制 — 数据库保障事务的实现

  • 悲观锁(数据库自带的实现机制) – 其认为如果并发就一定会有问题,必须提前加锁
    • 共享锁(S锁)
      事务A对某数据加了共享锁后,其他事务只能对该数据加共享锁,不能加排他锁。
    • 排他锁(X锁)
      事务A对某数据加了排他锁后,其他事务对该数据既不能加共享锁,也不能加排他锁。
  • 乐观锁(自定义)
    • 版本号、时间戳等
      在更新数据前,检查版本号是否发生变化。若变化则取消本次更新,否则就更新数据(版本号+1)

Spring事务管理

Transaction Management

声明式事务 – 平常优选选第一种,简单

  • 通过XML配置,声明某方法的事务特征。

  • 通过注解,声明某方法的事务特征

编程式事务 – 业务逻辑复杂,选择第二种

  • 通过 TransactionTemplate 管理事务,并通过它执行数据库的操作。
Spring Boot 是一个基于 Spring 框架的快速开发框架,而 MyBatis-Plus 则是 MyBatis 的增强工具,提供了很多方便的查询和操作数据库的 API。下面是 Spring Boot 加 MyBatis-Plus 的使用说明: 1. 配置 MyBatis-Plus 在 pom.xml 文件中添加 MyBatis-Plus 的依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.3</version> </dependency> ``` 在 application.yml 文件中添加数据库连接信息和 MyBatis-Plus 的配置: ``` spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath:mapper/*.xml global-config: db-config: id-type: auto field-strategy: not_empty table-prefix: mp_ ``` 2. 创建实体类和 Mapper 接口 创建实体类和对应的 Mapper 接口,使用 @TableName 注解指定表名,@TableField 注解指定字段名。 ``` @Data @TableName("user") public class User { @TableId(type=IdType.AUTO) private Long id; @TableField("username") private String username; @TableField("password") private String password; } @Mapper public interface UserMapper extends BaseMapper<User> { } ``` 3. 使用 MyBatis-Plus 的 API 进行数据库操作 使用 MyBatis-Plus 的 API 进行数据库操作非常方便,比如查询所有用户: ``` @Autowired private UserMapper userMapper; public List<User> getAllUsers() { return userMapper.selectList(null); } ``` 其他常用的 API 包括:insert、updateById、deleteById、selectById 等。 以上就是 Spring Boot 加 MyBatis-Plus 的简单使用说明,更多详细的使用方法可以参考 MyBatis-Plus 的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值