Spring JdbcTemplate 万字详解(通俗易懂)
目录
Δ前言
一、什么是JdbcTemplate?
1.定义:
2.作用:
3.环境搭建:
二、JdbcTemplate的简单使用
1.通过JdbcTemplate实现数据的添加:
2.通过JdbcTemplate实现数据的修改:
三、JdbcTemplate的进阶使用
1.数据批量处理:
2.查询到的数据封装到Bean对象:
3.查询到的数据以Bean对象的形式封装到集合中:
4.查询单行单列的具体字段:
5.使用具名参数添加数据:
Δ总结
Δ前言
- 第六节内容,up主要和大家分享一下Spring JdbcTemplate相关的内容;包括JdbcTemplage的基本介绍,基本使用和进阶使用。
- 注意事项——①代码中的注释也很重要;②不要眼高手低,自己跟着敲一遍才真正有收获;③点击文章的侧边栏目录或者文章开头的目录可以进行跳转。
- 良工不示人以朴,up所有文章都会适时补充完善。大家如果有问题都可以在评论区进行交流或者私信up。感谢阅读!
一、什么是JdbcTemplate?
1.定义:
JdbcTemplate 是 Spring 框架提供的一个核心 JDBC 工具类,位于 org.springframework.jdbc.core 包中。它简化了 JDBC 数据库操作,避免了繁琐的 JDBC 代码编写,提高了开发效率。
2.作用:
- 执行 SQL 语句:JdbcTemplate 提供了多种方法来执行 SQL 语句,包括查询、更新、插入、删除等。
- 处理结果集:JdbcTemplate 可以自动将查询结果转换为 Java 对象,简化了结果集的处理。
- 管理数据库连接:JdbcTemplate 自动管理数据库连接的获取和释放,避免了资源泄漏。
- 处理异常:JdbcTemplate 将 JDBC 异常转换为 Spring 的统一数据访问异常,方便进行异常处理。
- 支持事务:JdbcTemplate 可以与 Spring 的事务管理机制集成,实现事务控制。
3.环境搭建:
首先,我们需要在原来项目的基础上,增加如下五个jar包(up此处选用Druid连接池作为演示,大家亦可用其他连接池)——
并把它们加入到项目中。
接着,我们要选择一个用于测试的数据库,此处up为了演示,新建一个"spring_test" 数据库,代码如下:
CREATE DATABASE spring_test;
USE spring_test;CREATE TABLE IF NOT EXISTS `blog_column` (`id` INT NOT NULL UNIQUE,`bc_name` VARChAR(128)
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERT INTO `blog_column`VALUES(1, 'java基础'),(2, 'java进阶'),(3, 'java高级'),(4, 'javaWEB'),(5, 'java内功'),(6, 'java框架'),(7, 'DB'),(8, 'Technology_Stack'),(9, 'C');SELECT * FROM `blog_column`;
然后,需要配置properties文件(创建在src目录下),up配置的druid.properties配置文件,代码如下:
# 选择驱动
driverClassName=com.mysql.cj.jdbc.Driver
# 选择数据库
url=jdbc:mysql://localhost:3306/spring_test?rewriteBatchedStatements=true&characterEncoding=UTF-8
# 配置用户名
jdbc.username=root
# 配置用户密码
jdbc.password=RA9_Cyan
# 初始化连接数量
initialSize=10
# 最小连接数量
minIdle = 5
# 最大连接数量
maxActive=50
# 超时时间5000ms(在等待队列中的最长等待时间,若超过,放弃此次请求)
maxWait=5000
接着,还是在src目录下,配置xml文件,up以 beans_jdbcTemplate.xml为例,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:contex="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置properties文件 --><contex:property-placeholder location="classpath:druid.properties"/><!-- 配置数据源对象 --><bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource01"><property name="driverClassName" value="${driverClassName}"/><property name="url" value="${url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!-- 配置JdbcTemplate对象 --><bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate01"><property name="dataSource" ref="dataSource01"/></bean>
</beans>
那么配置好之后就可以测试了,JdbcTemplateTest测试类代码如下:
package com.cyan.spring.test;import com.alibaba.druid.pool.DruidDataSource;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;/*** @author : Cyan_RA9* @version : 22.0*/
public class JdbcTemplateTest {@Testpublic void testJdbcTemplate() throws SQLException {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans_jdbcTemplate.xml");//通过接口来获取数据源对象DataSource dataSource = ioc.getBean("dataSource01", DataSource.class);Connection connection = dataSource.getConnection();System.out.println("dataSource's class = " + dataSource.getConnection());System.out.println("connection = " + connection);connection.close();}
}
运行结果:
并且,如果我们在Debug下检查IOC容器,会发现singletonObjects单例池中,成功被注入了DataSource对象,如下图所示:
二、JdbcTemplate的简单使用
1.通过JdbcTemplate实现数据的添加:
需求:向表中新增两条记录,用两种方法实现。
就在刚在的JdbcTemplateTest测试类下,我们用配置的JdbcTemplate对象实现数据添加,代码如下:
@Testpublic void testJdbcTemplate() throws SQLException {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans_jdbcTemplate.xml");//通过接口来获取数据源对象DataSource dataSource = ioc.getBean("dataSource01", DataSource.class);Connection connection = dataSource.getConnection();System.out.println("dataSource's class = " + dataSource.getConnection());System.out.println("connection = " + connection);JdbcTemplate jdbcTemplate = ioc.getBean("jdbcTemplate01", JdbcTemplate.class);String sql1 = "INSERT INTO `blog_column` VALUES (10, 'Java刷题');";String sql2 = "INSERT INTO `blog_column` VALUES (?, ?);";//添加方式一 :通过execute方法添加jdbcTemplate.execute(sql1);//添加方式二 :通过update方法添加int affectedRows = jdbcTemplate.update(sql2, 11, "Java书籍");System.out.println("affectedRows = " + affectedRows);connection.close();}
运行结果:
检查数据库中的 blog_column 表,发现记录添加成功,如下所示:
2.通过JdbcTemplate实现数据的修改:
需求:将 blog_column 表中的 3---java高级 记录,改为 3---Java_Advanced。
仍然是在JdbcTemplateTest类,新增一个单元测试方法,代码如下:
@Testpublic void testUpdateByJdbcTemplate() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans_jdbcTemplate.xml");JdbcTemplate jdbcTemplate = ioc.getBean("jdbcTemplate01", JdbcTemplate.class);String sql = "UPDATE `blog_column` SET bc_name = ? WHERE `id` = ?;";int affectedRows = jdbcTemplate.update(sql, "Java_Advanced", 3);System.out.println("affectedRows = " + affectedRows);}
运行结果:
同时,我们查看数据库中的 blog_column 表,会发现 id = 3 的记录已经被成功修改,如下图所示:
三、JdbcTemplate的进阶使用
1.数据批量处理:
需求:通过批处理机制,连续向 blog_column 表中插入三条记录。
在JdbcTemplateTest类下新增一个用于单元测试的方法,代码如下:
@Testpublic void testBatchProcessByJdbcTemplate() throws SQLException {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans_jdbcTemplate.xml");JdbcTemplate jdbcTemplate = ioc.getBean(JdbcTemplate.class);String sql = "INSERT INTO `blog_column` VALUES (?, ?);";List<Object[]> parametersList = new ArrayList<>();parametersList.add(new Object[] { 12, "待定1"});parametersList.add(new Object[] { 13, "待定2"});parametersList.add(new Object[] { 14, "待定3"});jdbcTemplate.batchUpdate(sql, parametersList);}
运行后,我们可以看到 spring_test 数据库中的 blog_column 表中,又加入了三条新的数据,如下所示:
2.查询到的数据封装到Bean对象:
需求:查询 blog_column 表中 id = 5的专栏,并将查到的记录以 Column对象 的形式封装起来。
首先我们来建立一个 标准JavaBean 的Column类,代码如下:
package com.cyan.spring.bean;/*** @author : Cyan_RA9* @version : 22.0*/
public class Column {private int columnId;private String columnName;public Column() {}public Column(int columnId, String columnName) {this.columnId = columnId;this.columnName = columnName;}public int getColumnId() {return columnId;}public void setColumnId(int columnId) {this.columnId = columnId;}public String getColumnName() {return columnName;}public void setColumnName(String columnName) {this.columnName = columnName;}@Overridepublic String toString() {return "Column{" +"columnId=" + columnId +", columnName='" + columnName + '\'' +'}';}
}
然后,我们在JdbcTemplateTest测试类中,继续新增一个单元测试方式,代码如下:
@Testpublic void testEncapsulateToObjectByJdbcTemplate() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans_jdbcTemplate.xml");JdbcTemplate jdbcTemplate = (JdbcTemplate) ioc.getBean("jdbcTemplate01");String sql = "SELECT `id` AS `columnId`, bc_name AS `columnName` " + "\n" +"FROM `blog_column`" + "\n" +"WHERE `id` = ?;";//多态,注意参数列表传入了目标Bean的字节码文件对象RowMapper<Column> rowMapper = new BeanPropertyRowMapper<>(Column.class);Column column = jdbcTemplate.queryForObject(sql, rowMapper, 5);System.out.println("column = " + column);}
运行结果 :
3.查询到的数据以Bean对象的形式封装到集合中:
需求:查询 blog_column 表中 id <= 6的专栏,并将查到的记录以 List集合 的形式封装起来。
在JdbcTemplateTest测试类中,继续新增一个单元测试方式,代码如下:
@Testpublic void testEncapsulateToListByJdbcTemplate() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans_jdbcTemplate.xml");JdbcTemplate jdbcTemplate = (JdbcTemplate) ioc.getBean("jdbcTemplate01");String sql = "SELECT `id` AS `columnId`, bc_name AS `columnName` " + "\n" +"FROM `blog_column`" + "\n" +"WHERE `id` <= ?;";RowMapper<Column> rowMapper = new BeanPropertyRowMapper<>(Column.class);List<Column> columnList = jdbcTemplate.query(sql, rowMapper, 6);for (Column column : columnList) {System.out.println("column = " + column);}}
运行结果:
4.查询单行单列的具体字段:
需求:查询 blog_column 表中 id = 8 的专栏名称(即返回该专栏的bc_name)。
在JdbcTemplateTest测试类中,继续新增一个单元测试方式,代码如下:
@Testpublic void testQueryOneSpecificFieldByJdbcTemplate() {ApplicationContext ioc = new ClassPathXmlApplicationContext("beans_jdbcTemplate.xml");JdbcTemplate jdbcTemplate = (JdbcTemplate) ioc.getBean("jdbcTemplate01");String sql = "SELECT `bc_name` FROM `blog_column` WHERE `id` = ?;";String bc_name = jdbcTemplate.queryForObject(sql, String.class, 8);System.out.println("bc_name = " + bc_name);}
运行结果:
5.使用具名参数添加数据:
以往我们使用SQL语句时,总是用到占位符 ? ,就像我们上面刚刚用到的SQL语句,如下图所示:
这么做有个问题——除非我们知道对应表的结构,不然就无法确定这个占位符? 应该传入什么参数。
使用具名参数可以很好的解决这个问题。
需求:以具名参数的形式向 blog_column表中新插入两条记录。
首先在之前的 beans_jdbcTemplate.xml 配置文件下新配置一个 NamedParameterJdbcTemplate 对象,如下:
<!-- 配置NamedParameterJdbcTemplate --><bean class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" id="namedParameterJdbcTemplate"><constructor-arg name="dataSource" ref="dataSource01"/></bean>
仍然在JdbcTemplateTest类中,新增一个单元测试方法,
@Testpublic void testNamedParameterJdbcTemplate() {//获取Spring 容器对象ApplicationContext ioc = new ClassPathXmlApplicationContext("beans_jdbcTemplate.xml");//通过 id和类型 获取容器中的 NamedParameterJdbcTemplate实例NamedParameterJdbcTemplate namedParameterJdbcTemplate = ioc.getBean("namedParameterJdbcTemplate", NamedParameterJdbcTemplate.class);//1. 方式一: int update(String var1, Map<String, ?> var2)String sql1 = "INSERT INTO `blog_column` VALUES(:id, :name);";Map<String, Object> parameterMap = new HashMap<>();parameterMap.put("id", 15);parameterMap.put("name", "待定4");namedParameterJdbcTemplate.update(sql1, parameterMap);//2. 方式二:使用 SqlParameterSource 来封装具名参数//int update(String var1, SqlParameterSource var2)//注意此时具名参数的名称必须与JavaBean一致String sql2 = "INSERT INTO `blog_column` VALUES(:columnId, :columnName);";//接口多态Column columnTest = new Column(16, "待定5");SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(columnTest);namedParameterJdbcTemplate.update(sql2, sqlParameterSource);}
运行结果如下:
Δ总结
- 🆗,以上就是Spring系列博文 第六小节 的全部内容了。
- 总结一下,JdbcTemplate相比于之前的 IOC,AOP,要好理解很多,因为它就是Spring提供的 操作数据库 的技术嘛;所以对于JdbcTemplate,其实更重要的是我们能不能熟练地使用它,做到熟能生巧的地步。
- 下一节内容,也是Spring系列的最后一节内容——Spring 声明式事务,大家不见不散,感谢阅读!
System.out.println("END---------------------------------------------");
相关文章:
Spring JdbcTemplate 万字详解(通俗易懂)
目录 Δ前言 一、什么是JdbcTemplate? 1.定义: 2.作用: 3.环境搭建: 二、JdbcTemplate的简单使用 1.通过JdbcTemplate实现数据的添加: 2.通过JdbcTemplate实现数据的修改: 三、JdbcTemplate的进阶使用 …...
centos 7 搭建ftp 基于虚拟用户用shell脚本搭建
#!/bin/bash# 步骤1: 更新系统并安装vsftpd yum update -y yum install vsftpd -y# 步骤2: 创建虚拟用户信息文件并转换为数据库文件 cat << EOF > /etc/vsftpd/virtual_users.txt ftpvuser 123456 EOFdb_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsft…...
《Android低内存设备性能优化实战:深度解析Dalvik虚拟机参数调优》
1. 痛点分析:低内存设备的性能困局 现象描述:大应用运行时频繁GC导致卡顿 根本原因:Dalvik默认内存参数与硬件资源不匹配 解决方向:动态调整堆内存参数以平衡性能与资源消耗 2. 核心调优参数全景解析 关键参数矩阵࿱…...
【AI学习】概念了解
1,GPU 专门用于处理图形相关运算任务的微处理器,它起初主要聚焦于加速图形渲染,让计算机能够快速、流畅地显示高质量的图像、视频以及 3D 场景等内容,在电脑游戏、影视特效制作、动画设计等领域有着至关重要的作用。 与传统的中央处理器(CPU)相比,GPU 有着数量众多的核…...
WPF InkCanvas 控件详解
1. InkCanvas 是什么? InkCanvas 是 WPF 提供的一个手写绘图控件,它允许用户使用鼠标、触摸屏或手写笔在界面上进行绘图、标注等操作。 核心特点: ✅ 具备笔迹存储和管理功能。 ✅ 提供 Children 和 Strokes 两个集合,分别用于管理子控件和绘制的笔迹。 ✅ 通过 EditingM…...
数据库三级选择题(2)
C) 分布式数据库的事务管理包括恢复控制和并发控制,恢复控制一般采用的策略是基于两阶段提交协议 采用一定的计算方法定位数据的有 Ⅳ.散列(哈希)索引 下列提供逻辑独立性的是外模式/模式映像 UML所有活动有关判断的部分要用菱形表…...
ShapeCrawler:.NET开发者的PPTX操控魔法
引言 在当今的软件开发领域,随着数据可视化和信息展示需求的不断增长,处理 PPTX 文件的场景日益频繁。无论是自动化生成报告、批量制作演示文稿,还是对现有 PPT 进行内容更新与格式调整,开发者都需要高效的工具来完成这些任务。传…...
CAS(Compare And Swap)
CAS核心原理 操作流程 CAS 包含三个参数:内存值(V)、预期值(E)和新值(N)。执行步骤如下: 比较:检查当前内存值 V 是否等于预期值 E。 交换:如果相等&#…...
熔断降级(Sentinel解决)
问题概述 在微服务架构中一定要预防微服务雪崩问题,微服务雪崩问题就是指在微服务架构中,当一个服务出现故障时,由于服务之间的依赖关系,故障可能会传播到其他服务,从而导致了大规模的服务失败,系统无法正…...
Deepseek API+Python 测试用例一键生成与导出 V1.0.4 (接口文档生成接口测试用例保姆级教程)
接口文档生成接口测试用例保姆级教程 随着测试需求的复杂性增加,测试用例的设计和生成变得愈发重要。Deepseek API+Python 测试用例生成工具在 V1.0.4 中进行了全方位的优化和功能扩展,特别是对接口测试用例设计的支持和接口文档的智能解析处理。本文将详细介绍 V1.0.4 版本…...
git 基本操作命令
一、初始化本地git仓库 git init 二、将当前目录下所有文件加载到本地git仓库 git add .三、提交内容和备注 git commit -m 提交类容四、(复制仓库路径)然后提交到仓库 git remote add origin 提交的仓库路径五、提交到远程仓库,如果这里提交失败,在…...
学习本地部署DeepSeek的过程(基于LM Studio)
除了使用Ollama部署DeepSeek,还可以使用LM Studio部署DeepSeek,后者是一款允许用户在本地计算机上运行大型语言模型(LLMs)的桌面应用程序,旨在简化本地模型的使用,无需云端连接或复杂配置即可体验 AI 功能。…...
web爬虫笔记:js逆向案例十一 某数cookie(补环境流程)
web爬虫笔记:js逆向案例十一 某数cookie(补环境流程) 一、获取网页数据请求流程 二、目标网址、cookie生成(逐步分析) 1、目标网址:aHR0cHM6Ly9zdWdoLnN6dS5lZHUuY24vSHRtbC9OZXdzL0NvbHVtbnMvNy9JbmRleC5odG1s 2、快速定位入口方法 1、通过脚本监听、hook_cookie等操作可…...
游戏引擎学习第180天
我们将在某个时候替换C标准库函数 今天我们要进行的工作是替换C标准库函数,这是因为目前我们仍然在使用C语言开发,并且在某些情况下会调用C标准库函数,例如一些数学函数和字符串格式化函数,尤其是在调试系统中,我们使…...
测试用例生成平台通过大模型升级查询功能,生成智能测试用例
在测试工作中,查询功能是各类系统的核心模块,传统的测试用例编写往往耗时且重复。如何让老旧平台焕发新活力?本文将结合大模型技术,通过用户输入的字段信息,自动化生成高效、精准的测试用例。同时,我们还将…...
kafka零拷贝技术的底层实现
什么是 Sendfile? sendfile 是一种操作系统提供的系统调用(system call),用于在两个文件描述符(file descriptor)之间高效传输数据。它最初由 Linux 内核引入(从 2.1 版本开始)&…...
Win11+VS2022+CGAL5.6配置
1. CGAL库简介 CGAL(Computational Geometry Algorithms Library)是一个开源的计算几何算法库,主要用于处理几何问题和相关算法的实现。它提供了丰富的几何数据结构和高效算法,覆盖点、线、多边形、曲面等基本几何对象的表示与操…...
Linux编译器gcc/g++使用完全指南:从编译原理到动静态链接
一、gcc/g基础认知 在Linux开发环境中,gcc和g是我们最常用的编译器工具: gcc:GNU C Compiler,专门用于编译C语言程序g:GNU C Compiler,用于编译C程序(也可编译C语言) 📌…...
Vue3项目中的.vscode文件夹
.vscode 文件夹主要用于存放与 Visual Studio Code(VS Code)编辑器相关的项目配置文件,这些文件能让项目在 VS Code 里的开发体验更加个性化和高效。 extensions.json 在 .vscode 文件夹中,extensions.json 文件的作用是列出项目…...
蓝桥杯嵌入式十六届模拟三
由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…...
造成服务器网络连接不稳定的原因是什么?
服务器的稳定性会影响到网络的响应速度和用户的体验感,当服务器网络连接不稳定时,会到时用户在浏览网站的过程中出现页面卡顿或页面消失等情况,给企业造成一定的经济损失,本文就来介绍一下造成服务器网络连接不稳定的因素都有哪些…...
[FPGA基础学习]加法器、三八译码器及DE2-115基本使用方法和数码管显示
软件安装:QuartusLite安装说明及驱动更新 DE2-115上电及程序烧录 1.用包装盒里的USB 电缆将PC的USB端口和DE2-115开发板的USB Blaster连接器连接 起来,为了实现主机和开发板之间的通讯,必须安装USB Blaster 驱动软件 鼠标右击“USB-Blaster…...
VSCode 市场发现恶意扩展正在传播勒索软件!
在VSCode 市场中发现了两个隐藏着勒索软件的恶意扩展。其中一个于去年 10 月出现在微软商店,但很长时间没有引起注意。 这些是扩展ahban.shiba 和 ahban.cychelloworld,目前已从商店中删除。 此外,ahban.cychelloworld 扩展于 2024 年 10 月…...
树状数组 3 :区间修改,区间查询
【题目描述】 这是一道模板题。 给定数列 a[1],a[2],…,a[n],你需要依次进行q个操作,操作有两类: 1lrx:给定 l,r,x对于所有 i∈[l,r],将a[i]加上x(换言之,将 a[l],a[l1],…a[r] 分别加上 x&a…...
C++的IO流
1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。 注意宽度输出和精度输出控制。C语言借助了相应的缓…...
QLoRA和LoRA 微调
QLoRA 其实是一种结合了量化和 LoRA 微调技术的统一方法,而不是同时使用两种不同的微调方式。换句话说,QLoRA 的意思就是:先把大模型的主权重用低精度(例如 4-bit)量化,从而大幅减少存储需求;然…...
Android电话监听器的设计与实现:深入解析Service与TelephonyManager
目录 一、引言 二、Service核心机制解析 1. Service的本质特性 2. 生命周期管理 3. 服务类型全景 三、Service实战开发 1. 启动式Service开发(lesson1) 2. 绑定式Service开发 四、电话监听器完整实现(lesson3) 1. 系统架…...
java学习笔记7——面向对象
关键字:static 类变量 静态变量的内存解析: 相关代码: public class ChineseTest {public static void main(String[] args) {System.out.println(Chinese.nation); //null 没赋值前System.out.println(Chinese.nation); //中国 静态变量赋值…...
java学习——函数式编程(1)
函数式编程 Java 的函数式编程是一种以函数为核心构建逻辑的编程范式,强调不可变性、声明式代码和无副作用的操作。它通过Lambda表达式、函数式接口(如Function、Predicate、Consumer等)和Stream API等特性实现,将计算过程抽象为函数的组合与转换,而非传统的命令式步骤。…...
java 批量下载doc\excle\pdf
指定图片集合 下载到指定文件夹 import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.Arrays; import java.util.List;public class OfficeFileDownloader {/*** 需要下载的Office文档URL列表*/private static final List<Strin…...
Python爬虫:Feapder 的详细使用和案例
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Feapder 概述1.1 Feapder介绍1.2 Feapder 核心特点1.3 Feapder 主要组件1.4 Feapder的安装2. 基础爬虫编写2.1 创建爬虫2.2 运行爬虫3. 数据采集案例3.1 新闻网站采集3.2 电商商品采集3.3 使用 Spider 类创建更强大爬…...
【江协科技STM32】读写备份寄存器RTC实时时钟(学习笔记)
参考相关文章理解: 【江协科技STM32】Unix时间戳(学习笔记)-CSDN博客 【江协科技STM32】BKP备寄存器&RTC实时时钟(学习笔记)_stm32断电保存时钟-CSDN博客 读写备份寄存器 接线图:VBAT是从STLINK的…...
Linux touch命令
参考资料 Linux 常用命令 - touch 【创建空文件与修改时间戳】 目录 一. 用法简介二. 配合扩展字符,批量创建文件三. 修改文件的时间戳3.1 -t 配置项3.2 -d 配置项3.3 配合find命令实现批量时间戳修改 四. 结合 find 批量创建相同时间的新文件 一. 用法简介 ⏹当指…...
PyTorch图像预处理--Compose
torchvision.transforms.Compose 是 PyTorch 中用于图像预处理的核心工具,可将多个图像变换操作组合成一个顺序执行的流水线。 1. 定义与作用 功能:将多个图像处理步骤(如缩放、裁剪、归一化等)串联为一个整体ÿ…...
CSP历年题解
CSP历年题解 csp历年题解,csp.cpp内容涵盖从2023年12月开始一直持续到第一次认证的所有前4题。所有的题解均为满分,在其中,有四道题非本人编写,而从网上搜集优质解答,并且已在文中附上了来源链接。其余则为自己编写&a…...
《索引江湖:B树索引与哈希索引的风云对决》
在数据库的神秘世界里,索引宛如一把把神奇的钥匙,帮助我们在海量数据中快速找到所需信息。而B树索引与哈希索引,则是其中两把最为耀眼的利刃,各自凭借独特的“武功秘籍”,在不同的应用场景中大放异彩。今天,…...
java八股文之JVM
1.什么是程序计数器 程序计数器是 JVM 管理线程执行的“定位器”,记录每个线程当前执行的指令位置,确保程序流程的连续性和线程切换的准确性。线程私有的,每个线程一份,内部保存的字节码的行号。用于记录正在执行的字节码指令的地…...
学习爬虫的第二天——分页爬取并存入表中
阅读提示:我现在还在尝试爬静态页面 一、分页爬取模式 以豆瓣Top250为例: 基础url:豆瓣电影 Top 250https://movie.douban.com/top250 分页参数:?start0(第一页)、?start25(第二页)等 每页显示25条数…...
Ubuntu与Windows之间相互复制粘贴的方法
一、打开Ubuntu终端 二、卸载已有的工具 sudo apt-get autoremove open-vm-tools 三、安装工具 sudo apt-get install open-vm-tools-desktop 四、重启 直接输入reboot 注:有任何问题欢迎评论区交流讨论或者私信!...
docker安装hyperf环境,连接本机redis问题处理
错误信息显示“Connection refused”,这通常说明 Docker 容器内的 Hyperf 项目无法连接到你本机的 Redis 服务。 1. 容器内的 127.0.0.1 指向问题 在 Docker 容器中,127.0.0.1 指的是容器本身,而不是宿主机(你的 Mac)…...
第12章:优化并发_《C++性能优化指南》notes
优化并发 一、并发基础与优化核心知识点二、关键代码示例与测试三、关键优化策略总结四、性能测试方法论多选题设计题答案与详解多选题答案: 设计题答案示例 一、并发基础与优化核心知识点 线程 vs 异步任务 核心区别:std::thread直接管理线程…...
Linux操作系统7- 线程同步与互斥7(RingQueue环形队列生产者消费者模型改进)
上篇文章:Linux操作系统7- 线程同步与互斥6(POSIX信号量与环形队列生产者消费者模型)-CSDN博客 本篇代码仓库:myLerningCode/l36 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 单生产单消费单保…...
学有所记——初探向量数据库Weaviate
目标: 了解向量数据库的连接、建库、插入数据、查询数据等基本用法以及关于语义相似度的一些基本概念。 背景: 前段时间尝试在自己的电脑上搭建OllamaDify平台,体验并探索大模型的强大功能。在使用过程中,尤其是在搭建RAG知识库…...
Ardupilot开源无人机之Geek SDK进展2025Q2
Ardupilot开源无人机之Geek SDK进展2025Q2 1. 源由2. 内容汇总2.1 【jetson-fpv】“Caution - Hot surface. Dont touch.”2.2 【jetson-fpv】1080P/720P显示设备配置 3. 遗留问题3.1 高优先级3.1.1 【jetson-fpv】1080P60FPS AI分析视频卡顿,丢包3.1.2 【jetson-fp…...
深入理解K8s与Docker的关系:容器化技术的双雄
友情提示:本文内容由银河易创(https://ai.eaigx.com)AI创作平台gpt-4-turbo模型生成,仅供参考。 在现代云计算及微服务架构的发展中,Docker与Kubernetes(K8s)作为两大核心技术,被广泛…...
QT高效文件I/O编程--实用指南与最佳实践
概述 在软件开发过程中,文件输入输出(I/O)操作是数据持久化和交换的核心部分。无论是简单的日志记录还是复杂的数据集处理,高效的文件I/O操作对于应用的整体性能至关重要 最佳实践 一、选择合适的文件模式 正确选择文件打开模式是确保操作意图明确且安全的第一步。不同…...
QT记事本
记事本应用程序提供了基本的文本编辑功能,支持文件的新建、打开、保存和另存为操作,同时具备修改提示和关闭窗口时的保存确认功能。使用 UTF - 8 编码确保了对多语言文本的支持。 1. 项目整体结构 main.cpp:程序的入口点,负责初…...
【leetcode hot 100 84】柱状图中最大的矩形
解法一:单调栈 class Solution {public int largestRectangleArea(int[] heights) {int len heights.length;int area 0;// 先做一些特殊判断if(len0){return 0;}if(len1){return heights[0];}// 进入栈后发现后面更短,可以得到当前这个能勾勒的面积 …...
Spring----ioc
1.Spring 是什么? 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 但是这个概念相对来说, 还是⽐较抽象. 我们⽤⼀句更具体的话来概括Spring, 那就…...
C++——重载
目录 一、函数重载 基本概念 函数重载的条件 编程示例 代码讲解 函数重载的注意事项 二、运算符重载 什么是运算符重载? 运算符重载的实质是什么? 运算符重载函数的写法 运算符重载的基本语法 可重载的运算符列表 基本原则 编程示例 代码解…...