当前位置: 首页 > wzjs >正文

台州专业网站建设方案石景山区百科seo

台州专业网站建设方案,石景山区百科seo,邢台网站建设多少钱,电子网站建设推广方案目录 1.分页插件 1.1 添加配置类 1.2 测试 2.xml自定义分页 2.1 UserMapper中定义接口方法 2.2 UserMapper.xml中编写SQL 2.3 测试 3. 乐观锁 3.1 场景 3.2 乐观锁与悲观锁 3.3 模拟修改冲突 1. 数据库增加商品表 2. 添加数据 3. 添加实体 4. 添加mapper 5. 测试…

目录

1.分页插件

1.1 添加配置类

1.2 测试

2.xml自定义分页

2.1 UserMapper中定义接口方法

2.2 UserMapper.xml中编写SQL

2.3 测试

3. 乐观锁

 3.1 场景

3.2 乐观锁与悲观锁

3.3 模拟修改冲突

1. 数据库增加商品表

2. 添加数据

 3. 添加实体

4. 添加mapper

5. 测试

 3.4 乐观锁实现流程

3.5 乐观锁实现流程

1. 修改实体类

 2. 添加乐观锁插件配置

 3. 测试修改冲突

 4. 优化流程


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);

 

 3. 添加实体

@Data
public class Product {private Long id;private String name;private Integer price;private Integer version;
}

4. 添加mapper


@Repository
public interface ProductMapper extends BaseMapper<Product> {
}

5. 测试

@Testpublic void testConcurrentUpdate() {//1、小李Product p1 = productMapper.selectById(1L);System.out.println("小李取出的价格:" + p1.getPrice());//2、小王Product p2 = productMapper.selectById(1L);System.out.println("小王取出的价格:" + p2.getPrice());//3、小李将价格加了50元,存入了数据库p1.setPrice(p1.getPrice() + 50);int result1 = productMapper.updateById(p1);System.out.println("小李修改结果:" + result1);//4、小王将商品减了30元,存入了数据库p2.setPrice(p2.getPrice() - 30);int result2 = productMapper.updateById(p2);System.out.println("小王修改结果:" + result2);//最后的结果Product p3 = productMapper.selectById(1L);
//价格覆盖,最后的结果:70System.out.println("最后的结果:" + p3.getPrice());}

 

 

 

显然,最后的结果是70. 

 3.4 乐观锁实现流程

 数据库中添加version字段

取出记录时,获取当前version 

SELECT id,`name`,price,`version` FROM product WHERE id=1

 更新时, version + 1,如果where语句中的version版本不对,则更新失败

UPDATE product SET price=price+50, `version`=`version` + 1 WHERE id=1 AND `version`=1

3.5 乐观锁实现流程

1. 修改实体类

@Data
public class Product {private Long id;private String name;private Integer price;@Versionprivate Integer version;
}

 2. 添加乐观锁插件配置

@Configuration
@MapperScan("com.qcby.mybatisplus.mapper")//可以将主类中的注解移到此处
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//添加分页插件interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));//添加乐观锁插件interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor;}
}

 3. 测试修改冲突

 小李查询商品信息:

SELECT id,name,price,version FROM t_product WHERE id=?

 小王查询商品信息:

SELECT id,name,price,version FROM t_product WHERE id=?

 

 小李修改商品价格,自动将version+1

UPDATE t_product SET name=?, price=?, version=? WHERE id=? AND version=?
Parameters: 外星人笔记本(String), 150(Integer), 1(Integer), 1(Long), 0(Integer)

 

 小王修改商品价格,此时version已更新,条件不成立,修改失败

UPDATE t_product SET name=?, price=?, version=? WHERE id=? AND version=?
Parameters: 外星人笔记本(String), 70(Integer), 1(Integer), 1(Long), 0(Integer)

 

 最终,小王修改失败,查询价格:  150

 

SELECT id,name,price,version FROM t_product WHERE id=?

 

 4. 优化流程

@Testpublic void testConcurrentVersionUpdate() {//小李取数据Product p1 = productMapper.selectById(1L);//小王取数据Product p2 = productMapper.selectById(1L);//小李修改 + 50p1.setPrice(p1.getPrice() + 50);int result1 = productMapper.updateById(p1);System.out.println("小李修改的结果:" + result1);//小王修改 - 30p2.setPrice(p2.getPrice() - 30);int result2 = productMapper.updateById(p2);System.out.println("小王修改的结果:" + result2);if(result2 == 0){//失败重试,重新获取version并更新p2 = productMapper.selectById(1L);p2.setPrice(p2.getPrice() - 30);result2 = productMapper.updateById(p2);}System.out.println("小王修改重试的结果:" + result2);//老板看价格Product p3 = productMapper.selectById(1L);System.out.println("老板看价格:" + p3.getPrice());}

http://www.dtcms.com/wzjs/115341.html

相关文章:

  • 外国好的设计网站大全宁波好的seo外包公司
  • 怎么把自己笔记本做服务器做个网站重庆关键词搜索排名
  • 青岛网站建设技术托管站长工具seo综合查询可以访问
  • 网站联系方式修改seo排名点击 seo查询
  • 进销存软件排行榜前十名青岛seo网站排名优化
  • 那里有个人做网站的山东seo首页关键词优化
  • 网站设计要如何做支付功能必应搜索引擎怎么样
  • phpcms手机网站关键词查网站
  • Discuz网站制作教程2345网址导航智能主板
  • 河间市做网站价格免费网页代码大全
  • 主播网站建设seo优化报告
  • 网站qq临时会话怎么弄开发一个平台需要多少钱
  • 查网站域名备案价格信息流广告素材网站
  • wordpress 网页模板武汉seo网站管理
  • 怎么建设淘宝联盟的网站seo友情链接
  • 网站备案信息核验单重庆seo怎么样
  • 中国城乡建设委员会网站口碑营销公司
  • 北京网站建设方案排名合肥seo网站排名
  • 荣添网站建设优化bt磁力搜索
  • 山东集团网站建设 中企动力微信广告投放推广平台多少费用
  • 莱芜网站建设价格数据分析平台
  • b2c网站的促销策略大学生网页设计作业
  • 怎么做网站访问统计品牌推广思路
  • 永久免费的自助建站东莞seo优化seo关键词
  • 网站营销seo关于网络推广的方法
  • 网站建设流程步骤关键词推广软件
  • 美国站群多ip服务器供应商优化服务内容
  • 网站建设分为哪几种网站服务器搭建
  • 实搜网站建设安卓系统优化app
  • 新乡网站建设价格竞价推广营销