SpringBoot项目-实现简单的CRUD功能和分页查询
背景
本博文主要是创建了一个新的SpringBoot项目,实现基本的增删改查,分页查询,带条件的分页查询功能。是方便初学者学习后端项目的一个比较清晰明了的实践代码,读者可根据博文,从自己动手创建一个新的SpringBoot项目,到使用PostMan测试基本请求,完完全全实践一遍,写出自己的代码,或者实现自己想要的功能。因为在这个过程中会遇到许多的问题,从JDK的版本选择到跑通SpringBoot项目,最后到成功发起一个请求。所以,最好是自己练习一下,最终做到游刃有余。
环境的安装
本次SpringBoot项目主要用到,一是IDEA,二是MYSQL(服务端),三是DBeaver(一个数据库的客户端),四是PostMan(用于发送HTTP请求)。
建议读者先按照MYSQL包,再按照DBeaver, 调通数据库以后,再开始编写项目。
另外就是在一开始建立一个数据库的时候,这里不要写具体的名称。数据库连接以后,再定义具体的数据库名,mydatabase
我们本次的建表语句如下:
-- mydatabase.student_info definition | |
CREATE TABLE `student_info` ( | |
`id` int NOT NULL AUTO_INCREMENT, | |
`name` varchar(100) CHARACTER SET utf8mb3 NOT NULL DEFAULT '""', | |
`address` varchar(100) CHARACTER SET utf8mb3 NOT NULL, | |
`other` varchar(100) CHARACTER SET utf8mb3 NOT NULL, | |
`age` int NOT NULL, | |
PRIMARY KEY (`id`) | |
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=macce; |
建好表以后,往表中添加如下示例数据。添加好的表数据如下

创建一个新的SpringBoot项目
1、新建一个project;
这边我们使用maven管理依赖,maven的依赖管理目录可以单独设置一个空目录,自己比较好找到的目录,有时候依赖下载失败,需要从这个目录中删除一些依赖文件;目录的设置可在项目生成以后在IDEA中进行设置。然后jdk的版本有8 就选择8, 没有的话,这里随便选一下,后面编译的时候,可以在IDEA中重新设置。

点击下一步,可以设置SpringBoot的版本。以及要在pom中引入哪些依赖包,方便我们后续写代码的时候调用。我这边简单选了几个,如果还有要使用的依赖,直接勾选就行,或者项目建好后手动在pom添加也可以。

,
点击create, 并使用new windows打开,就得到一个新的SpringBoot项目。接下来就等待依赖下载成功,下载成功以后,maven的目录是这样的。本次项目的pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?> | |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | |
<modelVersion>4.0.0</modelVersion> | |
<parent> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-parent</artifactId> | |
<version>2.5.6</version> | |
<relativePath/> <!-- lookup parent from repository --> | |
</parent> | |
<groupId>com.example</groupId> | |
<artifactId>demo3</artifactId> | |
<version>0.0.1-SNAPSHOT</version> | |
<name>demo3</name> | |
<description>demo3</description> | |
<url/> | |
<licenses> | |
<license/> | |
</licenses> | |
<developers> | |
<developer/> | |
</developers> | |
<scm> | |
<connection/> | |
<developerConnection/> | |
<tag/> | |
<url/> | |
</scm> | |
<properties> | |
<java.version>8</java.version> | |
</properties> | |
<dependencies> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-data-jpa</artifactId> | |
</dependency> | |
<dependency> | |
<groupId>mysql</groupId> | |
<artifactId>mysql-connector-java</artifactId> | |
</dependency> | |
<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>com.h2database</groupId> | |
<artifactId>h2</artifactId> | |
<scope>runtime</scope> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-test</artifactId> | |
<scope>test</scope> | |
</dependency> | |
</dependencies> | |
</project> | |
配置文件 application.yml
配置文件中的数据库的用户名和密码都要和你实际进行数据库连接时配置的一样,url也是如此。
server.port: 8088 是tomcat的端口号。
com.mysql.cj.jdbc.Driver是一个驱动类,是MySQL Connector 驱动程序中的 JDBC 驱动类,用于在 Java 应用程序中建立与 MySQL 数据库的连接。 一旦建立了连接,JDBC 驱动类允许 Java 应用程序执行 SQL 查询、更新和其他数据库操作。应用程序可以使用 JDBC API 与数据库进行通信,发送和接收数据。JDBC 驱动类还支持事务管理。Java 应用程序可以使用 JDBC API 开启、提交或回滚事务,确保数据库操作的原子性、一致性、隔离性和持久性(ACID 属性)。在发生错误或异常时,驱动类也会生成适当的异常,应用程序可以捕获并处理这些异常。
加载驱动类是建立连接和执行数据库操作的第一步!
url 指的是数据库连接的 URL,它用于指定要连接的数据库的位置和其他连接参数,localhost指的是本地的主机名,3306是mysql的默认端口号。mydatabase是要连接的数据库的名称。应用程序和数据库通信,首先会通过该url建立连接,不过root和password需要和数据库连接配置中严格一致,否则会连不到数据库。
有关hibernate 的这段配置意味着通过 JPA 和 Hibernate 配置了禁用自动 DDL(Data Definition Language)生成、打印执行的SQL语句到控制台,以及指定了 Hibernate 使用的 MySQL 数据库方言是 MySQL 5 的 InnoDB 存储引擎方言。use_jdbc_metadata_defaults参数当设置为 false 时,Hibernate 将不使用 JDBC 元数据的默认设置。
重点说明一下ddl-auto, 等于none是指Hibernate 不会尝试自动创建、更新或删除数据库表结构。
server.port: 8088 | |
spring: | |
datasource: | |
driver-class-name: com.mysql.cj.jdbc.Driver | |
username: root | |
password: 123456 | |
url: jdbc:mysql://localhost:3306/mydatabase | |
jpa: | |
hibernate: | |
ddl-auto: none | |
show-sql: true | |
properties: | |
hibernate: | |
temp: | |
use_jdbc_metadata_defaults: false | |
dialect: org.hibernate.dialect.MySQL5InnoDBDialect | |
业务代码
在Web后端应用程序中,Controller主要接收来自用户的请求并根据请求调用适当的业务逻辑(Service层),然后将处理结果返回给用户。
总结的说,Controller的作用是:1、接收请求;2、调用Service层的方法;3、参数解析,对请求头中的参数进行解析;4、返回响应结果。将处理结果封装成适当的响应(如HTML页面、JSON数据等)返回给客户端。我这边为了方便起见,直接调repository中的方法了,后续补充一个Service层。
1、先写一个Controller
package com.example.demo3.controller; | |
import com.example.demo3.repository.StudentEntity; | |
import com.example.demo3.repository.StudentRepository; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.data.domain.Page; | |
import org.springframework.data.domain.PageRequest; | |
import org.springframework.data.domain.Pageable; | |
import org.springframework.data.jpa.domain.Specification; | |
import org.springframework.web.bind.annotation.*; | |
import javax.persistence.criteria.CriteriaBuilder; | |
import javax.persistence.criteria.CriteriaQuery; | |
import javax.persistence.criteria.Predicate; | |
import javax.persistence.criteria.Root; | |
import java.util.List; | |
@RestController // 注意,该注解表明是是rest风格的API, 返回值通常是数据对象,Spring 将数据转换为JSON或者XML格式,返回给客户端。 | |
// controller返回的是视图名称或者ModelAndView对象。需要配置@ReponseBody使用,即在方法的前面加上这个注解。 | |
@RequestMapping("/student") | |
public class StudentController { | |
@Autowired | |
StudentRepository repository; | |
//查, 通过姓名查询 | |
@RequestMapping(value = "/byname", method = {RequestMethod.GET}) | |
//@ResponseBody | |
public List<StudentEntity> findByName(@RequestParam("name") String name) { | |
return repository.findByName(name); | |
} | |
// 全部返回,线上我们一般都用分页查询,因为数据量比较大嘛。直接返回全部数据的接口用的很少或者几乎不用。 | |
@GetMapping(value = "/all") | |
public List<StudentEntity> findAlls() { | |
List<StudentEntity> all = repository.findAll(); | |
return all; | |
} | |
// 增 | |
@PostMapping(value = "/add") | |
private String addOne(@RequestBody StudentEntity student){ | |
repository.save(student); | |
return "学生" + student.getName() + "添加成功"; | |
} | |
// 改 | |
@PutMapping(value = "/update") | |
private String updateOne(@RequestBody StudentEntity student){ | |
repository.save(student); | |
return "学生" + student.getName() + "修改成功"; | |
} | |
// 删 | |
@DeleteMapping(value = "/delete") | |
private String deleteOne(@RequestParam("id") Integer id) { | |
repository.deleteById(id); | |
return "学生" + id + "删除成功"; | |
} | |
// 简单分页查询 | |
@GetMapping("/page") | |
public Page<StudentEntity> findByPage(@RequestParam(value = "page", defaultValue = "0") int page, @RequestParam(value = "size", defaultValue = "2") Integer size) { | |
Pageable pageable = PageRequest.of(page, size); | |
return repository.findAll(pageable); | |
} | |
// 带条件复杂分页查询 | |
@GetMapping("/page2") | |
public Page<StudentEntity> findByPage2(@RequestParam(value = "name") String name, @RequestParam(value = "age") Integer age, @RequestParam(value = "page", defaultValue = "0") int page, @RequestParam(value = "size", defaultValue = "2") Integer size) { | |
Pageable pageable = PageRequest.of(page, size); | |
Specification<StudentEntity> specification = prediacte(name, age); | |
return repository.findAll(specification, pageable); | |
} | |
public static Specification<StudentEntity> prediacte(String name, Integer age) { | |
return (Root<StudentEntity> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) -> { | |
// 这边简单用name和age查询一下 | |
Predicate namePredicate = criteriaBuilder.equal(root.get("name"), name); | |
Predicate agePredicate = criteriaBuilder.equal(root.get("age"), age); | |
return criteriaBuilder.and(namePredicate, agePredicate); | |
}; | |
} | |
} |
2、Repository
这个是dao层,主要是执行一些和数据库交互的功能。在和数据库交互的时候,我们要创建一个实体类Entity, 这边我们叫做StudentEntity实体对象,相应的,数据库里面也应该有和这个实体类一一映射的表。数据库中的表名就可以写在注解@Table里。
@Entity注解的作用如下。首先, @Entity的含义是用于标识一个java类作为JPA(java persistence api)实体类, 表示该类将映射到数据库中的表。也就是说,实体类和数据库表的映射关系由该注解的实现,其中的映射关系具体体现在:实体类的属性和数据库表的字段一一对应。
@id注解用于表示某个字段作为表的主键,每个表必须要显式定义一个主键。
@Column 注解是 JPA(Java Persistence API)中用于描述实体属性与数据库表列之间映射关系的注解。通过 @Column 注解,可以指定实体类属性与数据库表中列的映射细节,如列名、数据类型、长度、是否可为空等。即可以更精细地控制实体属性与数据库表列的映射关系。如代码所示,name中指定的列名和表中的对应起来,然后private 属性就可以任意取一个名字了,不过建议还是都对应起来。
StudentEntity
package com.example.demo3.repository; | |
import lombok.Data; | |
import javax.persistence.*; | |
@Entity | |
@Table(name = "student_info") | |
@Data | |
public class StudentEntity { | |
@Id | |
@Column(name = "id") | |
@GeneratedValue(strategy = GenerationType.IDENTITY) | |
private int id; | |
@Column(name = "name") | |
private String name; | |
@Column(name = "age") | |
private int age; | |
@Column(name = "address") | |
private String address; | |
@Column(name = "other") | |
private String other; | |
} | |
以下是StudentRepository类,这边定义的几个方法都是直接调用Spring JPA 封装好的方法,可直接调用。如果遇到比较复杂的场景,我们也可以在这里写一个接口,再写接口方法的具体实现。
package com.example.demo3.repository; | |
import org.springframework.data.domain.Page; | |
import org.springframework.data.domain.Pageable; | |
import org.springframework.data.jpa.repository.JpaRepository; | |
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; | |
import java.util.List; | |
public interface StudentRepository extends JpaRepository<StudentEntity, Integer>, JpaSpecificationExecutor<StudentEntity> { | |
List<StudentEntity> findByName(String name); | |
List<StudentEntity> findAll(); | |
void deleteById(Integer id); | |
Page<StudentEntity> findAll(Pageable pageable); | |
} |
测试结果
有两种测试方法,可以在网页端直接输入url发起HTTP请求,由于我们的HTTP请求中要使用对象,所以选择Postman会比较方便。
1、根据name查询

2、增加一个student

3、修改id=xx的学生的信息

4、删除id=xx的学生信息

5、分页查询

我们默认的是取第0页的数据,每页取size个数据。 故"pageSize": 2,"pageNumber": 0。 totalPages指的是总共有多少条数据, "totalPages": 3指的是一共要分多少页。5条数据,每页2个数据,那么就是分3页。"sort"是分页时排序的属性。 | |
{ | |
"content": [ | |
{ | |
"id": 1, | |
"name": "小红", | |
"age": 18, | |
"address": "深圳市", | |
"other": "女;本科毕业,程序员" | |
}, | |
{ | |
"id": 2, | |
"name": "小黑", | |
"age": 29, | |
"address": "广州市", | |
"other": "男;本科毕业,程序员" | |
} | |
], | |
"pageable": { | |
"sort": { | |
"empty": true, | |
"sorted": false, | |
"unsorted": true | |
}, | |
"offset": 0, | |
"pageSize": 2, | |
"pageNumber": 0, | |
"paged": true, | |
"unpaged": false | |
}, | |
"totalElements": 5, | |
"last": false, | |
"totalPages": 3, | |
"number": 0, | |
"size": 2, | |
"sort": { | |
"empty": true, | |
"sorted": false, | |
"unsorted": true | |
}, | |
"numberOfElements": 2, | |
"first": true, | |
"empty": false | |
} |
6、带条件的分页查询

{"content": [{"id": 2,"name": "小黑","age": 29,"address": "广州市","other": "男;本科毕业,程序员"}],"pageable": {"sort": {"empty": true,"sorted": false,"unsorted": true},"offset": 0,"pageNumber": 0,"pageSize": 2,"unpaged": false,"paged": true},"last": true,"totalPages": 1,"totalElements": 1,"number": 0,"size": 2,"sort": {"empty": true,"sorted": false,"unsorted": true},"numberOfElements": 1,"first": true,"empty": false
}
后面我会加一个Service层。今天就先写这么多吧。
相关文章:
SpringBoot项目-实现简单的CRUD功能和分页查询
背景 本博文主要是创建了一个新的SpringBoot项目,实现基本的增删改查,分页查询,带条件的分页查询功能。是方便初学者学习后端项目的一个比较清晰明了的实践代码,读者可根据博文,从自己动手创建一个新的SpringBoot项目…...
CCF编程能力等级认证GESP—C++2级—20240907
CCF编程能力等级认证GESP—C2级—20240907 单选题(每题 2 分,共 30 分)判断题(每题 2 分,共 20 分)编程题 (每题 25 分,共 50 分)数位之和小杨的矩阵 单选题(每题 2 分,共…...
C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解
二叉排序树习题1.设计算法构建一棵二叉排序树(又称二叉搜索树BST)2.查找二叉排序树中结点为x的结点所在的层数3.删除二叉排序树T中值为x的结点4.查找二叉排序树中所有小于key的关键字5.编写算法,将一棵二叉树t分解成两棵二叉排序树t1和t2,使得t1中的所有…...
YC教父的创始人模式VS职业经理人模式:AI时代的独立开发者崛起
近年来,由风投资助的创始人模式因其相对较低的入门门槛而在创业圈内广受欢迎。然而,真正的挑战在于独立开发者(一人商业)模式。随着AI技术的飞速发展,一人商业模式有望成为未来的主流。本文将探讨独立开发者的工作范围…...
[SUCTF 2019]Pythonginx
给了源码 app.route(/getUrl, methods[GET, POST]) def getUrl():url request.args.get("url")host parse.urlparse(url).hostnameif host suctf.cc:return "我扌 your problem? 111"parts list(urlsplit(url))host parts[1]if host suctf.cc:retu…...
省市县相关校验sql随笔
1.层级校验 要判断一个给定的省、市、区(县)名字是否符合正确的层级关系,假设你的表结构如下: CREATE TABLE regions (id INT PRIMARY KEY,name VARCHAR(255),parent_id INT, -- 指向上一级区域的id,例如市的parent_id指向省的…...
uniapp ios sticky定位,内部 u-tabs(包含scroll-view)消失问题
uniapp中用sticky定位时,元素内部如果有scroll-view,ios在触发bounce机制时,scroll-view的元素会消失,解决方法是页面上包一层高度为100vh的scroll-view <scroll-view style"height: 100vh;" scroll-y scrolltolowe…...
web群集--nginx配置文件location匹配符的优先级顺序详解及验证
文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中࿰…...
Vivado编译报错黑盒子问题
1 问题描述 “Black Box Instances: Cell **** of type ** has undefined contents and is considered a back box. The contents of this cell must be defined for opt_design to complete successfully.” 检查工程代码提示的模块,该模块为纯手写的Veril…...
【建造者模式】
建造者模式 Builder Pattern 属于创建型模式是将一个复杂对象的构建与它的标识分离,使得同样的构建过程可以创建不同的表示关键点:用户只需要指定需要建造的类型就可以获得对象,建造过程及细节不需要了解 实现 demo 需要构建的对象 Data pu…...
自动化表格处理的革命:智能文档系统技术解析
在当今数据驱动的商业环境中,表格数据的自动化处理成为了企业提高效率、降低成本的关键。企业智能文档系统在智能表格识别方面展现出卓越的性能,通过精准识别和处理各种通用表格,显著提升了企业文档管理的智能化水平。本文将深入探讨该系统在…...
【Hot100】LeetCode—394. 字符串解码
目录 1- 思路栈实现四种情况处理 2- 实现⭐394. 字符串解码——题解思路 3- ACM 实现 原题链接:394. 字符串解码 1- 思路 栈实现四种情况处理 ① 遇到数字,进行倍数相加 、②遇到左括号,压栈之前的元素、③遇到右括号弹出,栈进行…...
12. 如何在MyBatis中进行分页查询?常见的分页实现方式有哪些?
在MyBatis中,分页查询是一种常见的需求,尤其是在处理大数据量的情况下。MyBatis本身不直接提供分页功能,但可以通过以下几种常见的实现方式来实现分页查询。 1. 手动分页 这是最基本的分页方式,直接在SQL语句中添加分页参数。不同…...
@[TOC](力扣题目-滑动窗口-qsort排序-二分法查找)
通信 LCR 009. 乘积小于 K 的子数组268. 丢失的数字287. 寻找重复数 LCR 009. 乘积小于 K 的子数组 已解答 滑动窗口 给定一个正整数数组 nums和整数 k ,请找出该数组内乘积小于 k 的连续的子数组的个数。 示例 1: 输入: nums [10,5,2,6], k 100 输出: 8 解释…...
Docker容器相关命令
Docker是一种容器化技术,可以帮助用户更轻松地创建、部署和管理容器。下面是一些常见的Docker容器管理任务: 创建容器:使用Docker镜像创建一个新的容器。 docker run image_name列出容器:查看当前运行的容器列表。 docker ps启动容…...
【老课推荐】基于LangChain和知识图谱的大模型医疗问答机器人项目
在当今数据驱动和人工智能主导的时代,大模型和知识图谱的结合是一个重要的研究和应用方向。大模型实战课程通过48课时,分为六个主要章节,涵盖了从基本概念到高级应用的多方面内容。学员将通过本课程学习如何使用LangChain和OpenAI进行开发&am…...
Adobe Sensei——自动化视频编辑、特效应用和素材增强,通过AI技术快速优化视频内容,自动修复视频质量、自动添加背景音乐或字幕
一、Adobe Sensei介绍 Adobe Sensei 是 Adobe 公司开发的一款基于人工智能和机器学习技术的平台,旨在增强其各种创意、文档和体验管理工具。Adobe Sensei 通过深度学习、计算机视觉、自然语言处理(NLP)等先进技术,帮助用户在 Ado…...
【AIGC数字人】EchoMimic:基于可编辑关键点条件的类人音频驱动肖像动画
GitHub:https://github.com/BadToBest/EchoMimic 论文: https://arxiv.org/pdf/2407.08136 comfyui: https://github.com/smthemex/ComfyUI_EchoMimic 相关工作 Wav2Lip Wav2Lip是一个开创性的工作 ,但输出会出现面部模糊或扭…...
变量数据类型 Day3
1. 变量 1.1 变量的概念 变量是计算机内存中的一块存储单元,是存储数据的基本单元变量的组成包括:数据类型、变量名、值,后文会具体描述变量的本质作用就是去记录数据的,比如说记录一个人的身高、体重、年龄,就需要去…...
SpringBoot2:请求处理原理分析-RESTFUL风格接口
一、RESTFUL简介 Rest风格支持(使用HTTP请求方式,动词来表示对资源的操作) 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在: /user GET-获取用户 DELETE-删除用户 PUT-修改…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
