细致刨析JDBC ① 基础篇
目录
一、JDBC概述
1.JDBC的概念
编辑2.JDBC的核心组成
① 接口规范:
② 实现规范:
二、JDBC快速入门
1.JDBC搭建步骤
三、核心API理解
1.注册驱动
2.Connection
3.Statement
4.PreparedStatement
5.ResultSet
四、基于Preparedment实现CRUD
1.查询单行单列
2.查询单行多列
3.查询多行多列
4.实现CRUD修改
5.实现CRUD新增
6.实现CRUD删除
五、常见问题
1.资源的管理
2.SQL语句问题
3.SQL语句未设置参数问题
4.用户名或密码错误问题
5.通信异常
“加油” 我已经说腻了,下次我要说:”祝你拥有随时停留和休息的底气“
—— 24.9.6
一、JDBC概述
1.JDBC的概念
JDBC:Java Database Connectivity,意为Java数据库连接
JDBC是Java提供的一组独立于任何数据库管理系统的API。
Java提供接口规范,由各个数据库厂商提供接口的实现,厂商提供的实现类封装成jar文件,也就是我们俗称的数据库驱动jar包。

2.JDBC的核心组成
① 接口规范:
为了项目代码的可移植性,可维护性,SUN公司从最初就制定了Java程序连接各种数据库的统一接口规0范。这样的话,不管是连接哪一种DBMS软件,Java代码可以保持一致性。
接口存储在java.sql和javax.sql包下。
② 实现规范:
因为各个数据库厂商的DBMS软件各有不同,那么各自的内部如何通过SQL实现增、删、改、查等操作管理数据,只有这个数据库厂商自己更清楚,因此把接口规范的实现交给各个数据库厂商自己实现。
厂商将实现内容和过程封装成iar文件,我们程序员只需要将jar文件引入到项目中集成即可,就可以开发调用实现过程操作数据库了。
二、JDBC快速入门
1.JDBC搭建步骤
① 准备数据库
create database JavaWebJDBC;use JavaWebJDBC;create table t_emp
(emp_id int auto_increment comment '员工编号' primary key,emp_name varchar(100) not null comment '员工姓名',emp_salary double(10, 5) not null comment '员工薪资',emp_age int not null comment '员工年龄'
);insert into t_emp (emp_name,emp_salary,emp_age)
values ('andy', 777.77, 32),('大风哥', 666.66, 41),('康师傅',111, 23),('Gavin',123, 26),('小鱼儿', 123, 28);
② 官网下载数据库连接驱动jar包。
下载链接:https://downloads.mysql.com/archives/c-j/
③ 创建Java项目,在项目下创建lib文件夹,将下载的驱动jar包复制到文件夹里。
④ 选中lib文件夹右键 ——> Add as Library,与项目集成。
⑤ 编写代码
import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo1_JdbcQuick {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.注册驱动// 方式1// Class.forName("com.mysql.cj.jdbc.Driver");// 方式2DriverManager.registerDriver(new Driver());//2.获取数据库连接对象Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/javawebjdbc", "root", "954926928lcl");//3.创建Statement发送执行sql语句的对象PreparedStatement preparedStatement = connection.prepareStatement("select emp_id,emp_name,emp_salary,emp_age from t_emp");//4.编写SQL语句并执行,获取结果集ResultSet resultSet = preparedStatement.executeQuery();//5.处理结果:遍历resultSet结果集while (resultSet.next()) { // 下一行的遍历// 用列名获取int empId = resultSet.getInt("emp_id");String empName = resultSet.getString("emp_name");String empSalary = resultSet.getString("emp_salary");int empAge = resultSet.getInt("emp_age");System.out.println(empId + "\t" + empName + "\t" + empSalary + "\t" + empAge);}//6.释放资源(先开后关原则)resultSet.close();preparedStatement.close();connection.close();}
}
三、核心API理解
1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
在Java中,当使用 JDBC(Java Database Connectivity)连接数据库时,需要加载数据库特定的驱动程序,以便与数据库进行通信。加载驱动程序的目的是为了注册驱动程序,使得JDBC API能够识别并与特定的数据库进行交互。
jdk的Driver源码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.mysql.cj.jdbc;import java.sql.DriverManager;
import java.sql.SQLException;public class Driver extends NonRegisteringDriver implements java.sql.Driver {public Driver() throws SQLException {}static {try {DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}}
}
从JDK6开始,不再需要显式地调用 class.forName()(两种方式都不需要写,Java可以自动注册驱动)来加载JDBC 驱动程序,只要在类路径中集成了对应的jar文件,会自动在初始化时注册驱动程序。
2.Connection
Connection接口是JDBC API的重要接口,用于建立与数据库的通信通道。换而言之,Connection对象不为空,则代表一次数据库连接。
① 在建立连接时,需要指定数据库URL、用户名、密码参数。
URL:jdbc:mysql://localhost:3306/javawebjdbc
jdbc:mysql://IP地址:端口号/数据库名称?参数键值对1&参数键值对2
② Connection 接口还负责管理事务,Connection 接口提供了 commit 和 rollback方法,用于提交事务和回滚事务。
③ 可以创建 Statement 对象,用于执行 SQL 语句并与数据库进行交互。
④ 在使用JDBC技术时,必须要先获取Connection对象,在使用完毕后,要释放资源,避免资源占用浪费及泄漏。
3.Statement
① Statement接口用于执行 SQL 语句并与数据库进行交互。它是 JDBC API 中的一个重要接口。通过 Statement 对象,可以向数据库发送 SQL 语句并获取执行结果。
② 结果可以是一个或多个结果。
增删改:受影响行数单个结果。
查询:单行单列、多行多列、单行多列等结果。
③ 但是`Statement` 接口在执行SQL语句时,会产生 SQL注入攻击问题:
当使用 Statement 执行动态构建的 SQL 查询时,往往需要将查询条件与 SQL 语句拼接在一起,直接将参数和SQL语句一并生成,让SQL的查询条件始终为true得到结果。
package JDBC_Base;import java.sql.*;
import java.util.Scanner;public class Demo2_InjectionInjure {public static void main(String[] args) throws SQLException {// 1.省略注册驱动// 2.获取数据库连接对象Connection con = DriverManager.getConnection("jdbc:mysql:///javawebjdbc","root","954926928lcl");// 3.获取执行SQL语句对象Statement stmt = con.createStatement();// 加入操作:请输入员工姓名System.out.println("请输入员工姓名");Scanner sc = new Scanner(System.in);String name = sc.nextLine();// 4.编写SQL语句,并执行,接受返回的结果String sql = "select emp_id,emp_name,emp_age,emp_salary from t_emp where emp_name = '"+name+"'";ResultSet rs = stmt.executeQuery(sql);//5.处理结果:遍历resultSet结果集while (rs.next()) { // 下一行的遍历// 用列名获取int empId = rs.getInt("emp_id");String empName = rs.getString("emp_name");String empSalary = rs.getString("emp_salary");int empAge = rs.getInt("emp_age");System.out.println(empId + "\t" + empName + "\t" + empSalary + "\t" + empAge);}// 6.释放资源 先开后关rs.close();stmt.close();con.close();}
}
4.PreparedStatement
PreparedStatement 是 Statement 接囗的子接口,用于执行 预编译的 SQL 查询,作用如下:
① 预编译SQL语句:在创建Preparedstatement时,就会预编译SQL语句,也就是SQL语句已经固定。
② 防止SQL注入: Preparedstatement 支持参数化査询,将数据作为参数传递到SQL语句中,采用 ? 占位符的方式,将传入的参数用一对单引号包裹起来",无论传递什么都作为值。有效防止传入关键字或值导致SQL注入问题。
③ 性能提升:Preparedstatement是预编译SQL语句,同一SQL语句多次执行的情况下,可以复用,不必每次重新编译和解析。
④ 后续的学习我们都是基于Preparedstatement进行实现,更安全、效率更高!
package JDBC_Base;import java.sql.*;
import java.util.Scanner;public class Demo3Prepared {public static void main(String[] args) throws SQLException {// 1.省略注册驱动// 2.获取数据库连接对象Connection con = DriverManager.getConnection("jdbc:mysql:///javawebjdbc","root","954926928lcl");// 3.获取执行SQL语句对象PreparedStatement preparedStatement = con.prepareStatement("select emp_id,emp_name,emp_age,emp_salary from t_emp where emp_name = ?");// 加入操作:请输入员工姓名System.out.println("请输入员工姓名");Scanner sc = new Scanner(System.in);String name = sc.nextLine();// 4.慰?占位符赋值,并执行SQL语句,并接受返回的结果preparedStatement.setString(1,name);ResultSet rs = preparedStatement.executeQuery();//5.处理结果:遍历resultSet结果集while (rs.next()) { // 下一行的遍历// 用列名获取int empId = rs.getInt("emp_id");String empName = rs.getString("emp_name");String empSalary = rs.getString("emp_salary");int empAge = rs.getInt("emp_age");System.out.println(empId + "\t" + empName + "\t" + empSalary + "\t" + empAge);}// 6.释放资源 先开后关rs.close();preparedStatement.close();con.close();}
}
之所以prepareStatement可以预防SQL注入问题,是因为多出一个转义操作,会将引号转义作为一个普通字符,所以prepareStatement可以预防SQL注入问题
5.ResultSet
ResultSet是 JDBC API 中的一个接口,用于表示从数据库中执行查询语句所返回的结果集。它提供了一种用于遍历和访问查询结果的方式。
遍历结果:ResultSet可以使用 next() 方法将游标移动到结果集的下一行,逐行遍历数据库查询的结果,返回值为boolean类型,true代表有下一行结果,false则代表没有。
获取单列结果:可以通过getXxx的方法获取单列的数据,该方法为重载方法,支持索引和列名进行获取。
四、基于Preparedment实现CRUD
1.查询单行单列
import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class Demo4Operation {@Testpublic void testQuerySingleRowAndCow() throws Exception {// 1.注册驱动 可以省略// 2.获取链接Connection con = DriverManager.getConnection("jdbc:mysql:///javawebjdbc","root","954926928lcl");// 3.预编译SQL语句得到P热爱怕热的Statement对象PreparedStatement preparedStatement = con.prepareStatement("select count(*) as count from t_emp");// 4.执行SQL语句,获取结果ResultSet resultSet = preparedStatement.executeQuery();// 5.处理结果while (resultSet.next()) {int count = resultSet.getInt("count");System.out.println(count);}// 6.释放资源resultSet.close();preparedStatement.close();con.close();}
}
2.查询单行多列
import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class Demo4Operation {@Testpublic void testQuerySingleRow() throws Exception {// 1.注册驱动 可以省略// 2.获取链接Connection con = DriverManager.getConnection("jdbc:mysql:///javawebjdbc","root","954926928lcl");// 3.预编译SQL语句得到P热爱怕热的Statement对象PreparedStatement pS = con.prepareStatement("select emp_id,emp_name,emp_salary,emp_age from t_emp where emp_id = ?");// 4.为占位符赋值pS.setInt(1,5);// 5.执行SQL语句,获取结果ResultSet resultSet = pS.executeQuery();// 6.处理结果while (resultSet.next()) {int emp_id = resultSet.getInt("emp_id");String emp_name = resultSet.getString("emp_name");int emp_age = resultSet.getInt("emp_age");double emp_salary = resultSet.getDouble("emp_salary");System.out.println(emp_id+"\t"+emp_name+"\t"+emp_age+"\t"+emp_salary);}// 7.释放资源resultSet.close();pS.close();con.close();}
}
3.查询多行多列
import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class Demo4Operation {@Testpublic void testQueryMoreCow() throws Exception {// 1.注册驱动 可以省略// 2.获取链接Connection con = DriverManager.getConnection("jdbc:mysql:///javawebjdbc","root","954926928lcl");// 3.预编译SQL语句得到P热爱怕热的Statement对象PreparedStatement pS = con.prepareStatement("select emp_id,emp_name,emp_salary,emp_age from t_emp where emp_age > ?");// 4.为占位符赋值,执行SQL语句,接受结果// 加入操作:请输入员工年龄System.out.println("请输入员工最低年龄");Scanner sc = new Scanner(System.in);int age = sc.nextInt();// 5.执行SQL语句,获取结果pS.setInt(1,age);ResultSet resultSet = pS.executeQuery();// 6.处理及过while (resultSet.next()) {int emp_id = resultSet.getInt("emp_id");String emp_name = resultSet.getString("emp_name");double emp_salary = resultSet.getDouble("emp_salary");int emp_age = resultSet.getInt("emp_age");System.out.println(emp_id+"\t"+emp_name+"\t"+emp_salary+"\t"+emp_age);}// 7.释放资源resultSet.close();pS.close();con.close();}
}
4.实现CRUD修改
import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class Demo4Operation {@Testpublic void testUpdate() throws Exception {// 1.注册驱动 可以省略// 2.获取链接Connection con = DriverManager.getConnection("jdbc:mysql:///javawebjdbc","root","954926928lcl");// 3.预编译SQL语句得到PrepareStatement对象PreparedStatement pS = con.prepareStatement("update t_emp set emp_salary = ? where emp_id = ?");// 4.为占位符赋值pS.setDouble(1,500);pS.setInt(2,5);int res = pS.executeUpdate();if (res > 0) {System.out.println("成功修改");}else{System.out.println("修改失败");}pS.close();con.close();}
}
5.实现CRUD新增
import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class Demo4Operation {@Testpublic void testInsert() throws Exception {// 1.注册驱动 可以省略// 2.获取链接Connection con = DriverManager.getConnection("jdbc:mysql:///javawebjdbc","root","954926928lcl");// 3.预编译SQL语句得到PrepareStatement对象PreparedStatement pS = con.prepareStatement("insert into t_emp(emp_name,emp_salary,emp_age) values(?,?,?)");// 4.为占位符赋值pS.setString(1,"rose");pS.setDouble(2,563.65);pS.setInt(3,35);int res = pS.executeUpdate();if (res > 0) {System.out.println("成功新增");}else{System.out.println("新增失败");}pS.close();con.close();}
}
6.实现CRUD删除
import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;public class Demo4Operation {@Testpublic void testDelete() throws Exception {// 1.注册驱动 可以省略// 2.获取链接Connection con = DriverManager.getConnection("jdbc:mysql:///javawebjdbc","root","954926928lcl");// 3.预编译SQL语句得到PrepareStatement对象PreparedStatement pS = con.prepareStatement("delete from t_emp where emp_id = ?");// 4.为占位符赋值pS.setInt(1,6);int res = pS.executeUpdate();if (res > 0) {System.out.println("成功删除");}else{System.out.println("删除失败");}pS.close();con.close();}
}
五、常见问题
1.资源的管理
2.SQL语句问题
3.SQL语句未设置参数问题
4.用户名或密码错误问题
5.通信异常
相关文章:

细致刨析JDBC ① 基础篇
目录 一、JDBC概述 1.JDBC的概念 编辑2.JDBC的核心组成 ① 接口规范: ② 实现规范: 二、JDBC快速入门 1.JDBC搭建步骤 三、核心API理解 1.注册驱动 2.Connection 3.Statement 4.PreparedStatement 5.ResultSet 四、基于Preparedment实现CRUD 1.查询单行单列 2.查询单行…...
Reactive 编程-Loom 项目(虚拟线程)
Reactive 编程与 Loom 项目(虚拟线程) Java 项目 Loom 是 Oracle 在 JVM 上的一项重大变革,旨在引入 虚拟线程(Virtual Threads),以简化并发编程。传统的 Java 线程是重量级的,由操作系统管理&…...
Windows下使用MinGW编译安装zmq的步骤
背景: 在开发过程中,需要使用zmq库进行数据交互,因此需要编译zmq库。 安装步骤 软件下载 https://github.com/zeromq/libzmq.git 下载,将代码切换到git checkout 4c6cff6391分支 软件编译 cd .\libzmq\ mkdir build cd .\bu…...
电商云账户分账系统:打造高效资金流转体系
在当今的电子商务时代,随着消费者购物习惯的转变和在线交易量的激增,电商平台的运营模式也日趋复杂。为了满足多商家共存、利益共享的需求,电商分账成为了一个至关重要的环节。 电商分账是指电商平台在销售商品或服务后,根据事先…...
设计模式 -- 单例设计模式
1.1 单例 创建一个单例对象 SingleModel , SingleModel 类有它的私有构造函数和本身的一个静态实例。 SingleModel 类提供了一个静态方法,供外界获取它的静态实例。 DesignTest 我们的演示类使用 SingleModel 类来获取 SingleModel 对象。 创建 Single…...

python fastapi 打包exe
创建虚拟环境 python -m venv 国内依赖仓库 # 换源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set install.trusted-host mirrors.aliyun.com 安装nuitka pip install nuitka 生成exe nuitka --mingw64 --show-progress --s…...
【测试开岗面试】知识点总结
1.知识点总结 Q:请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试 单元测试 (Unit Testing) 单元测试是对软件中最小可测试单元(通常是函数或方法)进行验证的过程。它的目的是确保每个单元在设计时的功能能够正常运行。单元测试通常由…...
【高级编程】synchronized 解决并发问题 类的线程安全类型
文章目录 并发问题同步方法同步代码块 线程安全类型ArrayListHashtableHashMapVector 多线程共享数据引发的问题 模拟 “A” “B” “C” 三人抢票,总票数10张,打印抢票情况以及剩余票数。 public class Site implements Runnable {int count 10; // …...
Speculative RAG:为知识密集型数据服务的RAG
论文链接 RAG的一个棘手问题是不知道该召回多少chunk,少了可能丢信息,多了会引入噪声信息。虽然有self-reasoning等自我反思的解决办法,但是整体链路太长,延迟高,不利于工业落地。 虽然无法面对整个服务场景ÿ…...

[Go]-抢购类业务方案
文章目录 要点:1. 抢购/秒杀业务的关键挑战2. 技术方案3.关键实现点4.性能优化建议5.其他考虑因素 细节拆分:1. **高并发处理**2.**限流与防护**3.**库存控制**4. **异步处理**5. **数据一致性**6. **常用架构设计**7. **代码示例**8. 进一步优化9. 注意…...
Android 源码多个Launcher设置默认Launcher
目录 第一部分、android10之前 一.多个launcher 启动设置默认launcher的核心类 二 在自定义服务里面设置默认Launcher 第二部分、android10之后 一、Launcher应用内置并设置为默认Launcher 1.通过ResolverActivity.java设置为默认Launcher 改法一: 改法二&am…...

计算机毕业设计 网上体育商城系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
深度学习中实验、观察与思考的方法与技巧
在深度学习中,实验、观察与思考是理解和改进模型性能的关键环节。以下是一些有效的方法与技巧,可以帮助你在深度学习实践中系统性地开展实验、分析结果并进行深入思考: 1. 明确实验目标 在开始实验前,确保对实验的目标有清晰的定…...

记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享
一、背景 某某项目,机房到期,需要迁移至其他机房; 此项目已经运行了3年多,fastdfs累计数据大概在250G 左右,现需要把旧的fastdfs数据迁移到新的fastdfs上; 采用scp物理迁移数据的方式,停机迁移…...

http连接github远程仓库密码问题解决办法
目录 一、问题:使用http连接失败 二、解决办法:使用个人访问令牌。 1、生成访问令牌: 步骤 1: 登录 GitHub 步骤 2: 进入设置页面 步骤 3: 生成新的访问令牌 步骤 4: 配置访问令牌 步骤 5: 复制令牌 2. 使用访问令牌 一、问题&#…...

LAMP环境下项目部署
目录 目录 1、创建一台虚拟机 centos 源的配置 备份源 修改源 重新加载缓存 安装软件 2、关闭防火墙和selinux 查看防火墙状态 关闭防火墙 查看SELinux的状态 临时关闭SELinux 永久关闭SELinux:编辑SELinux的配置文件 配置文件的修改内容 3、检查系统…...

Visual Studio 2022从外部引入dll导致的问题
这里以我学MapGIS二次开发的一个小demo为例 一、如何引入dll 1、在解决方案资源管理器中,有个引用的选项 2、然后右键点击添加引用 点击之后会出现如下: 3、点击浏览选项,选择想要引入dll的路径,这里我选择下载MapGIS 10的路径 …...

大模型从失败中学习 —— 微调大模型以提升Agent性能
人工智能咨询培训老师叶梓 转载标明出处 以往的研究在微调LLMs作为Agent时,通常只使用成功的交互轨迹,而丢弃了未完成任务的轨迹。这不仅造成了数据和资源的浪费,也可能限制了微调过程中可能的优化路径。论文《Learning From Failure: Integ…...
10.web应用体系以及windows网络常见操作应用
一、Dos命令 1.启动方式:winR,输入cmd 2.切换盘符/路径:盘符名称: (C:) cd 目录 (cd B111)(目录名按table键自动补全) 3.查看目录:dir dir /p 分页展示目录及…...

【数据结构与算法 | 灵神题单 | 前后指针(链表)篇】力扣19, 61,1721
1. 力扣19:删除链表的倒数第N个节点 1.1 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: …...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...