Mybatis-Plus -05 插件使用

news/2024/11/22 20:11:09/

Mybatis-Plus--必备插件

  • 1 分页插件
    • 1.1 配置MybatisPlus分页插件
    • 1.2 分页插件测试
  • 2 乐观锁插件
    • 2.1 悲观锁
    • 2.2 乐观锁
    • 2.3 MP中实现乐观锁
      • 2.3.1 配置插件
      • 2.3.2 ` @Version`注解
      • 2.3.3 测试乐观锁插件
  • 3 防止全表更新与删除插件
    • 3.1 配置全表更新与删除插件
    • 3.2 测试插件

1 分页插件

已知的分页查询解决方案

  • 使用数据库limit实现
  • 使用PageHelper分页插件(mybatis)
  • Mybatis-Plus内置了分页插件

1.1 配置MybatisPlus分页插件

<!-- 配置SqlSessionFactoryBean   -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">......<!-- 添加插件配置 --><property name="plugins" ref="plusInterceptor"></property>
</bean><!--MybatisPlus插件-->
<bean id="plusInterceptor" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor"><property name="interceptors"><list><!--分页插件--><bean class="com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor"/></list></property>
</bean>

1.2 分页插件测试

根据 entity 条件,查询全部记录(并分页)

  • IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
@Test
public void test18(){//参数1 :当前页   参数2:每页条数Page page = new Page(2,3);//参数1:当前页    参数2:条件userMapper.selectPage(page,null);System.out.println(page.getTotal());  //总条数System.out.println(page.getPages());    //总页数System.out.println(page.getCurrent());    //当前页System.out.println(page.getSize());     //每一页条数System.out.println(page.getRecords());     //每一页数据
}
//测试分页查询
@Test
public void testPage(){Page<User> page = new Page<>(1,3);userMapper.selectPage(page, null);//page中包含了分页的相关信息System.out.println(page);List<User> userList = page.getRecords();userList.forEach(System.out::println);
}

2 乐观锁插件

2.1 悲观锁

当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。

**但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;**另外,还会降低并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。

在数据库中演示

-- 会话1
set autocommit = 0 ;
select name,age,email from user where id = 1 for update;
commit;-- 会话2
set autocommit = 0;
update user set name = 'lisi' where id = 1; -- 此时无法进行修改,必须要等到会话1提交事务

2.2 乐观锁

乐观锁( Optimistic Locking ) 是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

在数据库中演示

-- 会话1
select name,age,email,version from user where id = 1
update name='王五',age=30 where id = 1 and version = 1;
-- 更新完毕将version+1-- 会话2
select name,age,email,version from user where id = 1
update name='赵六',age=30 where id = 1 and version = 1;-- 此时更新失败,version不一致

2.3 MP中实现乐观锁

当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

2.3.1 配置插件

<!-- 配置SqlSessionFactoryBean   -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">......<!-- 添加插件配置 --><property name="plugins" ref="plusInterceptor"></property>
</bean><!--MybatisPlus插件-->
<bean id="plusInterceptor" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor"><property name="interceptors"><list><!--乐观锁插件--><bean class="com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor"/></list></property>
</bean>

2.3.2 @Version注解

@Version
private Integer version;

2.3.3 测试乐观锁插件

//乐观锁(更新成功(单线程演示))
@Test
public void testLock1(){User user = userMapper.selectById(1L);user.setName("zhangsan");user.setAge(30);userMapper.updateById(user);
}
//乐观锁(更新失败(多线程演示))
@Test
public void testLock2(){//模拟线程1User user = userMapper.selectById(1L);user.setName("zhangsan");user.setAge(30);//线程1还未来得及更新,模拟线程2执行,此时线程2成功更新,并将version+1User user1 = userMapper.selectById(1L);user1.setName("李四");user1.setAge(31);userMapper.updateById(user1);//线程1此时执行,但是无法更新成功,因为version版本与查询版本不一致userMapper.updateById(user);
}

3 防止全表更新与删除插件

针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除

3.1 配置全表更新与删除插件

<!-- 配置SqlSessionFactoryBean   -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">......<!-- 添加插件配置 --><property name="plugins" ref="plusInterceptor"></property>
</bean><!--MybatisPlus插件-->
<bean id="plusInterceptor" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor"><property name="interceptors"><list><!--防止全表更新和删除插件--><bean class="com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor"/></list></property>
</bean>

3.2 测试插件

@Test
public void test21(){int count = userMapper.delete(null);System.out.println(count);
}

注意:此时会报错:Prohibition of table update operation禁止全表更新操作,必须携带条件


http://www.ppmy.cn/news/49323.html

相关文章

Spring依赖注入的三种方式使用及优缺点

初学Spring的时候,我们从Spring容器中获取Bean对象都是通过bean标签先将Bean对象注册到Spring容器中&#xff0c;然后通过上下文对象congtext的getBean方法进行获取&#xff0c;显然这种方法较为麻烦&#xff0c;所以有了更简单的存方法&#xff1a;五大类注解&#xff1b;取方…

【vue】vuex详解

文章目录 vuexstategettersmutationsactionsactions和mutations的区别 modules vuex vuex是一个专门为vue.js应用程序开发的状态管理模式库&#xff0c;它采用集中式存储管理应用的所有组件的状态&#xff0c;并以响应的规则保证状态以一种可预测的方式发生变化 state 存放数据…

VMware ESXi 8.0U1 Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

发布 ESXi 8.0U1 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8-u1-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-04-18, VMware vSp…

IT项目管理 PPT 选择题【太原理工大学】

单选题&#xff0c;10*2分20分 填空题&#xff0c;10*2分20分 判断题&#xff0c;10*1分10分 画图题&#xff0c;10分 进度计算题&#xff0c;15分 成本计算题&#xff0c;15分 简答题&#xff0c;5*2分10分 重点章节&#xff1a;3、4、5、6、7章 我觉得小题应该是在 PP…

【分布式系统架构】架构演进方案

背景 在面试的时候我们可能会遇到面试官反问当流量激增的时候&#xff0c;你如何进行设计方案呢&#xff1f; 其实在架构设计的时候&#xff0c;简单、合适、演进进行设计&#xff0c;而具体的成熟方案高性能、高可用、可拓展。 比如假设我们刚开始用户量不多&#xff0c;日QP…

Git - 如何checkout一个tag

在版本管理中&#xff0c;Tag就是用来标记和保存一个配置状态&#xff0c;用来对配置进行跟踪和备份。 在发布版本时&#xff0c;一般都会创建一个Tag。然后用这个Tag就能引用到这个版本。 在Git中&#xff0c;如果知道一个Tag状态&#xff0c;如何在本地将配置切换到该状态呢&…

Java - Lambda 表达式

一、背景 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式&#xff08;Lambda expression&am…

托福高频真词List03 // 附阅读真题

目录 4月23日单词 4月23日真题 4月23日单词 adjacentneighboringnearbyadj 毗邻的dependablereliableadj 可靠的 chronology a list that pairs past events with dates n 年表remarkably closeextremely close极为接近competenceabilityn 才能supplementadd tov 补充supplem…