MybatisPlus(SpringBoot版)学习第六讲:插件(分页插件乐观锁)
目录
1.分页插件
1.1 添加配置类
1.2 测试
2.xml自定义分页
2.1 UserMapper中定义接口方法
2.2 UserMapper.xml中编写SQL
2.3 测试
1.分页插件
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能
1.1 添加配置类
@Configuration
@MapperScan("com.qcby.mybatisplus.mapper")//可以将主类中的注解移到此处
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}
1.2 测试
@Testpublic void testPage1(){
//设置分页参数Page<User> page = new Page<>(1, 5);userMapper.selectPage(page, null);
//获取分页数据List<User> list = page.getRecords();list.forEach(System.out::println);System.out.println("当前页:"+page.getCurrent());System.out.println("每页显示的条数:"+page.getSize());System.out.println("总记录数:"+page.getTotal());System.out.println("总页数:"+page.getPages());System.out.println("是否有上一页:"+page.hasPrevious());System.out.println("是否有下一页:"+page.hasNext());}
2.xml自定义分页
2.1 UserMapper中定义接口方法
@Repository
public interface UserMapper extends BaseMapper<User> {/*** 根据年龄查询用户列表,分页显示* @param page 分页对象 ,xml中可以从里面进行取值 ,传递参数 Page 即自动分页 ,必须放在第一位* @param age 年龄* @return */IPage<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);
}
注意!!
分页的插件不要删掉,他是分页功能的前提。
2.2 UserMapper.xml中编写SQL
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qcby.mybatisplus.mapper.UserMapper"><!--SQL片段,记录基础字段--><sql id="BaseColumns">uid,username,age,email</sql><!--IPage<User> selectPageVo(Page<User> page, Integer age);--><select id="selectPageVo" resultType="com.qcby.mybatisplus.entity.User">SELECT <include refid="BaseColumns"></include> FROM t_user WHERE age>#{age}</select>
</mapper>
配置映射:
mybatis-plus:configuration:# 配置MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 配置MyBatis-Plus操作表的默认前缀table-prefix: t_# 配置MyBatis-Plus的主键策略id-type: automapper-locations: classpath:mapper/*.xml
2.3 测试
@Testpublic void testSelectPageVo(){
//设置分页参数Page<User> page = new Page<>(1, 5);userMapper.selectPageVo(page, 20);
//获取分页数据List<User> list = page.getRecords();list.forEach(System.out::println);System.out.println("当前页:"+page.getCurrent());System.out.println("每页显示的条数:"+page.getSize());System.out.println("总记录数:"+page.getTotal());System.out.println("总页数:"+page.getPages());System.out.println("是否有上一页:"+page.hasPrevious());System.out.println("是否有下一页:"+page.hasNext());}
3. 乐观锁
3.1 场景
一件商品,成本价是80元,售价是100元。老板先是通知小李,说你去把商品价格增加50元。小李正在玩游戏,耽搁了一个小时。正好一个小时后,老板觉得商品价格增加到150元,价格太高,可能会影响销量。又通知小王,你把商品价格降低30元。
此时,小李和小王同时操作商品后台系统。小李操作的时候,系统先取出商品价格100元;小王也在操作,取出的商品价格也是100元。小李将价格加了50元,并将100+50=150元存入了数据 库;小王将商品减了30元,并将100-30=70元存入了数据库。是的,如果没有锁,小李的操作就完全被小王的覆盖了。
现在商品价格是70元,比成本价低10元。几分钟后,这个商品很快出售了1千多件商品,老板亏1 万多。
3.2 乐观锁与悲观锁
上面的故事,如果是乐观锁,小王保存价格前,会检查下价格是否被人修改过了。如果被修改过了,则重新取出的被修改后的价格:150元,这样他会将120元存入数据库。
如果是悲观锁,小李取出数据后,小王只能等小李操作完之后,才能对价格进行操作,也会保证 最终的价格是120元。
3.3 模拟修改冲突
1. 数据库增加商品表
CREATE TABLE t_product
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称 ',
price INT(11) DEFAULT 0 COMMENT '价格 ',
VERSION INT(11) DEFAULT 0 COMMENT '乐观锁版本号 ',
PRIMARY KEY (id)
);
2. 添加数据
INSERT INTO t_product (id, NAME, price) VALUES (1, '外星人笔记本 ', 100);