Back

mp插件-分页器、乐观锁

mp插件-分页器、乐观锁的学习

常用插件

分页器插件

分页查询是开发过程中很常见的一个功能。mp 提供了该插件进行简化开发。

基础使用

  1. 新建MybatisPlusConfig配置类(官网)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 如果配置多个插件, 切记分页最后添加
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); 
        return interceptor;
    }
}

属性介绍:

image-20241210154454397
image-20241210154454397

  1. 通过使用 selectPage方法进行基础的查询
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
@Test
    void testPage(){
        // 测试分页器
        // 创建一个page对象。设置参数,当前页,每页显示条数
        Page<Tags> page = new Page<>(1, 3);
        // 查询的结果会存储到page对象中。第二个参数是条件构造器
        tagMapper.selectPage(page,null);
        List<Tags> records = page.getRecords();
        // 遍历结果
        records.forEach(System.out::println);
        // 也有一些其他参数
        page.getRecords();
        page.getTotal();
        page.getCurrent();
        page.getSize();
        page.getPages();
        page.hasNext();
        page.hasPrevious();
    }
  1. 也可以自定义Mapper通常是一下方法:(Page 继承与Ipage) selectPageVO
1
2
3
4
5
IPage<UserVo> selectPageVo(IPage<?> page, Integer state);
// 或者自定义分页类
MyPage selectPageVo(MyPage page);
// 或者返回 List
List<UserVo> selectPageVo(IPage<UserVo> page, Integer state);

对应的XML配置:

1
2
3
<select id="selectPageVo" resultType="xxx.xxx.xxx.UserVo">
    SELECT id,name FROM user WHERE state=#{state}
</select>

案例:实际使用(其实自定义个方法同名方法,自定义返回类型等等)

1
2
3
4
5
6
7
@Mapper
public interface TagMapper extends BaseMapper<Tags> {
    List<Tags> selectPageVO(
            Page<Tags> page,
            Integer id  // 这个是设置自定义条件的。
    );
}
1
2
3
4
5
<mapper namespace="top.rose.health.mapper.TagMapper">
    <select id="selectPageVO" resultType="top.rose.health.entity.Tags">
        select * from tags where id > #{id};
    </select>
</mapper>

测试:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
@Test
    void testPageVO() {
        // 测试自定义分页器
        Page<Tags> page = new Page<>(1, 3);
        // 查询id大于2的进行分页
        List<Tags> records = tagMapper.selectPageVO(page, 2);
        // 遍历结果
        records.forEach(System.out::println);
        System.out.println("测试结束!");
    }

结果:

image-20241210165020252
image-20241210165020252

补充 - Page类

Page 类继承了 IPage 类,实现了简单分页模型。如果你需要实现自己的分页模型,可以继承 Page 类或实现 IPage 类。

image-20241210165304596
image-20241210165304596

乐观锁插件

简单来说:就是为了解决同时对数据库操作冲突的。

举例:一件物品100元,A、B 同时修改价格,A、B取出100,A操作得快,100-10 = 90 ,保存到数据库。B操作得慢,100+10 =110.保存到数据库。由于没有锁,因此110 覆盖掉 90.

解决方案:上锁– 乐观锁、悲观锁

乐观锁:保存之前,查询数据是否被修改,修改了则重新进行操作再保存。

悲观锁:只有等其他人操作结束后,才能对数据进行操作。

乐观锁实现方案:

  1. 数据库表添加一个version字段
  2. 取出数据时,记录下version
  3. 更新时 version +1 ,如果和数据库表中version不同则修改失败

使用

  1. 实体类中添加@Version 标识乐观锁版本号字段
  2. MybatisPlusConfig配置类中添加乐观锁插件配置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@Configuration
@MapperScan("com.yourpackage.mapper")
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

author: rose
Built with Hugo
Theme Stack designed by Jimmy
© Licensed Under CC BY-NC-SA 4.0