SQL调优:让Java内存分担计算

news2024/11/18 19:46:54

作者: 剽悍一小兔

CSDN前端优质创作者,打破编程小说次元壁第一人《JavaScript百炼成仙》作者,专注Java硬核干货分享,分享创造快乐,技术成就梦想!

我们在工作中,经常会因为一条慢sql调半天。这一节,我给大家介绍一种提升查询效率的思路,那就是让Java内存帮我们分担一些运算。

案例还是采用 springBoot日记本系统,源码下载地址和教程在文末。

先改一个BUG

之前遗留了一个BUG需要我们解决,就是在日记的详情页,日记类型没有做转换。

让我们看下controller:

@RequestMapping("diary/{id}.html")
@SaCheckLogin
public ModelAndView getDiary(@PathVariable Long id, ModelAndView mav){
    TblSynBlog tblSynBlog = blogService.selectOne(id);
    mav.addObject("blog",tblSynBlog);
    mav.addObject("statistics",blogService.getBlogsStatistics());
    mav.setViewName("detail");
    return mav;
}

破案了,代码中直接把tblSynBlog放到了modelAndView中,没有对Type进行专门的处理。

现在开始改BUG:

思路很简单,根据日记的type去类型表查询具体的中文是啥,再返回就可以了。

@RequestMapping("diary/{id}.html")
@SaCheckLogin
public ModelAndView getDiary(@PathVariable Long id, ModelAndView mav){
    TblSynBlog tblSynBlog = blogService.selectOne(id);
    //对Type进行中文转义
    SysBlogType type = sysBlogTypeService.getByTypeId(tblSynBlog.getBlogType());
    mav.addObject("blogType",type.getTypeName());

    mav.addObject("blog",tblSynBlog);
    mav.addObject("statistics",blogService.getBlogsStatistics());
    mav.setViewName("detail");
    return mav;
}

ISysBlogTypeService

SysBlogType getByTypeId(String blogType);

SysBlogTypeServiceImpl

@Override
public SysBlogType getByTypeId(String blogType) {
    return baseMapper.selectById(Integer.parseInt(blogType));
}

我们一般不推荐直接在controller引入mapper,这是规范,还是老老实实写service吧。

detail.jsp

<div class="title2">发布时间:${blog.createDate} &nbsp;&nbsp;&nbsp; 日志类别:${blogType}</div>

成果

搞定。

新需求

刚才的一套操作行云流水一般,现在我们来思考一个问题。假如我从数据库查询出一个List,需要给这个List额外增加一个字段,这个新字段需要从别的表里面查询,该怎么办?

比如,我现在要在类型管理页面增加对应类型的日记数量。

这是类型管理的页面。

我们打算加一列,显示文章的总数量。

一个简单的思路就是,先获取类型的列表,然后一次按照类型去查询对应文章的数量。

页面用的是axios异步查询的数据。

getData(){
  var index = layer.load(1); //添加laoding,0-2两种方式
  axios.post('${basePath}/sys-blog-type/selectAll',{}).then(r =>{
    layer.close(index);    //返回数据关闭loading
    if(r.data.code != '0000'){
      layer.msg(r.data.message,{icon:2});
      return;
    }
    console.log(r.data.data);
    this.listData = r.data.data;
  }).catch(error => {
    layer.msg(error.response.status,{icon:2});
    layer.close(index);    //返回数据关闭loading
  })
},

SysBlogTypeController

@RequestMapping("/selectAll")
public List<SysBlogType> selectAll(){
    return sysBlogTypeService.selectAll();
}

SysBlogTypeServiceImpl

@Override
public List<SysBlogType> selectAll() {
    QueryWrapper<SysBlogType> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("user_id", StpUtil.getLoginId());
    return sysBlogTypeMapper.selectList(queryWrapper);
}

代码一目了然,就是结合MybatisPlus做了条件查询。 我们通过controller发现,返回给前端的是List,我们需要增加一列,就需要在这里添加一个字段。

@TableField(exist = false)
private Integer blogNumber;

加上注解@TableField(exist = false)是因为这个字段只是返回给前端用的,不需要和数据库表做绑定。

修改service

@Autowired
BlogMapper blogMapper;

@Override
public List<SysBlogType> selectAll() {
    QueryWrapper<SysBlogType> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("user_id", StpUtil.getLoginId());
    List<SysBlogType> sysBlogTypes = sysBlogTypeMapper.selectList(queryWrapper);
    sysBlogTypes.forEach(e -> {
        Integer typeId = e.getId();
        Integer count = blogMapper.selectCount(new LambdaQueryWrapper<TblSynBlog>()
                .eq(TblSynBlog::getBlogType, typeId));
        e.setBlogNumber(count);
    });
    return sysBlogTypes;
}

这几行代码是遍历博客类型,计算每个类型下的博客数量,并将数量设置到博客类型实体类中的一个blogNumber属性中。

页面代码修改:

效果:

目的是达到了,但是假如类型非常多,就会导致for循环耗时过长。所以,我们一般不推荐在for循环里面再去查询数据库的。

优化:我们可以先把博客信息查询出来,然后用内存去计算。

@Override
public List<SysBlogType> selectAll() {
  // 创建查询条件对象
  QueryWrapper<SysBlogType> queryWrapper = new QueryWrapper<>();
  // 设置查询条件:用户ID等于当前登录用户的ID
  queryWrapper.eq("user_id", StpUtil.getLoginId());
  // 查询符合条件的博客分类列表
  List<SysBlogType> sysBlogTypes = sysBlogTypeMapper.selectList(queryWrapper);
  // 获取所有博客分类的ID
  Set<Integer> blogIds = sysBlogTypes.stream().map(SysBlogType::getId).collect(Collectors.toSet());
  // 根据博客分类ID查询对应的博客列表
  List<TblSynBlog> tblSynBlogs = blogMapper.selectList(new LambdaQueryWrapper<TblSynBlog>()
          .in(TblSynBlog::getBlogType, blogIds));
  // 将博客列表按照分类ID进行分组
  Map<String, List<TblSynBlog>> tblSynBlogsMap = tblSynBlogs.stream().collect(Collectors.groupingBy(TblSynBlog::getBlogType));
  // 遍历博客分类列表,设置每个博客分类对应的博客数量
  sysBlogTypes.forEach(e -> {
      List<TblSynBlog> synBlogs = tblSynBlogsMap.get(e.getId() + "");
      if (synBlogs != null) {
          e.setBlogNumber(synBlogs.size());
      } else {
          e.setBlogNumber(0);
      }
  });
  // 返回博客分类列表
  return sysBlogTypes;
}

数据不多的话,看不出啥,但是如果数据很多,性能会有一个显著的提升。

源码下载

这个案例我是在springboot日记本系统里面完成了,有需要源码的小伙伴直接clone这个项目即可。

文字教程:

https://blog.csdn.net/weixin_39570751/category_11699146.htmlhttps://blog.csdn.net/weixin_39570751/category_11699146.html

https://gitee.com/skyblue0678/diary

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

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

相关文章

无线蓝牙耳机什么牌子好?八大真无线蓝牙耳机排名

蓝牙耳机作为当前热门的数码产品&#xff0c;无论何时都能用上&#xff0c;蓝牙耳机的快速发展逐渐的取代有线耳机&#xff0c;摆脱线条的束缚&#xff0c;更方便携带。当然&#xff0c;随着蓝牙耳机的设计各种各样&#xff0c;导致很多的小伙伴在选购耳机的时候&#xff0c;不…

简易协程工具【Wait! - Easy Coroutines】

Wait! - Easy Coroutines | Utilities Tools | Unity Asset StoreUse the Wait! - Easy Coroutines from Iterant Games on your next project. Find this utility tool & more on the Unity Asset Store.https://prf.hn/l/b3AQw5a 1、概述 Wait - Easy Coroutines&#…

chatgpt赋能python:建立Python文件的完整指南

建立Python文件的完整指南 如果您正在寻找一个易于学习和使用的编程语言&#xff0c;Python就是一个不错的选择。Python的第一印象常常让人感到吃惊&#xff0c;因为它的代码与许多编程语言相比要短得多&#xff0c;然而它的功能非常强大且使用范围广泛。在本文中&#xff0c;…

【位图布隆过滤器海量数据面试题】

文章目录 1 位图2 布隆过滤器 1 位图 首先我们来看看一个腾讯的面试题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 分析&#xff1a; 40亿个不重复整形数据&#xff0c;大概有160亿字节…

Linux---vim的使用

专栏&#xff1a;Linux 个人主页&#xff1a;HaiFan. 本章为大家带来Linux工具—vim Linux工具 关于rzszyumvim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集简单vim配置配置文件的位置常用配置选项 关于rzsz 这个工具用于windows机器和Linux机器通过Xshell传输…

字符串--字符指针、字符串的访问和输入/输出(字符串空格问题,输入带双引号的字符串)

一、字符指针 字符指针&#xff08;Character Pointers&#xff09;是指向字符型数据的指针变量。 每个字符串在内存中都占用一段连续的存储空间&#xff0c;并有唯一确定的首地址。因此&#xff0c;只要将字符串的首地址赋值给字符指针&#xff0c;即可让字符指针指向一个字符…

安卓主板/开发板定制开发生产,MTK/高通/紫光展锐安卓开发板

智物通讯是一家致力于行业安卓主板定制开发的公司&#xff0c;提供包括MTK四核/八核方案、MTK、高通、紫光展锐系列行业主板方案定制等多样化的服务。 用户可以根据实际需求选择各种不同的模块类型&#xff0c;包括4G模块和5G模块。其中4G模块方案有MT6761、MT6762、MT6765、M…

爬虫 python 正则匹配 保存网页图片

目录 1. 简介1.1 爬虫1.2 爬虫语言1.3 python库1.4 我的步骤 2. 导入包2.1 代码2.2 requests库 3. 写入文件函数4. 获取图片5. 主函数5.1 代码5.2 说明一下webbrowser 6. 所有代码7. 其他&#xff08;可以忽略&#xff09;8. 总结 在这里我只提供的是一种方法&#xff0c;有很多…

webpack生产模式配置

一、生产模式和开发模式介绍 生成模式&#xff08;production mode&#xff09;是指在开发完成后将代码部署到生产环境中运行的模式&#xff0c;通常需要进行代码压缩、优化、合并&#xff0c;以减少文件大小和请求次数&#xff0c;提高页面加载速度和运行效率。 开发模式&am…

Android12 系统开发记录-迅为RK3588使用ADB工具

ADB 英文名叫 Android debug bridge &#xff0c;是 Android SDK 里面的一个工具&#xff0c;用这个工具可以 操作管理 Android 模拟器或者真实的 Android 设备&#xff0c;主要的功能如下所示&#xff1a;  在 Android 设备上运行 shell 终端&#xff0c;用命令行操作 …

How to fix the NHS 如何改革英国的国民医疗保险制度 | 经济学人20230527版社论双语精翻

他山之石&#xff1a;2023年5月27日《经济学人》社论&#xff08;Leaders&#xff09;精选&#xff1a;《如何改革英国的国民医疗保险制度》&#xff08;“How to fix the NHS”&#xff09; Leaders | The sick factor 社论 | 致病因素 How to fix the NHS 如何改革英国的国民…

软件安装mysql

1系统约定 安装文件下载目录&#xff1a;/data/softwareMysql目录安装位置&#xff1a;/usr/local/mysql数据库保存位置&#xff1a;/data/mysql日志保存位置&#xff1a;/data/log/mysql 2下载mysql 在官网&#xff1a;MySQL :: Download MySQL Community Server 中&#x…

Guitar Pro8.0.1最新中文版本吉他谱下载及使用教程

许多人都对吉他这个乐器很感兴趣&#xff0c;因为吉他的学习成本较低&#xff0c;学习难度较小&#xff0c;即便是零基础的小白通过短期的学习也能掌握基本的技巧。但实际上&#xff0c;学习吉他还需要认识吉他谱&#xff0c;识谱是每个吉他爱好者都必须掌握的技能&#xff0c;…

数字孪生世界建设核心能力:物理世界感知能力

中国信通院在《数字孪生城市白皮书&#xff08;2022年&#xff09;》中指出&#xff0c;数字孪生城市技术集成性高&#xff0c;核心板块日渐清晰&#xff0c;当前已逐步深入到城市全要素表达、业务预警预测、场景仿真推演、态势感知只能决策等多个环节。数字孪生技术的向前发展…

Yum update和upgrade的区别

Yum update和upgrade的区别 Linux yum中package升级命令有两个分别是 yum upgrade 和 yum update 1、区别 默认情况下&#xff0c;yum update和yum upgrade的功能是完全一样的&#xff0c;都是将需要更新的package(这里的包包括常规的包、软件、系统版本、系统内核)更新至软件…

如何使用ArcGIS加载历史影像

历史影像对研究地物的变化可以产生很直观的效果&#xff0c;Esri提供了在线浏览的历史影像&#xff0c;这里给大家介绍一下如何将这个历史影像加载到ArcGIS&#xff0c;希望能对你有所帮助。 获取地图链接 打开地图网站&#xff08;https://livingatlas.arcgis.com/wayback/&a…

【MySQL】复合查询(重点)

&#x1f3e0; 大家好&#xff0c;我是 兔7 &#xff0c;一位努力学习C的博主~&#x1f4ac; &#x1f351; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f680; 如有不懂&#xff0c;可以随时向我提问&…

实验篇(7.2) 13. 创建点对点安全隧道 (二)(FortiGate-IPsec) ❀ 远程访问

【简介】上一篇实验发现&#xff0c;两端都是可以远程的公网IP的话&#xff0c;两端防火墙都可以发出连接请求&#xff0c;并且都能够连通。这样的好处是安全隧道不用随时在线&#xff0c;只在有需求时才由发起方进行连接。但是现实中很多情况下只有一端公网IP可以远程&#xf…

番外篇 离线服务器环境配置与安装

&#xff08;离线远程服务器的Anaconda安装与卸载torch的安装与卸载&#xff09; 我参考或百度一些博主发的经验贴关于Anaconda的安装与卸载等教程&#xff0c;但实际情况是每一个服务器遇到的问题多多少少总有不一样的地方&#xff0c;虽然可以借鉴&#xff0c;但不能完全照搬…

常见Visual Studio Code 快捷键

一&#xff0c;文件与窗口快捷键&#xff1a; 1.打开一个新窗口&#xff1a; CtrlShiftN 2.关闭窗口&#xff1a; CtrlShiftW 3.文件切换&#xff1a;CtrlTab 4.快速打开文件&#xff1a;CtrlP 5.新建文件&#xff1a; CtrlN 6.切换侧边栏&#xff1a;CtrlB 7.选中单个文…