Alibaba-Easyexcel 使用总结

简介

简介

EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目,在尽可能节约内存的情况下支持读写百 M 的 Excel。

但注意,其不支持:

  • 单个文件的并发写入、读取
  • 读取图片

常见问题

Excel 术语

  • Sheet,工作薄。

    在这里插入图片描述

  • Row,行,第一行索引从 0 开始。

  • Column,列,第一列索引从 0 开始。

    在这里插入图片描述

  • Cell,单元格。

    在这里插入图片描述

项目准备

新建 Maven 项目,如下配置:

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target>
</properties><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version><scope>provided</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>

读 Excel

简单读取

准备如下 excel 文件。

在这里插入图片描述

编写数据类,用来对从 Excel 文件读取到文件内容进行封装。

@Data
public class PersonData {private Long id;private Date birthday;private String name;
}

编写读取代码,使用 EasyExcel 提供 API 读取 Excel 文件内容。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

// 不要求:JDK8+
// 不用额外写一个 XxxListener,直接用内置 ReadListener
@Test
public void read() {String fileName = "Excel 文件路径";// 这里需要指定读用哪个 class 去读,然后读取第一个 sheet 文件流会自动关闭EasyExcel.read(fileName, PersonData.class, new ReadListener<PersonData>() {/*** 单次缓存的数据量*/private static final int BATCH_COUNT = 100;/*** 临时存储*/private List<PersonData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);@Overridepublic void invoke(PersonData data, AnalysisContext context) {cachedDataList.add(data);if (cachedDataList.size() >= BATCH_COUNT) {printData();// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {printData();}/*** 打印数据*/private void printData() {for (PersonData personData : cachedDataList) {System.out.println(personData);}}}).sheet().doRead();
}// 要求:JDK8+,EasyExcel since:3.0.0-beta1
// 不用额外写一个 XxxListener,直接用内置 PageReadListener
@Test
public void read() {String fileName = "Excel 文件路径";// 这里 需要指定读用哪个 class 去读,然后读取第一个 sheet 文件流会自动关闭// 这里每次会读取 100 条数据 然后返回过来 直接调用使用数据就行EasyExcel.read(fileName, PersonData.class, new PageReadListener<PersonData>(dataList -> {dataList.forEach(System.out::println);})).sheet().doRead();
}

指定列的下标或者列名

默认情况 EasyExcel 是根据两个规则封装数据:一个是根据 Excel 中列的顺序与对象字段的顺序一致;另一个是根据 Excel 列的的单元格式与对象字段类型匹配。但开发者可以使用注解 @ExcelProperty,指定封装规则。

@Data
public class PersonData {@ExcelProperty(index = 1) // 指定读取的下标,下标默认从 0 开始。这里不建议 index 和 name 同时用,要么一个对象只用 index,要么一个对象只用 name 去匹配private Long id;@ExcelProperty("出生日期") // 指定读取的列名private Date birthday;@ExcelProperty("姓名") // 指定读取的列名private String name;
}

数据转换等异常处理:onException

读取时抛出异常,则代码会停止。若在监听器中重写处理异常的方法,则代码还会正常执行,继续读取其他行的数据。

准备如下 excel 文件。

在这里插入图片描述

编写读取代码。

@Test
public void read() {String fileName = "Excel 文件路径";EasyExcel.read(fileName, PersonData.class, new ReadListener<PersonData>() {/*** 单次缓存的数据量*/private static final int BATCH_COUNT = 100;/*** 临时存储*/private List<PersonData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);// 读取时出现异常会执行如下方法,并且不导致读取操作终止public void onException(Exception exception, AnalysisContext context) {// 打印异常System.out.println(exception.getMessage());}@Overridepublic void invoke(PersonData data, AnalysisContext context) {cachedDataList.add(data);if (cachedDataList.size() >= BATCH_COUNT) {printData();// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {printData();}/*** 打印数据*/private void printData() {for (PersonData personData : cachedDataList) {System.out.println(personData);}}}).sheet().doRead();
}

读多个 sheet

先准备好如下 Excel 文件。

在这里插入图片描述

编写读取代码。

// 读多个或者全部 sheet,这里注意一个 sheet 不能读取多次,多次读取需要重新读取文件//----------------------------读取全部 sheet---------
@Test
public void read() {String fileName = "Excel 文件路径";// 读取全部 sheet// PageReadListener 的 doAfterAllAnalysed 会在每个 sheet 读取完毕后调用一次。EasyExcel.read(fileName, PersonData.class, new PageReadListener<PersonData>(dataList -> {dataList.forEach(System.out::println);})).doReadAll();// ---------------------读取指定或者所有 sheet----------------------------try (ExcelReader excelReader = EasyExcel.read(fileName).build()) {//创建读的工作簿对象ReadSheet readSheet1 = EasyExcel.readSheet(0).head(PersonData.class).registerReadListener(new PageReadListener<PersonData>(dataList -> {dataList.forEach(System.out::println);})).build();ReadSheet readSheet2 = EasyExcel.readSheet(1).head(PersonData.class).registerReadListener(new PageReadListener<PersonData>(dataList -> {dataList.forEach(System.out::println);})).build();// 这里注意 一定要把工作簿一起传进去,不然有个问题就是 03 版的 Excel 会读取多次,浪费性能excelReader.read(readSheet1, readSheet2);}
}// --------------------指定读取某个 sheet------------------------------
@Test
public void read() {String fileName = "Excel 文件路径";EasyExcel.read(fileName, PersonData.class, new PageReadListener<PersonData>(dataList -> {dataList.forEach(System.out::println);})).sheet(0).doRead();EasyExcel.read(fileName, PersonData.class, new PageReadListener<PersonData>(dataList -> {dataList.forEach(System.out::println);})).sheet(1).doRead();
}

日期、数字或者自定义格式转换

先准备好如下 Excel 文件。

在这里插入图片描述

1、编写自定义转换器。

public class CustomStringStringConverter implements Converter<String> {// 支持 Java 的类型 @Overridepublic Class<?> supportJavaTypeKey() {return String.class;}// 支持 Excel 单元格类型@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}/*** 当读到的数据符合类型,封装的字段也符合类型,按照下面方法转换数据* 这么转换,是由开发者在方法中重写* @param context* @return*/@Overridepublic String convertToJavaData(ReadConverterContext<?> context) {//context.getReadCellData().getStringValue(): 是原本的数据 return "大神:" + context.getReadCellData().getStringValue();}/*** 这里是写的时候会调用*  当读到的数据符合类型,封装的字段也符合类型,按照下面方法转换数据*  这么转换,是由开发者在方法中重写* @return*/@Overridepublic WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) {return new WriteCellData<>(context.getValue());}}

2、通过注解

编写数据类。

@Data
public class PlayerData {@ExcelProperty(converter = CustomStringStringConverter.class)//----------->转换器private String name;@DateTimeFormat("yyyy年MM月dd日")private Date birthday;private BigDecimal bf;
}

在这里插入图片描述

编写读取代码。

在这里插入图片描述

@Test
public void read() {String fileName = "Excel 文件路径";// 这里需要指定读用哪个 class 去读,然后读取第一个 sheet 文件流会自动关闭// 这里每次会读取 100 条数据 然后返回过来 直接调用使用数据就行EasyExcel.read(fileName, PlayerData.class, new PageReadListener<PlayerData>(dataList -> {dataList.forEach(System.out::println);}))// 如果就想单个字段使用请使用 @ExcelProperty 指定 converter// .registerConverter(new CustomStringStringConverter()).sheet().doRead();
}

指定行读取

默认情况下 EasyExcel 从第 1 行(0 行是列头)读取。把上面测试代码修改如下进行测试。

@Test
public void read() {String fileName = "Excel 文件路径";EasyExcel.read(fileName, PlayerData.class, new PageReadListener<PlayerData>(dataList -> {dataList.forEach(System.out::println);})).sheet().headRowNumber(2) // 手动指定从从第 2 行读取.doRead();
}

写 Excel

简单写入

修改数据类。

@Data
public class PersonData {private Long id;private Date birthday;private String name;private String ignore;public PersonData() {}public PersonData(Long id, Date birthday, String name) {this.id = id;this.birthday = birthday;this.name = name;}
}

编写模拟提供数据类。

public class PersonMock {public static List<PersonData> data() {return Arrays.asList(new PersonData(1L, new Date(), "刘备"),new PersonData(2L, new Date(), "关羽"),new PersonData(3L, new Date(), "张飞"),new PersonData(4L, new Date(), "赵云"),new PersonData(5L, new Date(), "诸葛亮"),new PersonData(6L, new Date(), "黄忠"),new PersonData(7L, new Date(), "魏延"),new PersonData(8L, new Date(), "庞统"),new PersonData(9L, new Date(), "法正"),new PersonData(10L, new Date(), "黄权"));}
}

编写写入代码。

// 注意在数据量不大的情况下可以使用(5000 以内,具体也要看实际情况),数据量大请参照后面重复多次写入
@Test
public void write() {// 写法 1,要求:JDK8+,EasyExcel since:3.0.0-beta1String fileName = "Excel 文件路径";// 这里需要指定写用哪个 class 去写,然后写到第一个 sheet,工作薄名字为模板,然后文件流会自动关闭EasyExcel.write(fileName, PersonData.class).sheet("模板").doWrite(PersonMock::data);//这才是真正的写入// 写法 2// 这里需要指定写用哪个 class 去写try (ExcelWriter excelWriter = EasyExcel.write(fileName, PersonData.class).build()) {WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();excelWriter.write(PersonMock::data, writeSheet);}
}

效果如下:

在这里插入图片描述

指定写入的列(忽略某个列)

方式 1:修改数据类,使用注解 @ExcelIgnore。

@Data
public class PersonData {private Long id;private Date birthday;private String name;/*** 忽略这个字段*/// @ExcelIgnoreprivate String ignore;public PersonData() {}public PersonData(Long id, Date birthday, String name) {this.id = id;this.birthday = birthday;this.name = name;}
}

效果如下:

在这里插入图片描述

方式 2:修改测试代码。

@Test
public void write() {String fileName = "Excel 文件路径";Set<String> excludeColumnFieldNames = new HashSet<>();excludeColumnFieldNames.add("birthday");EasyExcel.write(fileName, PersonData.class).excludeColumnFieldNames(excludeColumnFieldNames) // 指定写入时排除哪些列.sheet("模板").doWrite(PersonMock::data);
}

效果如下:

在这里插入图片描述

指定写入时包含哪些列

@Test
public void write() {String fileName = "Excel 文件路径";Set<String> includeColumnFieldNames = new HashSet<>();includeColumnFieldNames.add("id");includeColumnFieldNames.add("name");EasyExcel.write(fileName, PersonData.class).includeColumnFieldNames(includeColumnFieldNames) // 指定写入时包含哪些列.sheet("模板").doWrite(PersonMock::data);
}

效果如下:
在这里插入图片描述

指定写入列名及顺序

修改数据类,使用 @ExcelProperty 注解指定写入时的列名和顺序。

@Data
public class PersonData {@ExcelProperty(value = "id", index = 1) // 这个注解可以指定读写时的列名及顺序private Long id;@ExcelProperty(value = "出生日期", index = 3)private Date birthday;@ExcelProperty(value = "姓名", index = 2)private String name;public PersonData() {}public PersonData(Long id, Date birthday, String name) {this.id = id;this.birthday = birthday;this.name = name;}
}

编写写入代码。

@Test
public void write() {String fileName = "Excel 文件路径";EasyExcel.write(fileName, PersonData.class).sheet("模板").doWrite(PersonMock::data);
}

效果如下:

在这里插入图片描述

复杂头写入

修改数据类。

@Data
public class PersonData {@ExcelProperty({"蜀国", "id"}) // 第一个主列名,第二次级列名private Long id;@ExcelProperty({"蜀国", "出生日期"})private Date birthday;@ExcelProperty({"蜀国", "姓名"})private String name;public PersonData() {}public PersonData(Long id, Date birthday, String name) {this.id = id;this.birthday = birthday;this.name = name;}
}

编写写入代码。

@Test
public void write() {String fileName = "Excel 文件路径";EasyExcel.write(fileName, PersonData.class).sheet("模板").doWrite(PersonMock::data);
}

效果如下:

在这里插入图片描述

重复多次写入

支持单个 sheet 多次写入,或者支持写多个 sheet。

往一个 sheet 多次写入,写入代码如下:

@Test
public void write() {String fileName = "Excel 文件路径";try (ExcelWriter excelWriter = EasyExcel.write(fileName, PersonData.class).build()) {// 注意若同一个 sheet 只要创建一次WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();// 调用 2 次写入,实际使用时根据数据库分页的总的页数来for (int i = 0; i < 2; i++) {// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<PersonData> data = PersonMock.data();excelWriter.write(data, writeSheet);}}
}

效果如下:

在这里插入图片描述

往多个 sheet 写入相同数据

写入代码如下:

@Test
public void write() {String fileName = "Excel 文件路径";try (ExcelWriter excelWriter = EasyExcel.write(fileName, PersonData.class).build()) {for (int i = 0; i < 2; i++) {// 每次都要创建 writeSheet,需要指定 sheet 缩影,而且 sheet 名称必须不一样WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();// 写入数据excelWriter.write(PersonMock.data(), writeSheet);}}
}

效果如下:

在这里插入图片描述

往多个 sheet 写入不同数据

修改数据类。

@Data
public class PlayerData {private String name;private Date birthday;private BigDecimal bf;public PlayerData() { }public PlayerData(String name, Date birthday, BigDecimal bf) {this.name = name;this.birthday = birthday;this.bf = bf;}
}

编写模拟提供数据类。

public class PlayerMock {public static List<PlayerData> data() {return Arrays.asList(new PlayerData("C罗", new Date(), new BigDecimal("0.07")),new PlayerData("乔丹", new Date(), new BigDecimal("0.03")));}
}

编写写入代码。

public void write5() {String fileName = "Excel 文件路径";try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {// 向第一个 sheet 写入 PersonData 类型的数据WriteSheet writeSheet0 = EasyExcel.writerSheet(0, "蜀国").head(PersonData.class) // 设置第一行列标题,列头.build();excelWriter.write(PersonMock.data(), writeSheet0);// 向第二个 sheet 写入 PlayerData 类型的数据WriteSheet writeSheet1 = EasyExcel.writerSheet(1, "运动员").head(PlayerData.class) // // 设置第一行列标题.build();excelWriter.write(PlayerMock.data(), writeSheet1);}
}

效果如下:

在这里插入图片描述

日期、数字或者自定义格式转换

编写自定义转换器。

public class CustomStringStringConverter implements Converter<String> {@Overridepublic Class<?> supportJavaTypeKey() {return String.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}/*** 这里读的时候会调用:前面有** @param context* @return*/@Overridepublic String convertToJavaData(ReadConverterContext<?> context) {return "大神:" + context.getReadCellData().getStringValue();}/*** 这里是写的时候会调用*  当读到的数据符合类型,封装的字段也符合类型,按照下面方法转换数据*  这么转换,是由开发者在方法中重写* @return*/@Overridepublic WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) {return new WriteCellData<>("大神:" + context.getValue());}}

修改数据类,使用注解指定转换格式。

@Data
public class PlayerData {@ExcelProperty(converter = CustomStringStringConverter.class)//------------>转换器private String name;@DateTimeFormat("yyyy年MM月dd日")private Date birthday;@NumberFormat("#.##%")private BigDecimal bf;public PlayerData() { }public PlayerData(String name, Date birthday, BigDecimal bf) {this.name = name;this.birthday = birthday;this.bf = bf;}
}

编写写入的代码。

@Test
public void write() {String fileName = "Excel 文件路径";EasyExcel.write(fileName, PlayerData.class).sheet("模板").doWrite(PlayerMock::data);
}

效果如下:

在这里插入图片描述

指定列宽行高

修改数据类,使用注解指定列宽、行高。

@Data
@HeadRowHeight(30) // 指定列头行高度
@ContentRowHeight(20) // 指定内容行高度
@ColumnWidth(25) // 指定列宽
public class PlayerData {private String name;private Date birthday;private BigDecimal bf;public PlayerData() { }public PlayerData(String name, Date birthday, BigDecimal bf) {this.name = name;this.birthday = birthday;this.bf = bf;}
}

编写写入的代码。

@Test
public void write() {String fileName = "Excel 文件路径";EasyExcel.write(fileName, PlayerData.class).sheet("模板").doWrite(PlayerMock::data);
}

效果如下:

在这里插入图片描述

Web 环境导入导出

项目准备

新建 Spring Boot 项目,添加如下依赖:

<properties><java.version>1.8</java.version>
</properties>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency>
</dependencies>

把上面项目的的数据类 PersonData 和提供模拟数据类 PersonMock 拷贝到这个项目。

导出

所谓导出,就把后端数据库中数据,通过网络已 Excel 文件形式下载到客户端。

@GetMapping("/export")
public void exportExcel(HttpServletResponse response) throws IOException {response.setHeader("Content-disposition", "attachment;filename=person.xlsx");EasyExcel.write(response.getOutputStream(), PersonData.class).sheet("模板").doWrite(PersonMock::data);
}

导入

所谓导入,就把客户端 Excel 文件上传到后端,后端通过代码读取 Excel 文件的数据存入到数据库中。

@PostMapping("/import")
@ResponseBody
public String importExcel(MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), PersonData.class, new PageReadListener<PersonData>((dataList) -> {dataList.forEach(System.out::println);})).sheet().doRead();return "success";
}@PostMapping("/import")
@ResponseBody
public String importExcel(MultipartFile file) throws IOException {// 同步读取(适合数据量小)List<Object> objects = EasyExcel.read(file.getInputStream()).head(PersonData.class).sheet().doReadSync();for (Object object : objects) {System.out.println(object);}return "success";
}

其他

ExcelExcel 构建体系

在这里插入图片描述

  • EasyExcel 继承 EasyExcelFactory,只是为给开发者用更短的名字
  • EasyExcelFactory 工厂类,主要用来创建 ExcelReaderBuilder、ExcelReaderSheetBuilder 和 ExcelWriterBuilder、ExcelWriterSheetBuilder 对象。
  • ExcelReaderBuilder,应用了 Bulider Pattern 模式,用来按照步骤一步步构建 ExcelReader 对象,也可以用来创建 ExcelReaderSheetBuilder 对象。
  • ExcelReaderSheetBuilder,用来调用 ExcelReader 对象中方法。
  • ExcelReader,用来对 Excel 文件进行读取操作。
  • ExcelWriterBuilder,应用了 Bulider Pattern 模式,用来按照步骤一步步构建 ExcelWriter 对象,也可以用来创建 ExcelWriterSheetBuilder 对象。
  • ExcelWriterSheetBuilder,用来调用 ExcelWriter 对象中方法。
  • ExcelWriter,用来对 Excel 文件进行写入操作。

Listener 体系

在这里插入图片描述

  • Listener 接口,里面没有任何方法。
  • ReadListener 接口,我们在使用 EasyExcel API 读取 excel 文件内容时,需要使用到这个类型的对象,并根据需求重写其中两个方法:
    • void invoke(T data, AnalysisContext context),每一条数据解析都会来调用这个方法;
    • void doAfterAllAnalysed(AnalysisContext context),所有数据解析完成了会来调用这个方法。
  • PageReadListener 接口,是对上面接口改造成 lambda 风格,让开发者使用便捷。

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

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

相关文章

Pyqt5-开源工具分解功能(文本拖拽)

开源第四篇:功能实现之拖拽功能与配置文件。 写这个功能的初衷,是因为,每次调试我都要手动敲命令,太麻烦了,想偷个懒,所以直接给这功能加上了,顺便衍生出了另一个想法,配置文件自动填写相关数据。 先看个简单的拖拽功能: 很明显吧,还是比较便捷的。所以我们本章,就在…

基于PaddlePaddle实现的声纹识别系统

前言 本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM等多种先进的声纹识别模型&#xff0c;不排除以后会支持更多模型&#xff0c;同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法&#xff0c;使用了ArcFace Loss&#xff0c;ArcFace loss…

智能电视与win10电脑后续无法实现DLNA屏幕共享

问题背景&#xff1a; 我用的是TCL电视&#xff0c;但是并不是最新&#xff0c;打开的方式是U盘->电脑&#xff0c;各位看自己情况&#xff0c;很多问题都大概率是智能电视问题。 情景假设&#xff1a; 假设你已经完成原先智能电视该有的步骤&#xff0c;通过DLNA&#xf…

蓝牙运动耳机哪款好、运动耳机性价比推荐

近年来&#xff0c;运动蓝牙耳机备受欢迎&#xff0c;成为人们健身时的必备时尚单品。随着蓝牙耳机的不断发展&#xff0c;市场上可供选择的产品种类繁多&#xff0c;因此挑选一款适合自己的蓝牙耳机并不困难。然而&#xff0c;并非每款耳机都适合户外或者运动场景下的使用&…

Lua与C++交互(一)————堆栈

Lua与C交互&#xff08;一&#xff09;————堆栈 Lua虚拟机 什么是Lua虚拟机 Lua本身是用C语言实现的&#xff0c;它是跨平台语言&#xff0c;得益于它本身的Lua虚拟机。 虚拟机相对于物理机&#xff0c;借助于操作系统对物理机器&#xff08;CPU等硬件&#xff09;的一…

6-3 使用函数输出水仙花数

分数 20 全屏浏览题目 切换布局 作者 张高燕 单位 浙大城市学院 水仙花数是指一个N位正整数&#xff08;N≥3&#xff09;&#xff0c;它的每个位上的数字的N次幂之和等于它本身。例如&#xff1a;153135333。 本题要求编写两个函数&#xff0c;一个判断给定整数是否水仙花数…

开源数据库Mysql_DBA运维实战 (总结)

开源数据库Mysql_DBA运维实战 &#xff08;总结&#xff09; SQL语句都包含哪些类型 DDL DCL DML DQL Yum 安装MySQL的配置文件 配置文件&#xff1a;/etc/my.cnf日志目录&#xff1a;/var/log/mysqld.log错误日志&#xff1a;/var/log/mysql/error.log MySQL的主从切换 查看主…

安装Ubuntu服务器、配置网络、并安装ssh进行连接

安装Ubuntu服务器、配置网络、并安装ssh进行连接 1、配置启动U盘2、配置网络3、安装ssh4、修改ssh配置文件5、重启电脑6、在远程使用ssh连接7、其他报错情况 1、配置启动U盘 详见: U盘安装Ubuntu系统详细教程 2、配置网络 详见&#xff1a;https://blog.csdn.net/davidhzq/a…

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及FileSystem示例(1)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

linux-进程

文章目录 1.先谈硬件冯诺依曼体系结构 2.再谈软件操作系统什么是操作系统&#xff1f;为什么要有操作系统&#xff1f;如何管理&#xff1f;系统调用 3.再谈进程那么具体Linux是怎么做的?指令 ps ajx 查看所有进程 非实时top 实时查看进程 相当于任务管理器ls /proc 内存级进程…

Linux命令200例:tar命令主要用于创建、查看和提取归档文件(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

idea 左下角的Git(Version Control)中显示Local Changes窗口

打开Local Changes窗口来查看当前Git仓库的本地变更。 使用快捷键: - Windows: Alt9 - Mac: Cmd9 解决&#xff1a; &#xff08;1&#xff09;idea打开settings &#xff08;2&#xff09;点击Version Control窗口选项卡&#xff0c;选择Commit选项&#xff0c;对 Use.... in…

STM32使用定时器实现微秒(us)级延时

STM32使用定时器实现微秒&#xff08;us&#xff09;级延时 引言前期准备介绍系统时钟定时器时钟 项目项目介绍STM32CubeMX程序 引言 目前开发STM32普遍使用HAL库&#xff0c;但 HAL 库封装的延时函数目前仅支持 ms 级别的延时&#xff0c;日常很多情况下会用到 us 延时&#…

字符设备驱动实例(PWM和RTC)

目录 五、PWM 六、RTC 五、PWM PWM(Pulse Width Modulation&#xff0c;脉宽调制器)&#xff0c;顾名思义就是一个输出脉冲宽度可以调整的硬件器件&#xff0c;其实它不仅脉冲宽度可调&#xff0c;频率也可以调整。它的核心部件是一个硬件定时器&#xff0c;其工作原理可以用…

Midjourney API 国内申请及对接方式

在人工智能绘图领域&#xff0c;想必大家听说过 Midjourney 的大名吧&#xff01; Midjourney 以其出色的绘图能力在业界独树一帜。无需过多复杂的操作&#xff0c;只要简单输入绘图指令&#xff0c;这个神奇的工具就能在瞬间为我们呈现出对应的图像。无论是任何物体还是任何风…

8月18日上课内容 Haproxy搭建Web群集

本章结构 课程大纲 Haproxy调度算法 常见的web集群调度器 目前常见的Web集群调度器分为软件和硬件软件 通常使用开源的LVS、Haproxy、Nginx 硬件一般使用比较多的是F5&#xff0c;也有很多人使用国内的一些产品&#xff0c;如梭子鱼、绿盟等 Haproxy应用分析 LVS在企业应用中…

两两交换链表中的节点

你存在&#xff0c;我深深的脑海里~ 题目&#xff1a; 示例&#xff1a; 思路&#xff1a; 这个题有点类似于反转一个单链表&#xff0c;不同的地方在于这个题不全反转&#xff0c;所以我们不同的地方在于此题多用了一个prve指针保存n1的前一个节点&#xff0c;以及头的改变&a…

什么是KNN( K近邻算法)

什么是KNN( K近邻算法) 虽然名字中有NN&#xff0c;KNN并不是哪种神经网络&#xff0c;它全名K-Nearest-Neighbors&#xff1a;K近邻算法&#xff0c;是机器学习中常用的分类算法。 物以类聚&#xff0c;人以群分。KNN的基础思想很简单&#xff0c;要判断一个新数据的类别&…

Lucky player —— Java 项目(Spring Boot)

一、项目介绍 项目名称&#xff1a;lucky player 项目的主要功能&#xff1a;本系统主要功能为构建了一个用户分享音乐的平台&#xff0c;普通用户不进行登录即可收听其他用户已经发布的专辑中的音乐。 作为博主则可以在该平台上传音频&#xff0c;以及在线音频录制上传。音频上…

MySQL数据库中间件Mycat介绍及下载安装(教程)

一&#xff0c;介绍 MyCat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用MySQL一样来使用MyCat&#xff0c;对于开发人员来说根本感觉不到MyCat的存在。 开发人员只需要连接MyCat即可&#xff0c;而具体底层用到几台数据库&#xff0c;每一台数据库服务器…