【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【07】【商品服务】分页查询_品牌分类关联与级联更新


持续学习&持续更新中…

守破离


【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【07】【商品服务】分页查询_品牌分类关联与级联更新

  • 分页查询
  • 为数据库表设计冗余字段
  • 冗余字段带来的问题以及处理
    • 品牌名发生变化,进行级联更新
    • 分类名发生变化,进行级联更新
  • 参考

分页查询

@Configuration
@EnableTransactionManagement //开启事务
@MapperScan("com.atguigu.gulimall.product.dao")
public class MyBatisConfig {//引入分页插件@Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认falsepaginationInterceptor.setOverflow(true);// 设置最大单页限制数量,默认 500 条,-1 不受限制paginationInterceptor.setLimit(1000);return paginationInterceptor;}}
    @Overridepublic PageUtils queryPage(Map<String, Object> params, Long catelogId) {IPage<AttrGroupEntity> page;IPage<AttrGroupEntity> queryPage = new Query<AttrGroupEntity>().getPage(params);if (catelogId == 0) { // 规定在分页查询下,id为0,代表查询所有page = this.page(queryPage, new QueryWrapper<>());} else {/*分页查询:# 假设每页15条(pageSize = 15)# 假设查询第n页 (n >= 1)#   SELECT * FROM student LIMIT (n - 1) * pageSize, pageSize;SELECT * FROM student LIMIT 0, 15; # 查询第一页SELECT * FROM student LIMIT 15, 15; # 查询第二页总数量:101条每一页显示20条公式:总页数 = (总数量  +  每页的数量   -   1) / 每页的数量= ( 101   +    20        -   1) / 20*//*该请求这么查询:select * from pms_attr_groupwhere catelog_id = catelogId and (attr_group_id = key or attr_group_name like '%key%')*/QueryWrapper<AttrGroupEntity> wrapper = new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId);Object key = params.get("key");if (!StringUtils.isEmpty(key)) {wrapper.and((obj) -> {obj.eq("attr_group_id", key).or().like("attr_group_name", key);});}page = this.page(queryPage, wrapper);}return new PageUtils(page);}

分页请求参数:

{page: 1,//当前页码limit: 10,//每页记录数sidx: 'id',//排序字段order: 'asc/desc',//排序方式key: '华为'//检索关键字
}

分页返回数据:

{"msg": "success","code": 0,"page": { "totalCount": 0, //总记录数"pageSize": 10,  //每页大小"totalPage": 0,  //总页码"currPage": 1, //当前页码"list": [{  //当前页所有数据"brandId": 1,"name": "aaa","logo": "abc","descript": "华为","showStatus": 1,"firstLetter": null,"sort": null}]}
}

为数据库表设计冗余字段

  • 对数据库大表,比如pms_category_brand_relation pms_brand pms_category
  • pms_brand和pms_category这两张表的关联表pms_category_brand_relation
  • 设计的时候可以不用设计上brand_name和catelog_name
  • 但是每次需要使用的时候就去关联查询会对数据库的性能有非常大的影响
  • 所以,我们对于大表数据从不做关联,因此就可以设计这两个冗余字段brand_name和catelog_name:
	create table gulimall_pms.pms_category_brand_relation(id           bigint auto_incrementprimary key,brand_id     bigint       null comment '品牌id',catelog_id   bigint       null comment '分类id',brand_name   varchar(255) null,catelog_name varchar(255) null)comment '品牌分类关联';

冗余字段带来的问题以及处理

  • 如果某张表中有其他表的冗余字段(pms_category_brand_relation中有pms_brand和pms_category的字段),那么,当其他表中的数据要更新时
  • 也就是当pms_brand和pms_category更新的时候
  • 我们也要更新pms_category_brand_relation这张表中受影响的字段(brand_name,catelog_name)
  • 品牌名发生变化,需要更新;
  • 分类名发生变化,需要更新;
  • 也就是级联更新

品牌名发生变化,进行级联更新

    /*** 修改*/@RequestMapping("/update")// @RequiresPermissions("product:brand:update")public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){
//        brandService.updateById(brand);brandService.updateCascade(brand);return R.ok();}
    @Transactional@Overridepublic void updateCascade(BrandEntity brand) {this.updateById(brand); // 先修改自己的数据//TODO 当brand表中的某些字段被其他表使用,并且该字段发生了更新,那么也需要修改那些表的信息if (!StringUtils.isEmpty(brand.getName())) { // 品牌名发生了变化categoryBrandRelationService.updateBrand(brand.getBrandId(), brand.getName());}}
    @Overridepublic void updateBrand(Long brandId, String brandName) {CategoryBrandRelationEntity entity = new CategoryBrandRelationEntity();entity.setBrandId(brandId);entity.setBrandName(brandName);this.update(entity,new UpdateWrapper<CategoryBrandRelationEntity>().eq("brand_id", brandId));}

分类名发生变化,进行级联更新

    /*** 修改*/@RequestMapping("/update")// @RequiresPermissions("product:category:update")public R update(@RequestBody CategoryEntity category) {categoryService.updateCascade(category);return R.ok();}
    @Transactional@Overridepublic void updateCascade(CategoryEntity category) {this.updateById(category);//TODO 当category表中的某些字段被其他表使用,并且该字段发生了更新,那么也需要修改那些表的信息if (!StringUtils.isEmpty(category.getName())) { // 分类名发生了变化categoryBrandRelationService.updateCategory(category.getCatId(), category.getName());}}
    @Overridepublic void updateCategory(Long catId, String catelogName) {this.baseMapper.updateCategory(catId, catelogName);}
@Mapper
public interface CategoryBrandRelationDao extends BaseMapper<CategoryBrandRelationEntity> {void updateCategory(@Param("catId") Long catId,@Param("catelogName") String catelogName);}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.atguigu.gulimall.product.dao.CategoryBrandRelationDao"><!-- ...... --><update id="updateCategory">UPDATE pms_category_brand_relation SET catelog_name = #{catelogName} WHERE catelog_id = #{catId}</update></mapper>

参考

雷丰阳: Java项目《谷粒商城》Java架构师 | 微服务 | 大型电商项目.


本文完,感谢您的关注支持!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/24724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL语句练习每日5题(四)

题目1——查找GPA最高值 想要知道复旦大学学生gpa最高值是多少&#xff0c;请你取出相应数据 题解&#xff1a; 1、使用MAX select MAX(gpa) FROM user_profile WHERE university 复旦大学 2、使用降序排序组合limit select gpa FROM user_profile WHERE university 复…

css系列:进度条

前言 技术来源于需求&#xff0c;近期遇到了做语音的需求&#xff0c;有个调整语速和音量的进度条&#xff0c;UI组件库的进度条大部分不支持拖动和点击修改当前进度&#xff0c;所以自己手写了一个。 实现思路 MDN文档介绍 <input type"range"> - HTML&am…

二叉树的前序便利,中序遍历,后序遍历

前序遍历&#xff1a; 递归&#xff1a; class Solution { public:void preorder(TreeNode *root, vector<int> &res) {if (root nullptr) {return;}res.push_back(root->val);preorder(root->left, res);preorder(root->right, res);}vector<int> …

解决 make_ext4fs is not find, it is recommanded to install android-tools-fsutils

编译cluster linux时&#xff0c;遇到make_ext4fs命令无法找到。这个工具是被软件包 android-tools-futils 包含的。这个软件包只支持18.04的系统&#xff0c;在ubuntu20.04和ubuntu22.04上&#xff0c;无法被正确的安装。会报依赖问题&#xff0c;报错的信息是依赖python相关的…

Java中的IO流字节流(FileOutputStream与FileInputStream)+编码与解码

目录 ​编辑 IO流 File0utputstream FileOutputstream写数据的3种方式 void write(int b) 一次写一个字节数据 void write(byte[] b) 一次写一个字节数组数据 void write(byte[] b,int off,int len) 一次写一个字节数组的部分数据 FileOutputstream写数据的…

搞编程学习时是如何查找资料的?

刚开始学编程时&#xff0c;我通常用百度、360这样的搜索引擎去找资料。但后来我发现&#xff0c;根据想找的东西不同&#xff0c;用的搜索地方也得变。比如说&#xff0c;找编程学习的东西&#xff0c;我就不太用浏览器了&#xff0c;因为那儿广告太多&#xff0c;信息乱七八糟…

问题:军保卡不允许开立附属卡,不能开展境外交易,不开通云闪付工功能() #其他#经验分享

问题&#xff1a;军保卡不允许开立附属卡&#xff0c;不能开展境外交易&#xff0c;不开通云闪付工功能&#xff08;&#xff09; A&#xff0e;A&#xff1a;正确 B&#xff0e;B&#xff1a;错误 参考答案如图所示

C++STL初阶(3):string模拟实现的完善

1.流提取>>的优化&#xff08;利用缓存区的思想&#xff09; istream& operator>>(istream& is,string& str) {str.clear();char c;c is.get();while (c ! \0 && c ! \n) {str c;c is.get();}return is; } 在上文的对string的实践中&#…

blazehttp下载安装和自动化测试防护效果

blazehttp下载安装和自动化测试防护效果 说明测试环境的准备网站和waf配置blazehttp下载安装和测试测试效果waf安全日志查看 说明 需要docker环境和1panel面板 本测试使用blazehttp南墙waf进行测试&#xff0c;有兴趣的同学推荐使用雷池waf 测试环境的准备 使用1panel面板&am…

为什么会有虚像

本来我就打算写虚像相关的内容&#xff0c;实际上我看不懂光学的内容&#xff0c;我只是发觉书上没有使用变分法来做&#xff0c;而只是解析几何的变换&#xff0c;这个做法完全脱离实际&#xff0c;物理书为什么会这样写不知道原因&#xff0c;但是很明显这样的内容也非常的复…

docker基础,docker安装mysql,docker安装Nginx,docker安装mq,docker基础命令

核心功能操作镜像 Docker安装mysql docker run -d --name mysql -p 3306:3306 -e TZAsia/Shanghai -e MYSQL_ROOT_PASSWORDlcl15604007179 mysql docker的基本操作 docker rm 容器名称即可 docker ps 查看当前运行的容器 docker rm 干掉当前容器 docker logs 查看容器命令日…

瑞安面试分享

瑞安面试分享 面试时间&#xff1a;07/06/2024 方式&#xff1a;在线zoom&#xff0c;雇主会发面试链接&#xff0c;提前进入准备 瑞安招前端和后端开发&#xff0c;我面的是偏数据库设计的后端开发 问题1&#xff1a;自我介绍 寒暄后开始自我介绍&#xff0c;如果是后端就…

Golang:bytes 格式和解析数字字节值(10K、2M、3G等)

bytes 格式和解析数字字节值(10K、2M、3G等) 文档 https://github.com/labstack/gommon/tree/master/bytes 安装 go get github.com/labstack/gommon/bytes代码示例 格式化 bytes.Format(13231323) // 12.62MiB解析 b, _ : bytes.Parse("2M") // 2000000完整代…

代码随想录算法训练营Day32|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

买卖股票的最佳时机II 122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 这里我的贪心策略是&#xff0c;判断今天和前一天的股票差值&#xff0c;若差值大于0&#xff0c;则说明能获益&#xff0c;即卖出&#xff0c;每天都比较一次&#xff0c;将所有差…

为什么Vue的watch函数无法检测到父组件的参数变化?

在 Vue 中&#xff0c;watch 函数用于观察和响应 Vue 实例上的数据变动。然而&#xff0c;如果你在父组件中直接修改了数组或对象的内容&#xff08;例如&#xff0c;通过索引直接设置一个项的值&#xff0c;或者使用 Array.prototype.push 修改数组&#xff09;&#xff0c;Vu…

【ARM Cache 及 MMU 系列文章 6 -- Cache 寄存器 CTR_EL0 | CLIDR | CCSIDR | CSSELR 使用详解 1】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Cache 常用寄存器Cache CSSELR 寄存器Cache CSSELR 使用场景Cache CSSELR 操作示例 Cache CLIDR 寄存器LoUU 介绍LoUU 使用 LoUIS 介绍CLIDR 使用 Cache CCSIDR 寄存器Cache CTR_EL0 C…

移动端投屏到大屏幕的操作详解

如果你懒得折腾电脑、电视或其他大屏设备上的影视软件安装及配置&#xff0c;可以选择直接在手机端上将影片投屏到电脑、电视或其他大屏设备上&#xff0c;这里给大家分享三种手机投屏的方法。 系统自带的投屏功能 不管是安卓、鸿蒙还是苹果操作系统&#xff0c;都自带了无线…

【RabbitMQ】exchange\channel\queue的联系

Exchange、Channel和Queue在RabbitMQ中各自扮演不同的角色&#xff0c;它们之间的联系构成了RabbitMQ消息传递的核心机制。以下是对它们之间联系的详细解释&#xff1a; Exchange&#xff08;交换机&#xff09;&#xff1a; 交换机是RabbitMQ中的消息路由器&#xff0c;它接收…

8.3 Go 包的组织结构

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

HTML静态网页成品作业(HTML+CSS)—— 家乡南宁介绍网页(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…