MySQL之JDBC
我们在学习完了数据库的基本操作后,希望和我们的Java程序建立连接,那么我们今天就来一探究竟JDBC是如何让Java程序与数据库建立连接的
1. 什么是JDBC
JDBC(Java Data Base Connectivity, Java数据库连接) 是Java程序和数据库之间的桥梁,包含了⼀套Java定义的用于执⾏SQL语句的接口,使开发者能够编写数据库的程序。JDBC 的主要作⽤是:与数据库建⽴连接、发送SQL语句和处理数据库执行结果。
2. 为什么要使用JDBC
⾸先回顾⼀下使⽤客户端操作数据库的过程,主要分为以下几步:
a. 确定数据库服务器的地址,端口号,指定用户名密码
b.连接到数据库服务
c. 发送SQL语句
d. 得到返回结果并显示
e. 断开连接
-
同样如果使用程序操作数据库也会经历以上几步,⼤家应该可以想到,为实现上述步骤,可以编写相应的代码实现数据库连接,发送SQL语句,处理结果并显示,最后关闭连接。
-
但是不同的数据库服务器对于同⼀个操作不论是协议还是参数都各有不同,如果让程序员自己去实现,那就必须针对不同的数据库进行编码实现,这个⼯作量和维护成本显然太大。
-
Java采取的做法是把以上操作步骤定义了相应的接⼝,具体的实现交给数据库厂商去做,Java程序员只需要按照需要调用接⼝中定义的方法即可,这样不论使用什么数据库,都对于Java程序没有任何影响,即便是换⼀个数据库,也只需要换⼀下相应厂商的实现依赖即可。
-
JDBC使⽤过程可以概括为:加载数据库厂商的驱动包、建立连接、创建Statement、执行SQL、 处理结果释放资源和关闭连接。
3. 使用JDBC
3.1 获取MySQL厂商的驱动包(依赖,JAR包)
由于数据库厂商的驱动包过多,不好查询,我们推荐一个网址,里面有所有的数据库厂商提供的驱动包:MAVEN
3.2 创建Maven⼯程
3.3 配置国内镜像
<mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿⾥云公共仓库</name><url>https://maven.aliyun.com/repository/public</url></mirror><mirror><id>central</id><mirrorOf>*</mirrorOf><name>aliyun central</name><url>https://maven.aliyun.com/repository/central</url></mirror>
3.4 加载数据库厂商的驱动包
//固定写法,其中Driver是一个Java实现的类
Class.forName("com.mysql.cj.jdbc.Driver");
3.5 建立连接
- 使用驱动管理类
DriverManager
的静态方法获取数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/yu?" "characterEncoding=utf8" +"&allowPublicKeyRetrieval=true&useSSL=false", "root", "123456");
MySQL数据库连接URL格式:jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false
其中:
jdbc:mysql://
-> 固定写法
127.0.0.1:3306/
-> IP+端口号,直接使用即可,无需修改
yu为我本地数据库
-> 根据自己要连接的数据库写即可
characterEncoding=utf8
-> 字符集编码
&allowPublicKeyRetrieval=true&useSSL=false
-> 默认即可
root
-> 本地数据库名
123456
-> 我的数据库连接密码
- 通过数据源
DataSource
对象获取,推荐在实际开发中应用这种方式
3.6 创建Statement
Statement是⽤于执⾏静态SQL语句并返回执行结果的对象
// 通过connection获取statement对象
Statement statement = connection.createStatement();
QQ20241125-232419
3.7 定义SQL语句
//可根据相关需求定义,此处仅是示例
String sql = "select * from student";
3.8 执行SQL
- 执行select查询时返回的是⼀个结果集,⽤ResultSet接收
//接受查询结果
ResultSet resultSet = statement.executeQuery(sql);
接受完后,我们可以对接受的结果集进行打印
//执行返回结果while (resultSet.next()) {long id = resultSet.getLong("id");String name = resultSet.getString("name");String sno = resultSet.getString("sno");int age = resultSet.getInt("age");short gender = resultSet.getShort("gender");Date enrollDate = resultSet.getDate("enroll_date");long classId = resultSet.getLong("class_id");System.out.println(MessageFormat.format("学生编号={0}, 姓名={1}, 学号={2}, 年龄={3}, 性别={4}, 入学时间={5}, " +"班级编号={6}", id, name, sno, age, gender, enrollDate, classId));}
- 执行insert,update,delete操作时,返回的是受影响的⾏数,⽤int类型接收(int接受的值用于判断更新操作是否成功,1表示成功,0表示失败)
3.9 处理结果释放资源和关闭连接
在整个数据库访问过程中创建的对象都需要释放,包括:ResultSet,Statement和Connection,后创建的先释放,建议在try
catch 语句后的finally代码块中写入,以便程序无论最后是否执行成功,都能保证释放资源和关闭连接
if(resultSet!=null){resultSet=null;}if(statement!=null){statement =null;}if(connection!=null){connection =null;}
4. JDBC常用接口和类
4.1 DriverManager 和DataSource
- DataSource驱动管理类,⽤于管理JDBC驱动程序,可以从驱动程序中获取数据库连接,始于JDK1.1。
- DataSource数据源是DriverManager的替代⽅案,始于JDK1.4,是获取数据库连接的首选方法,推荐使用。
4.2 DriverManager 与DataSource的区别
- DriverManager和DataSource都可以获取到数据库连接,但它们之间存着着⼀些区别,主要在于连接的管理方式和资源利用效率
- 连接管理方式不同:
①DriverManager每次调用getConnection方法都会初始化⼀个新的连接(上文Driver类中,我们注意到过源码中就有new Driver()),使用完成后会关闭真实连接,导致资源浪费
②DataSource使用了连接池的技术,会在初始化时创建⼀定数量的数据库连接,这些连接可以重复使用,关闭时并不是真正关闭连接,而是将连接归还给连接池,以供后续使用,有效地提高资源利用率和和性能
4.3 Connection 数据库连接
数据库连接(会话)对象,在连接的上下文中执行SQL语句并返回结果
4.3.1 Statement对象
- ⽤于执⾏静态SQL语句并返回执⾏结果,由于只能执⾏静态语句,所以这⾥会有⼀个问题,假设⼀个语句中需要动态的参数,⽐如where⼦句中的条件,那么只能通过字符串拼接的⽅式组装完成的SQL语句,比如:
String sql = "select * from student where name = '" + name + "' and class_id =
" + classId;
- 字符串拼接形式构造SQL语句时,如果不处理参数中的特殊字符就会造成SQL注⼊,这是⼀个非常严重的安全性问题。
4.3.2 SQL注入
4.3.3 PreparedStatement
- 预编译SQL语句对象,SQL语句被预编译并存储在PreparedStatement对象中,可以使用该对象多次执行SQL语句,同时可以解决SQL注入问题。
示例:通过Connection对象获取到PreparedStatement对象,需要传⼊SQL模板,动态参数用占位符?
表示
// 获取了个处理SQL的PrepareStatement对象
PreparedStatement preparedStatement = connection.prepareStatement("select id,
name, sno, age, gender, enroll_date, class_id from student where name = ? and
class_id = ?");
- 为动态参数设置真实值,下标从1开始
// ⽤真实值去替换占位符
preparedStatement.setString(1, "宋江");
preparedStatement.setLong(2, 2);
- 执行SQL语句
// select 操作
ResultSet resultSet = statement.executeQuery();
// insert, update, delete操作
//増 删 改 返回的是受影响的行数
int result = statement.executeUpdate();
//1 表示插入成功,0表示错误
4.3.4 CallableStatement
用于执行SQL存储过程的接⼝。
4.3.5 executeQuery()
执行结果返回的是⼀个结果集,通常⽤于select操作
4.3.6 executeUpdate()
执行结果返回的是⼀个整形,通常用于insert,update,delete操作
4.3.7 ResultSet结果集
- 是⼀个查询结果集的数据表,通常由执行查询操作的语句生成。
- ResultSet对象维护了⼀个指向当前数据行的游标,最初游标位于第⼀行之前,调用next方法将游标移动到下⼀行,当ResultSet中没有更多的数据行时返回false,所以可以在while循环中使用它来遍历结果集。
- ResultSet接⼝提供了getter方法(getBoolean、getLong等),用于从当前行检索列值,可以使用列的索引号或列的名称来检索值。⼀般来说,使用列索引会更有效率,索引编号从1开始,按照从左到右的顺序读取。
5. 示例
查询名字为唐三藏的信息
import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;
public class TestDataSource {public static void main(String[] args) {// 定义MYSQL数据源对象MysqlDataSource mysqlDataSource = new MysqlDataSource();// 设置数据库连接串mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/yu?characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false");// 用户名mysqlDataSource.setUser("root");// 密码mysqlDataSource.setPassword("123456");// 定义JDBC的数据源对象DataSource dataSource = mysqlDataSource;// 定义数据库连接对象Connection connection = null;// 定义预处理SQL执行对象PreparedStatement statement = null;// 定义结果集对象ResultSet resultSet = null;try {// 1. 通过数据源对象获取数据库连接connection = dataSource.getConnection();// 定义SQL语String sql = "select id, name, sno, age, gender, enroll_date, class_id from student where name = ?";// 2. 预处理SQL执行对象statement = connection.prepareStatement(sql);// 接收用户的输入System.out.println("请输入学生姓名:");Scanner scanner = new Scanner(System.in);String inName = scanner.next();// 3. 用真实的值替换占位符statement.setString(1, inName);// 4. 执行SQL 获取结果resultSet = statement.executeQuery();// 5. 遍历结果集// 6. 遍历结果集,获取数据行while (resultSet.next()) {// 获取ID列的值long id = resultSet.getLong(1);// 获取name列的值String name = resultSet.getString(2);String sno = resultSet.getString(3);int age = resultSet.getInt(4);byte gender = resultSet.getByte(5);Date enrollDate = resultSet.getDate(6);long classId = resultSet.getLong(7);System.out.println(MessageFormat.format("学生编号={0}, 姓名={1}, 学号={2}, 年龄={3}, 性别={4}, 入学时间={5}, " +"班级编号={6}", id, name, sno, age, gender, enrollDate, classId));}} catch (SQLException e) {e.printStackTrace();} finally {// 释放结果集对象if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}// 释放Statementif (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}// 关闭数据库连接if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
相关文章:
MySQL之JDBC
我们在学习完了数据库的基本操作后,希望和我们的Java程序建立连接,那么我们今天就来一探究竟JDBC是如何让Java程序与数据库建立连接的 1. 什么是JDBC JDBC(Java Data Base Connectivity, Java数据库连接) 是Java程序和数据库之间…...
家校通小程序实战教程04教师管理
目录 1 创建数据源2 搭建管理后台3 搭建查询条件4 功能测试总结 我们上一篇介绍了如何将学生加入班级,学生加入之后就需要教师加入了。教师分为任课老师和班主任,班主任相当于一个班级的管理员,日常可以发布各种任务,发布接龙&…...
vitess使用记录:vtctldclient,设置分表规则
继续探索未完成的事情。 vitess使用记录系列已经写了好几篇了,记录了在测试过程中遇到的各种问题。《vitess使用:从部署到go客户端连接查询》、《vitess使用记录:vtctldclient》、《vitess使用:基于源码运行vtctldclient工具》整…...
Windows利用conda安装gpu版本Faiss + Ubuntu源码安装Faiss-gpu 记录(待更新~)
前言 由于在cpu上使用对向量检索算法时,发现面对数据量较大时,批量匹配耗时会显著增加,影响业务整体响应。便尝试使用GPU来实现检索计算,限于本人技术有限,写不出好算法。便取巧利用Faiss-gpu来检索(* ^ ▽ ^ *) 以下…...
react学习记录
目录结构react优秀代码之react目录结构简洁之道React 作为一个库,不会决定你如何组织项目的结构。这是件好事,因为这样 - 掘金【React】项目的目录结构全面指南_react项目结构-CSDN博客 生命周期【React 面经】生命周期详解:不同阶段与方法解…...
MaskRCNN训练自己的数据集
一. 数据标注 1. 安装labelme软件 conda install labelme2. 运行labelme # 命令行中直接输入 labelme3. 标注 二、训练数据处理 1. 在根目录下创建datasets/demo1文件夹,创建如下几个文件夹 2. 将标注好的.json文件放在json文件夹中 3. 原图放在pic文件夹中 4. …...
metawrap bin_refinement输入checkm数据库地址
这是运行metawrap bin_refinement -o bin_refinement -t 30 -A binning/metabat2_bins/ -B binning/maxbin2_bins/ -C binning/concoct_bins/ -c 50 -x 10 时遇到的报错(在命令行跑的时候遇到的) 参考metaGEM使用小记(解决各种问题)2024 2(三…...
Spring Web MVC其他扩展(详解下)
文章目录 Spring MVC其他扩展(下)异常处理异常处理机制声明式异常好处基于注解异常声明异常处理 拦截器拦截器概念拦截器使用拦截器作用位置图解拦截器案例拦截器工作原理源码 参数校验校验概述操作演示SpringMVC自定义参数验证ValueObject(VO) 文件上传…...
深度学习之 SegNet
可训练的图像分割引擎,包含一个encoder网络,一个对应的decoder网络,衔接像素级分类层,解码网络与VGG16的13层卷积层相同。解码网络是将低分辨率的编码特征图映射到全分辨率的特征图。解码网络使用最大池化层的池化索引进行非线性上…...
Taro React小程序开发框架 总结
目录 一、安装 二、目录结构 三、创建一个自定义页面 四、路由 1、API 2、传参 3、获取路由参数 4、设置TabBar 五、组件 六、API Taro非常好用的小程序框架,React开发者无缝衔接上。 一、安装 官方文档:Taro 文档 注意,项目创建…...
《Django 5 By Example》阅读笔记:p339-p358
《Django 5 By Example》学习第12天,p339-p358总结,总计20页。 一、技术总结 1.项目(购物网站) django-admin startproject myshop 虽然这里只是示例,但我觉得这种命名为 myxxx 的习惯非常不好,因为在实际应用中,是…...
CSS:Web美学的革新之旅
自HTML的诞生之日起,Web页面设计便踏上了一段不断进化的旅程。起初,HTML作为构建网页的骨架,仅承载着最基本的文本结构与少量显示属性。然而,随着互联网的蓬勃发展和用户对视觉体验需求的日益增长,HTML开始不堪重负&am…...
java全栈day10--后端Web基础(基础知识)之续集
一、Servlet执行流程 二、Http协议(相对Tomcat和servlet重要一点) 2.1Http-概叙 2.2Http-请求协议 2.2.3请求数据格式 2.2.3请求数据获取 先启动服务器 访问/hello Servlet 访问浏览器端Http协议数据 查看数据...
MySQL 与 MongoDB 存储差异分析
MySQL 与 MongoDB 存储差异分析:为什么随机生成数据的存储空间不同? 在实际应用中,我们常常需要选择合适的数据库系统来处理不同类型的数据。在这个过程中,数据库的 存储机制 和 性能优化 起着至关重要的作用。对于很多开发者来说…...
【ArcGIS Pro实操第10期】统计某个shp文件中不同区域内的站点数
统计某个shp文件中不同区域内的站点数 方法 1:使用“空间连接 (Spatial Join)”工具方法 2:使用“点计数 (Point Count)”工具方法 3:通过“选择 (Select by Location)”统计方法 4:通过“Python 脚本 (ArcPy)”实现参考 在 ArcGI…...
Django-Vue3-Admin - 现代化的前后端分离权限管理系统
项目介绍 Django-Vue3-Admin是一个基于RBAC(Role-Based Access Control)模型的综合性基础开发平台,专注于权限控制,支持列级别的细粒度权限管理。该项目采用前后端分离架构,技术栈包括: 后端: Django Django REST …...
【Java基础入门篇】二、控制语句和递归算法
Java基础入门篇 二、控制语句和递归算法 2.1 switch-case多分支选择语句 switch执行case语句块时,若没有遇到break,则运行下一个case直到遇到break,最后的default表示当没有case与之匹配时,默认执行的内容,代码示例如…...
PS的功能学习
背景差色较大,就魔棒 魔棒的连续就是倒水点的跨越问题 魔棒的容差的选择就有点看经验了,看颜色的统一程度选择 Ctrl D 取消当前所有的选区 至于快速选择工具,和对象选择工具也差不多,只不过控制范围变成了一块一块的&#x…...
yolov8的深度学习环境安装(cuda12.4、ubuntu22.04)
目录 一、先安装基础环境包 1.首先给Ubuntu安装Chrome浏览器(搜索引擎换成百度即可) 2、ubuntu 22.04中文输入法安装 3、安装 terminator 4、安装WPS for Linux 5、安装其它之前需要先安装anaconda 6、安装配置anaconda 7、安装完成anaconda后创建…...
《JavaEat:探索 Java 在美食世界的奇妙之旅》
在当今数字化的时代,编程语言的应用领域不断拓展,而 Java 作为一种广泛使用且功能强大的编程语言,其影响力早已超越了传统的软件开发范畴。当我们将目光聚焦在美食领域时,会惊喜地发现 Java 也能在其中发挥独特而重要的作用。本文…...
将excel文件中的信息读取后批量生成word文件
在日常办公过程中,可能需要把excel文件中的信息批量生成成百上千份word文档,便于打印、发邮件或存档等,比如根据excel中的合格人员招聘信息生成word合同文件,或是根据excel中的参会人员名单生成word参会通知等。 首先需要制作wor…...
Android 图形系统之三:SurfaceControl
在 Android 系统中,SurfaceControl 是一个关键的类,用于管理应用窗口和屏幕上的显示内容。它与 SurfaceFlinger 紧密交互,通过 BufferQueue 提供高效的图形缓冲区管理能力。SurfaceControl 是 Android 的显示架构中不可或缺的部分,…...
Nodemailer使用教程:在Node.js中发送电子邮件
目录 1. 简介 2. 安装 3. 基本配置 3.1 创建传输器 3.2 配置说明 4. 发送邮件 4.1 基本发送示例 4.2 发送验证码示例 5. 常见问题解决 5.1 "Greeting never received" 错误 5.2 安全建议 SMTP与邮件加密协议详解 1. SMTP简介 1.1 基本特点 2. 加密协…...
shell第二次作业
1. 使用case实现成绩优良差的判断 read -p "请输入你的成绩:" score if ! [[ "$score" ~ ^[0-9]$ ]];then echo "请输入数字" exit 1 fi if [ "$score" -lt 0 ] || [ "$score" -gt 100 ];then echo …...
MySQL Linux 离线安装
下载 进入官网,下载对应的需要MySQL版本,这里是历史版本。 官网 选择第一个MySQL Community Sever社区版,因为这个是免费的。 选择需要的对应版本: 安装 1.将下载好的安装包上传到服务器端 使用FinalShell 客户端连接服务器 …...
万字长文解读深度学习——多模态模型BLIP2
🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总 万字长…...
postman使用正则表达式提取数据实战篇!
之前篇章中postman多接口关联使用的是通过JSON提取器的方式进行提取。 除了JSON提取器提取数据外还可通过另一种方式——正则表达式来提取数据。 1、使用正则表达式提取器实现接口关联,match匹配 正则匹配表达式将需要提取的字段key:value都放入表达式中ÿ…...
Docker for Everyone Plus——Unbreakable!
修改一下telnet的端口配置,访问第二小问,sudo -l命令允许提权执行的命令: 发现多了这两个限制--security-optno-new-privileges,表明docker run命令必须带上--security-optno-new-privileges参数,这可以防止通过suid机…...
龙迅#LT6912适用于HDMI2.0转HDMI+LVDS/MIPI,分辨率高达4K60HZ,支持音频和HDCP2.2
1. 描述 LT6912是一款高性能的HDMI2.0转HDMI和LVDS和MIPI转换器。 HDMI2.0 输入和输出均支持高达 6Gbps 的数据速率,为4k60Hz视频提供足够的带宽。此外,还支持 HDCP2.2 进行数据解密(无数据 加密)。 对于 LVDS 输出,…...
Linux自动化部署方法(Linux Automated Deployment Method)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...
Jmeter测试工具的安装和使用,mac版本,jmeter版本5.2.1
Jmeter测试工具的安装和使用JSON格式请求 一、安装1、安装jdk包和设置java环境2、去官网下载Jmeter3、解压后,打开mac终端,进入apache-jmeter的bin文件开启jmeter 二、使用jmeter1、添加线程2、添加HTTP请求3、配置请求的协议、IP地址、端口号、请求方法…...
2024-2025 ICPC, NERC, Southern and Volga Russian Regional Contest(cf)(个人记录)
A: 思路:一开始有点懵逼,理解错题意了}, 由于是顺序分配,因此前面的人可以选择的条件更多,后面的人更少,我们从后向前遍历即可 #include<bits/stdc.h>using namespace std;typedef long long ll; ty…...
009 STM32 HAL库介绍
STM32 HAL库(Hardware Abstraction Layer)是STMicroelectronics为STM32系列微控制器提供的一套硬件抽象层库,它旨在简化STM32的开发过程,提高代码的可移植性和可维护性。HAL库通过提供一组统一的API接口,使得开发者无需…...
Java的常识
程序员分类 初级程序员(大学毕业一年以内)大概月薪:2-5K 初中级程序员(工作经验2-3年)大概月薪:6-10K 中级程序员(工作经验4-5年)大概月薪:10-15K 高级程序员(工作经验5++)大概月薪:15K++ 普通公司对于程序员的月薪资天花板25K 工作实景 微信小程序、手机APP、写…...
FreeRTOS——列表及列表项
目录 一、概念及其应用 1.1列表List_t 1.2列表项ListItem_t 1.3迷你列表项MiniListItem_t 二、相关API 三、实现原理 3.1列表初始化 3.2列表项初始化 3.3插入列表项 3.4尾插列表项 3.5列表项的删除 3.6列表的遍历 一、概念及其应用 作为多任务的核心,列…...
ChatGPT 网络安全秘籍(三)
第五章:安全意识和培训 在这一章中,我们将深入探讨网络安全培训和教育的迷人领域,强调了 OpenAI 的大型语言模型(LLMs)在增强和丰富这一关键过程中可以发挥的重要作用。我们将踏上一段旅程,发现 ChatGPT 如…...
深度学习与知识图谱嵌入的结合:从理论到实践
知识图谱嵌入方法主要包括两大类: 方法类型描述矩阵分解类方法基于传统矩阵分解思想,将知识图谱的三元组表示为多个矩阵,并通过分解获得低维向量表示。神经网络方法结合深度学习技术,通过神经网络自动学习知识图谱中实体和关系的…...
Java集成Sa-Token进行认证与授权
引言 软件开发过程中都必须要有的一个功能,那就是认证与授权,经过大佬们的不断更新迭代,使得如今实现认证与授权功能变得相对简单,也许你并不能真正的接触到认证与授权这一功能,除非你接触的项目是从0到1的,…...
【附录】Rust国内镜像设置
目录 前言 (1)设置环境变量 (2)安装Rust (3)设置crates镜像 前言 本节课来介绍下如何在国内高速下载安装Rust和Rust依赖,由于网络原因,我们在安装Rust和下载项目依赖时都很慢&am…...
Rust编程语言代码详细运行、编译方法
以下是针对不同类型的 Rust 代码(以常见的命令行程序为例)详细的运行方法: 前提条件 在运行 Rust 代码之前,确保你已经在系统上安装了 Rust 编程语言环境。如果尚未安装,可以通过以下步骤进行安装: 访问…...
Unity ShaderLab 实现交互地毯
实现思路: 将一个位置坐标值传入到shader的顶点着色器中,和这个值位置相同的顶点沿着法线的y轴方向偏移,然后计算这个值与顶点的距离,在这个范围内的顶点,和凸起的点的位置做插值操作。 Shader Graph实现如下&#x…...
Scala模式匹配——高阶用法
(一)scala的模式匹配 (1)常量 (2)变量 (3)构造器 (4)序列 (5)元组 (6)类型 (7)…...
【简单好抄保姆级教学】javascript调用本地exe程序(谷歌,edge,百度,主流浏览器都可以使用....)
javascript调用本地exe程序 详细操作步骤结果 详细操作步骤 在本地创建一个txt文件依次输入 1.指明所使用注册表编程器版本 Windows Registry Editor Version 5.00这是脚本的第一行,指明了所使用的注册表编辑器版本。这是必需的,以确保脚本能够被正确解…...
C#热更原理与HybridCLR
一、Mono的诞生 在Mono之前,C#虽然很好,但是只在windows家族平台上使用,就这点C#与Java就无法比。于是微软公司向ECMA申请将C#作为一种标准。在2001年12月,ECMA发布了ECMA-334 C#语言规范。C#在2003年成为一个ISO标准(ISO/IEC 23270)。意味着只要你遵守CLI(Common Lang…...
arcgis for js点击聚合要素查询其包含的所有要素
功能说明 上一篇讲了实现聚合效果, 但是点击聚合效果无法获取到该聚合点包含的所有点信息 这一篇是对如何实现该功能的案例 实现 各属性说明需要自行去官网查阅 官网案例 聚合API 没空说废话了, 加班到12点,得休息了, 直接运行代码看效果就行, 相关重点和注意事项都在代码注…...
k8s Init:ImagePullBackOff 的解决方法
kubectl describe po (pod名字) -n kube-system 可查看pod所在的节点信息 例如: kubectl describe po calico-node-2lcxx -n kube-system 执行拉取前先把用到的节点的源换了 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"re…...
HASH256开源代码计算错误问题
计算量超500KB报错 OTA升级中可能会涉及到CRC、hash校验等算法,小编从网上抄到了HASH256的源码,拿来使用的时候却发现了一个问题,当源文件约大于500KB的时候会发现其计算出的hash值出现错误。 经过实际测试得知,当源文件大于约50…...
对象流—ObjectInputStream 和 ObjectOutputStream
对象流(ObjectInputStream和ObjectOutputStream)是Java中用于读写对象的流,可以将对象直接写入到流中,或者从流中读取对象。 ObjectOutputStream将对象序列化为字节流,可以将对象写入文件或网络流中。ObjectInputStream则将字节流反序列化为…...
【Fargo】27:ffmpeg ffprobe 和python分析h264文件并绘制
从帧和包两个层面进行分析。帧级别分析 ffprobe 可以读取264文件信息 -Y9KP MINGW64 /d/XTRANS/thunderbolt/ayame/zhb-bifrost/player-only (main) $ ffprobe test.h264 ffprobe version N-116778-g7e4784e40c-20240827 Copyright (c) 2007-2024 the FFmpeg developersbuilt …...
Debezium Engine监听binlog实现缓存更新与业务解耦
飞书文档 解决缓存与数据源数据不一致的方案有很多, 各有优缺点; 1.0、旁路缓存策略, 直接同步更新 读取流程: 查询缓存。如果缓存命中,则直接返回结果。如果缓存未命中,则查询数据库。将数据库查询到的数据写入缓存,并设置一个…...