编辑
2024-04-25
遇到的问题
00

前提

业务需要,得通过javaweb下载用户的个人信息的pdf,多个人批量下载时就需要将pdf文件存放在zip类型中,但是下载得到的文件解压时提示错误,里面的文件大小为空

排查

首先,生成zip文件时服务器并未提示,系统错误,导致的文件异常,上网查找发现,可能是流未关闭的问题,然后我使用的是try(reason) catch的方式,流会自动关闭 代码如下

java
try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream zipOut = new ZipOutputStream(baos)) { // 遍历文件数据列表,将每个byte数组添加为zip条目 for (int i = 0; i < fileDataList.size(); i++) { byte[] fileData = JSON.toJSONBytes(fileDataList.get(i).get("bytes")); String entryName = (String) fileDataList.get(i).get("fileName"); ZipEntry zipEntry = new ZipEntry(entryName); zipOut.putNextEntry(zipEntry); zipOut.write(fileData); zipOut.closeEntry(); } zipOut.flush(); baos.flush(); // 设置HTTP响应头 response.setContentType("application/zip"); String fileName = String.format("%s_%s_全病案_%s.zip", province, name, DateUtil.format(new Date(), "yyyyMMdd")); response.setHeader("Content-Disposition", "attachment; filename=" + fileName); // 将zip数据写入响应流 IoUtil.copy(new ByteArrayInputStream(baos.toByteArray()), response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); }

深入挖掘

自动关闭流是在整个业务流程走完之后才会一一关闭流,但是zipout这个流使用完毕之后就需要立即关闭, 即在 zipOut.flush();之后就需要关闭

修改代码后就不会提示了

java
try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream zipOut = new ZipOutputStream(baos)) { // 遍历文件数据列表,将每个byte数组添加为zip条目 for (int i = 0; i < fileDataList.size(); i++) { byte[] fileData = JSON.toJSONBytes(fileDataList.get(i).get("bytes")); String entryName = (String) fileDataList.get(i).get("fileName"); ZipEntry zipEntry = new ZipEntry(entryName); zipOut.putNextEntry(zipEntry); zipOut.write(fileData); zipOut.closeEntry(); } zipOut.flush(); zipOut.close(); baos.flush(); // 设置HTTP响应头 response.setContentType("application/zip"); String fileName = String.format("%s_%s_全病案_%s.zip", province, name, DateUtil.format(new Date(), "yyyyMMdd")); response.setHeader("Content-Disposition", "attachment; filename=" + fileName); // 将zip数据写入响应流 IoUtil.copy(new ByteArrayInputStream(baos.toByteArray()), response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); }
编辑
2024-04-25
学习记录
00

原因

现场服务可能会出现Redis服务异常的问题,每次使用redis之前都需要对redis进行连通性判断

代码

java
//判断redis是否可用 public boolean isPing(){ try { RedisConnection connection = redisTemplate.getConnectionFactory().getConnection(); String response = connection.ping(); return "PONG".equals(response); } catch (Exception e) { log.error(e.getMessage) return false; } }
编辑
2024-04-23
学习记录
00

前提

mybatisPlus更新时,如果想让一个字段为空,实体类字段设置为null时,mybatisPlus默认会直接忽略这个字段的内容,就是不会把空值更新到数据库中,避免出现问题。

解决方法

修改MybatisPlus全局配置

application.yml文件修改配置,但是不推荐,每次使用实体类更新时都需要把所有字段的内容都填上,不然就会出现空值替换的问题

yml
mybatis-plus: global-config: #字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断" field-strategy: 0

使用条件构造器

java
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.set(User::getName,null); userMapper.updateById(null,updateWrapper)

实体类属性加注解

这个问题和全局配置一样,使用时需要非常的小心

//不忽略null @TableField(strategy = FieldStrategy.IGNORED) private Integer keyStroke; //键盘快捷键

手动编写更新sql

在mapper.xml,编写更新sql

UPDATE REC_TYPE_DICT SET key_stroke=? WHERE id=?
编辑
2024-04-12
学习记录
00

说明

在Oracle中,物化视图(Materialized View)是一种预计算并存储查询结果的数据库对象,常用于提高复杂查询的性能。物化视图与普通视图不同,它实际上存储了数据,因此可以快速响应查询请求。

以下是创建和使用物化视图的基本步骤:

创建物化视图:使用CREATE MATERIALIZED VIEW语句来创建物化视图,并指定要查询的表和列以及WHERE子句(如果需要)。

刷新物化视图:物化视图需要定期刷新以保持数据的准确性。可以使用DBMS_REFRESH包或DBMS_SNAPSHOT包来管理刷新过程。

使用物化视图:在SQL查询中像使用普通表一样使用物化视图。

删除物化视图:如果不再需要物化视图,可以使用DROP MATERIALIZED VIEW语句将其删除。

编辑
2024-04-07
学习记录
00

前提

有时候使用Ipage包裹对象后,需求有要求我们返回另外的内容,比如返回查询列表的同时,还需要返回当前的出院总人数

解决方式:

  • 返回对象改成Map或者在外面套一个新的对象,新对象属性有两个,一个是Ipage<t>,另外的就是出院总人数
  • 新增一个出院总人数的接口、前端调用原来的接口以及新的接口
  • 自定义一个Ipage,在自定义的分页对象里面,新增一个出院总人数的属性

先继承mybatis自带的Ipage

java
public interface IDisPage<T> extends IPage<T> { IPage<T> setDisCount(Integer count); //get方法很重要,缺少get方法,会忽略掉这个新增结果 Integer getDisCount(); }