BCSP-玄子JAVA开发之JAVA数据库编程CH-08_JDBC
BCSP-玄子JAVA开发之JAVA数据库编程CH-08_JDBC
8.1 JDBC 介绍
8.1.1 什么是 JDBC
JDBC(Java Database Conectivity)
Java数据库连接技术的简称,提供连接各种常用数据库的能力
8.1.2 JDBC 的工作原理
JDBC API
内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如
- DriverManager类
- Connection接口
- Statement接口
- ResultSet接口
DriverManager
- 作用:管理各种不同的JDBC驱动
JDBC 驱动
- 提供者:数据库厂商
- 作用:负责连接各种不同的数据库
8.1.3 JDBC API
JDBC API 主要功能
-
与数据库建立连接、执行SQL 语句、处理结果
-
DriverManager :依据数据库的不同,管理JDBC驱动
-
Connection :负责连接数据库并担任传送数据的任务
-
Statement :由 Connection 产生、负责执行SQL语句
-
esultSet:负责保存Statement执行后的查询结果
8.2 使用 JDBC 连接数据库
8.2.1 导入 JDBC 驱动 JAR 包
数据库版本:MySQL5.7
MySQL官网下载对应的JDBC驱动JAR包
- mysql-connector-java-8.0.19.jar
驱动类
- com.mysql.cj.jdbc.Driver
8.2.2 纯 Java 驱动方式
使用纯Java方式连接数据库
-
由JDBC驱动直接访问数据库
-
优点:完全Java代码,快速、跨平台
-
缺点:访问不同的数据库需要下载专用的JDBC驱动
-
JDBC驱动由数据库厂商提供
8.2.3 JDBC编程模板
try {Class.forName(JDBC驱动类);# 1.加载JDBC驱动
} catch (ClassNotFoundException e) {//异常输出代码
} //… …
try {Connection con=DriverManager.getConnection(数据连接字符串,数据库用户名,密码);// 2.与数据库建立连接 Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM table1;");// 3.发送SQL语句,并得到返回结果 while (rs.next()) {int x = rs.getInt("a");String s = rs.getString("b");float f = rs.getFloat("c");}// 4.处理返回结果 rs.close();stmt.close(); con.close();// 5.释放资源
} //… …
8.2.4 数据库连接字符串
jdbc:数据库://ip:端口/数据库名称[连接参数=参数值]
- 数据库:表示JDBC连接的目标数据库
- ip: 表示JDBC所连接的目标数据库地址,如果是本地数据库,可为localhost,即本地主机名
- 端口:连接数据库的端口号
- 数据库名称:是目标数据库的名称
- 连接参数:连接数据库时的参数配置
连接本地MySQL中hospital数据库
jdbc:mysql://localhost:3306/hospital?serverTimezone=GMT-8
// 我国处于东八区,时区设置为GMT-8
8.2.5 Connection 接口
Connection是数据库连接对象的类型
| 方法 | 作用 |
|---|---|
| Statement createStatement() | 创建一个Statement对象将SQL语句发送到数据库 |
| PreparedStatement prepareStatement(String sql) | 创建一个PreparedStatement对象,将参数化的SQL语句发送到数据库 |
| boolean isClosed() | 查询此Connection对象是否已经被关闭。如果已关闭,则返回true;否则返回false |
| void close() | 立即释放此Connection对象的数据库和JDBC资源 |
8.2.6 连接本地 hospital 数据库
package XaunZiShare;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import java.sql.*;public class HospitalConn {private static Logger logger = LogManager.getLogger(HospitalConn.class.getName());public static void main(String[] args) {Connection conn = null;// 1、加载驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {logger.error(e);}try {// 2、建立连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital?serverTimezone=UTC","root", "root");System.out.println("数据库连接成功");} catch (SQLException e) {logger.error(e);} finally {// 3、关闭数据库连接try {if (null != conn) {conn.close();System.out.println("数据库连接断开");}} catch (SQLException e) {logger.error(e);}}}
}
8.2.7 常见异常
使用JDBC连接数据库时,经常出现的错误
- JDBC驱动类的名称书写错误,导致ClassNotFoundException异常
- 数据连接字符串、数据库用户名、密码错误,导致SQLException异常
- 数据库操作结束后,没有关闭数据库连接,导致仍旧占有系统资源
- 关闭数据库连接语句没有放到finally语句块中,导致语句可能没有被执行
8.3 Statement 操作数据库
Java执行数据库操作的一个重要接口,在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句
- Statement对象:执行不带参数的简单SQL语句
- PreparedStatement对象:执行带或不带In参数的预编译SQL语句
| 方法 | 作用 |
|---|---|
| ResultSet executeQuery(String sql) | 可以执行SQL查询并获取ResultSet对象 |
| int executeUpdate(String sql) | 可以执行插入、删除、更新的操作,返回值是执行该操作所影响的行数 |
| boolean execute(String sql) | 可以执行任意SQL语句。如果结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回false |
使用 executeQuery() 和 executeUpdate() 方法都需要啊传入 SQL 语句,因此,需要在 Java 中通过字符串拼接获得 SQL 字符串
8.3.1 Java 的字符串操作
String类
- 字符串常量一旦声明则不可改变
- String类对象可以改变,但改变的是其内存地址的指向
- 使用“+”作为数据的连接操作
- 不适用频繁修改的字符串操作
StringBuffer类
- StringBuffer类对象能够被多次修改,且不产生新的未使用对象
- 使用append()方法进行数据连接
- 适用于字符串修改操作
- 是线程安全的,支持并发操作,适合多线程
如果使用StringBuffer 生成了 String 类型字符串,可以通过 toString( ) 方法将其转换为一个 String 对象
- 需要拼接的字符串
String patientName="李明";
String gender="男";
String birthDate="2010-09-03";
- 使用+拼接字符串
//使用+拼接字符串
String sql = "insert into patient (patientName,gender,birthDate) values('"+patientName+"','"+gender+"','"+birthDate+"');";
System.out.println(sql);
- 使用StringBuffer拼接字符串
//使用StringBuffer拼接字符串
StringBuffer sbSql = new StringBuffer("insert into patient (patientName,gender,birthDate)" +" values('");sbSql.append(patientName+"','");
sbSql.append(gender+"','");
sbSql.append(birthDate+"');");
sql = sbSql.toString();
System.out.println(sql);
- SQL语句中,字符
"和'是等效的- 但在Java代码中拼接字符串时使用字符
'会使代码更加清晰- 也不容易出错引号、逗号或括号等符号必须成对出现
- 可在控制台输出拼接后的字符串,检查SQL语句是否正确
8.3.1 Statement 插入数据
使用Statement接口执行插入数据的操作的方法
- executeUpdate()方法
- execute()方法
如果希望得到插入成功的数据行数,可以使用executeUpdate()方法;否则,使用execute()方法
实现步骤
- 声明Statement变量
- 创建Statement对象
- 构造SQL语句
- 执行数据插入操作
- 关闭Statement对象
- 关闭顺序是后创建的对象要先关闭释放资源
演示案例
使用JDBC,向hospital数据库病人表中添加一个新的病人记录关键代码
package XaunZiShare;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class HospitalInsert {private static Logger logger = LogManager.getLogger(HospitalInsert.class.getName());public static void main(String[] args) {Connection conn = null;Statement stmt = null;String name = "张菲";// 姓名String gender = "女";// 性别String birthDate = "1995-02-12";// 出生日期String phoneNum = "13887676500";// 联系电话String email = "fei.zhang@qq.com";//邮箱String password = "909000";//密码String identityNum = "610000199502126100";//身份证号String address = "北京市";//地址// 1、加载驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {logger.error(e);}try {// 2、建立连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital?serverTimezone=UTC", "root", "root");// 创建Statement对象stmt = conn.createStatement();//构造SQLStringBuffer sbSql = new StringBuffer("insert into patient (patientName,gender,birthDate,phoneNum,email,password,identityNum,address) values ( '");sbSql.append(name + "','");sbSql.append(gender + "','");sbSql.append(birthDate + "','");sbSql.append(phoneNum + "','");sbSql.append(email + "','");sbSql.append(password + "','");sbSql.append(identityNum + "','");sbSql.append(address + "');");System.out.println(sbSql.toString());//3、执行插入操作stmt.execute(sbSql.toString());} catch (SQLException e) {logger.error(e);} finally {// 4、关闭数据库连接try {if (null != stmt) {stmt.close();}if (null != conn) {conn.close();System.out.println("数据库连接断开");}} catch (SQLException e) {logger.error(e);}}}
}
为了避免可能出现的乱码问题,可将指定数据库连接的编码集为UTF8,多个参数间使用字符&进行分隔
jdbc:mysql://localhost:3306/hospital?serverTimezone=GMT-8&useUnicode=true&characterEncoding=utf-8
8.3.2 Statement 更新数据
- 使用executeUpdate()方法或execute()方法实现更新数据的操作
- 使用Statement接口更新数据库中的数据的步骤与插入数据类似
实现步骤
- 声明Statement变量
- 创建Statement对象
- 构造SQL语句
- 执行数据更新操作
- 关闭Statement对象
需关注拼接的SQL字符串,以避免出错
演示案例
使用JDBC,将hospital数据库中patientID为13的病人电话更新为13627395833
package XaunZiShare;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class HospitalUpdate {private static Logger logger = LogManager.getLogger(HospitalUpdate.class.getName());public static void main(String[] args) {Connection conn = null;Statement stmt = null;int patientID = 13;// 病人编号String phoneNum = "13627395833";// 联系电话// 1、加载驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {logger.error(e);}try {// 2、建立连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital?serverTimezone=UTC", "root", "root");// 创建Statement对象stmt = conn.createStatement();//构造SQLStringBuffer sbSql = new StringBuffer("update patient ");sbSql.append("set phoneNum='" + phoneNum + "' ");sbSql.append("where patientID=" + patientID + ";");System.out.println(sbSql.toString());//3、执行插入更新操作int effectRowNum = stmt.executeUpdate(sbSql.toString());System.out.println("更新数据的行数:" + effectRowNum);} catch (SQLException e) {logger.error(e);} finally {// 4、关闭数据库连接try {if (null != stmt) {stmt.close();}if (null != conn) {conn.close();System.out.println("数据库连接断开");}} catch (SQLException e) {logger.error(e);}}}
}
8.3.3 ResultSet 接口
保存和处理Statement执行后所产生的查询结果
- 由查询结果组成的一个二维表
- 每行代表一条记录
- 每列代表一个字段
| 方法 | 说明 |
|---|---|
| boolean next() | 将游标从当前位置向下移动一行 |
| void close() | 关闭ResultSet 对象 |
| int getInt(int colIndex) | 以int形式获取结果集当前行指定列号值 |
| int getInt(String colLabel) | 以int形式获取结果集当前行指定列名值 |
| float getFloat(int colIndex) | 以float形式获取结果集当前行指定列号值 |
| float getFloat(String colLabel) | 以float形式获取结果集当前行指定列名值 |
| String getString(int colIndex) | 以String形式获取结果集当前行指定列号值 |
| String getString(String colLabel) | 以String形式获取结果集当前行指定列名值 |
- 要从中获取数据的列号或列名可作为方法的参数
- 根据值的类型选择对应的方法
ResultSet 接口 getXxx() 方法
- 获取当前行中某列的值
- 要从中获取数据的列号或列名可作为方法的参数
- 根据值的类型选择对应的方法
int类型 -> getInt()
float类型 -> getFloat()
String类型 -> getString()
假设结果集的第一列为patientID,存储类型为int类型,能够获得该列值的两种方法
//使用列号提取数据
int id = rs.getInt(1);
//使用列名提取数据
int id = rs.getInt("patientID");
- 列号从1开始计数,与数组下标从0开始计数不同
- 采用列名来标识列可读性强,且不容易出错
8.3.4 Statement 和 ResultSet 查询数据
使用 JDBC 从 hospital 数据库中查询前3个病人的编号、姓名、性别、住址信息并输出到控制台上
package XaunZiShare;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import java.sql.*;public class HospitalQuery {private static Logger logger = LogManager.getLogger(HospitalQuery.class.getName());public static void main(String[] args) {Connection conn = null;Statement stmt = null;ResultSet rs = null;int patientID = 13;// 病人编号String phoneNum = "13627395833";// 联系电话// 1、加载驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {logger.error(e);}try {// 2、建立连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital?serverTimezone=UTC", "root", "root");System.out.println("建立连接成功 !");// 创建Statement对象stmt = conn.createStatement();//构造SQLString sql = "select patientID,patientName,gender,address from patient limit 3;";//3、执行查询更新操作rs = stmt.executeQuery(sql);//4、移动指针遍历结果集并输出查询结果while (rs.next()) {System.out.println(rs.getInt("patientID") + "\t" +rs.getString("patientName") + "\t" +rs.getString("gender") + "\t" +rs.getString("address"));}} catch (SQLException e) {logger.error(e);} finally {// 5、关闭数据库连接try {if (null != rs) {rs.close();}if (null != stmt) {stmt.close();}if (null != conn) {conn.close();System.out.println("数据库连接断开");}} catch (SQLException e) {logger.error(e);}}}
}
8.4 PreparedStatement 操作数据库
8.4.1 SQL 注入攻击
通过提交一段SQL代码,执行超出用户访问权限的数据操作称为SQL注入(SQL Injection),SQL注入攻击是应用安全领域的一种常见攻击方式,会造成的数据库安全风险包括:刷库、拖库和撞库等,主要是没有对用户输入数据的合法性进行判断,导致应用程序存在安全隐患
使用JDBC实现医院管理系统用户登录验证功能
package XaunZiShare;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import java.sql.*;
import java.util.Scanner;public class HospitalLogin {private static Logger logger = LogManager.getLogger(HospitalLogin.class.getName());public static void main(String[] args) {Connection conn = null;Statement stmt = null;ResultSet rs = null;//根据控制台提示输入用户身份证号和密码Scanner input = new Scanner(System.in);System.out.println("用户登录");System.out.print("请输入身份证号:");String identityNum = input.next();System.out.print("请输入密码:");String password = input.next();// 1、加载驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {logger.error(e);}try {// 2、建立连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital?serverTimezone=UTC", "root", "123456");// 创建Statement对象stmt = conn.createStatement();//构造SQLStringBuffer sbSql = new StringBuffer("SELECT patientName FROM patient WHERE ");sbSql.append("password='" + password + "'");sbSql.append(" and identityNum='" + identityNum + "';");//3、执行查询更新操作rs = stmt.executeQuery(sbSql.toString());System.out.println(sbSql.toString());//4、验证用户名和密码if (rs.next()) {System.out.println("欢迎" + rs.getString("patientName") + "登录系统!");} else {System.out.println("密码错误!");}} catch (SQLException e) {logger.error(e);} finally {// 5、关闭数据库连接try {if (null != rs) {rs.close();}if (null != stmt) {stmt.close();}if (null != conn) {conn.close();}} catch (SQLException e) {logger.error(e);}}}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7QwIOIY-1680668171434)(./assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE20230404172438.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJPm8kaF-1680668171437)(./assets/%E6%90%9C%E7%8B%97%E6%88%AA%E5%9B%BE20230404172502.png)]
修改查询结构
8.4.2 PreparedStatement 接口
使用PreparedStatement 接口
- 继承自 Statement接口
- 与Statement对象相比,使用更加灵活,更有效率
PreparedStatement接口 (预编译的 SQL 语句)
-
提高代码可读性和可维护性
-
提高安全性
-
提高SQL语句执行的性能
| 方 法 | 作 用 |
|---|---|
| boolean execute() | 执行SQL语句,可以是任何SQL语句。如果结果是Result对象,则返回true。如果结果是更新计数或没有结果,则返回false |
| ResultSet executeQuery() | 执行SQL查询,返回该查询生成的ResultSet对象 |
| int executeUpdate() | 执行SQL语句,该语句必须是一个DML语句,比如:INSERT、UPDATE或DELETE语句;或者是无返回内容的SQL语句,比如DDL语句。返回值是执行该操作所影响的行数 |
| void setXxx(int index,xxx x) | 方法名Xxx和第二个参数的xxx均表示(如int,float,double等)基本数据类型,且两个类型需一致,参数列表中的x表示方法的形式参数。把指定数据类型(xxx)的值x设置给index位置的参数。根据参数类型的不同,常见方法有:setInt(int index,int x) 、setFloat(int index,float x)、setDouble(int index,double x)等 |
| void setObject(int index,Object x) | 除基本数据类型外,参数类型也可以是Object,可以将Object对象x设置给index位置的参数 |
8.4.3 PreparedStatement 操作数据
创建PreparedStatement对象
- 使用Connection接口prepareStatement(String sql)方法创建PreparedStatement对象
- 需要提前设置该对象将要执行的SQL语句
- SQL语句可具有一个或多个输入参数
设置输入参数的值
- 调用setXxx()方法完成参数赋值
执行SQL语句
- 调用PreparedStatement接口
- executeQuery()
- executeUpdate()
- execute()
- 方法执行SQL语句
验证用户输入的身份证号和密码
- 如果通过验证,则输出“欢迎[姓名]登录系统!”的信息;
- 否则输出“密码错误!”
package XaunZiShare;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import java.sql.*;
import java.util.Scanner;public class HospitalLogin {private static Logger logger = LogManager.getLogger(HospitalLogin.class.getName());public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;//根据控制台提示输入用户身份证号和密码Scanner input = new Scanner(System.in);System.out.println("用户登录");System.out.print("请输入身份证号:");String identityNum = input.next();System.out.print("请输入密码:");String password = input.next();// 1、加载驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {logger.error(e);}try {// 2、建立连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital?serverTimezone=UTC", "root", "123456");//3、构造PreparedStatement对象pstmt = conn.prepareStatement("SELECT patientName FROM patient WHERE identityNum=? and password=?");pstmt.setString(1, identityNum);pstmt.setString(2, password);rs = pstmt.executeQuery();//4、验证用户名和密码if (rs.next()) {System.out.println("欢迎" + rs.getString("patientName") + "登录系统!");} else {System.out.println("密码错误!");}} catch (SQLException e) {logger.error(e);} finally {// 5、关闭数据库连接try {if (null != rs) {rs.close();}if (null != pstmt) {pstmt.close();}if (null != conn) {conn.close();}} catch (SQLException e) {logger.error(e);}}}
}
8.4.4 PreparedStatement 的优势
实际开发中,推荐使用PreparedStatement接口执行数据库操作
- PreparedStatement与Statement接口相比,具有的优势
- 可读性和可维护性高
- SQL语句执行性能高
- 安全性更高
相关文章:
BCSP-玄子JAVA开发之JAVA数据库编程CH-08_JDBC
BCSP-玄子JAVA开发之JAVA数据库编程CH-08_JDBC 8.1 JDBC 介绍 8.1.1 什么是 JDBC JDBC(Java Database Conectivity) Java数据库连接技术的简称,提供连接各种常用数据库的能力 8.1.2 JDBC 的工作原理 JDBC API 内容:供程序员…...
一位程序员将一款开源工具变成了价值75亿美元的帝国
他的成功,激励着年轻的程序员为什么翻译这些程序员大佬的成功故事?除了写代码,作为开发者,我们也需要时不时地仰望星空。我们每个人都怀有着远大的理想,希望用代码改变自己的生活、行业,甚至是这个世界。编…...
tmux | 终端操作软件,解决深度学习中终端相关问题
tmux 一次可运行多个终端会话。或者在后台运行终端会话。当需要一次访问多个 ssh 会话或只是为了一个便利的流程管理时,这很有帮助。例如,可以在下载最新的系统更新时运行 htop,编辑配置文件并在一个 tmux 会话中重新启动服务。 对于我来说t…...
信号 捕捉
signal 函数 作用:注册一个信号捕捉函数(注册而非创建) 原型: sighandler_t signal(int signum, sighandler_t handler);typedef void (*sighandler_t)(int);案例一: signal函数 捕捉 ctrlc 触发事件 #include<std…...
sqlserver中判断是否存在的方法
自定义变量 declare age int declare name varchar(20) set name‘张三’ --用set 方法给变量赋值 注: 此方法一次只能给一个变量赋值 select ageage from client where [name]name --查询客户张三的年龄赋值给age变量 注:此方法能一次多个变量赋值 …...
基于Kettle跑批的案例说明
需求概述 通过动态配置表的方式完成在kettle里动态配置参数,并调用ktr,实现跑批的目的。 问题分析 定义一个ktr读取配置表的信息并将拷贝记录到结果定义一个ktr从结果里获取记录并设置变量定义业务ktr(即按照业务需要开发的…...
2023 最新版网络安全保姆级自学指南
前言 如今,组织的信息系统和数据面临着许多威胁。而人们了解网络安全的所有基本要素是应对这些威胁的第一步。 网络安全是确保信息完整性、机密性和可用性(ICA)的做法。它代表了应对硬盘故障、断电事故,以及来自黑客或竞争对手攻击等防御和恢复能力。而…...
Chapter9.3:线性系统稳定性分析及综合实例
该系列博客主要讲述Matlab软件在自动控制方面的应用,如无自动控制理论基础,请先学习自动控制系列博文,该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接:https://blog.csdn.net/qq_39032096/category_10287468…...
EXCEL 在复杂查询时摒弃vlookup() sumif() 等公式,而使用数据透视表的初步学习
1 为什么要用数据透视表 如果不用,就可能需要写很复杂的,查询公式 比如,vlookup各种sumif,sumifs 等等,如果还是多个表进行统计,那写起来更酸爽所以感觉 vlookup sumif,sumifs 更适合,简单情况下的查询&am…...
C 文件读写
C 文件读写 本章我们将介绍 C 程序员如何创建、打开、关闭文本文件或二进制文件。 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存…...
Linux中实现程序开机自启——将程序配置为系统服务
一、需求说明 当我们在Linux系统上安装软件时,希望软件实现开机自启,或程序崩溃后自动重启,提升软件运行的稳定性;而linux系统中的systemd刚好可以满足我们的要求(可将软件注册为系统服务)。 二、systemd systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务…...
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(13)
目录 写在前面: 题目:P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述: 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 代码: AC &am…...
【新2023Q2模拟题JAVA】华为OD机试 - 总最快检测效率 or 核酸检测效率
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:报数 题目 一百个人围成一圈…...
基于主成分分析的混音方法
一、简介: 基于主成分分析的混音方法是一种常见的音频混音技术,它利用主成分分析(PCA)对音频信号进行降维和重构,从而实现混音。 二、基本步骤如下: 采集和存储需要混音的音频信号。 对音频信号进行主成分…...
Code Two Exchange Crack
CodeTwo Exchange 迁移允许直接从早期版本的 Exchange(从 Exchange 2010 开始)安全、轻松地迁移到 Exchange 2019 和 2016。此服务器应用程序还允许您集中管理来自 Microsoft 365 (Office 365) 的邮箱迁移以及来自基于 IMAP 的电子邮件系统(例…...
jQuery.form.js 详细用法_维护老项目使用
概述 jquery-3.3.1.min.js : http://jquery.com/download jquery.form.min.js :http://malsup.com/jquery/form/#tab7 jquery form 是一个表单异步提交的插件,可以很容易提交表单,设置表单提交的参数,并在表单提交前…...
【Java】关于你不知道的Java大整数运算之BigInteger类超级好用!!!
目录 一、BigInteger类简单介绍 二、BigInteger构造方式 (1)构造方式 (2)输入方式 三、BigInteger常见的成员方法 (1)方法介绍 (2)方法使用演示 1.加减乘除余 2.比较 3.绝…...
运维是不是没有出路了?
瑞典马工的《是时候让运维集体下岗了》一出,就让运维人为之一颤,人人自危。文章开篇就提到:明人不说暗话,在云原生和DevOps成熟的今天,运维作为一个岗位和团队已经完成了历史任务,应该退出舞台了…...
【C++笔试强训】第七天
选择题 解析:内联函数(inline)一般用于代码较少,代码块里面没有递归且频繁调用的函数,是一种以空间换时间(不是指内存,而是指令变多编译出来的可执行程序会变大)的做法。内联函数在预…...
mysql binlog 一直追加写,磁盘满了怎么办?
文章目录 mysql binlog 清理策略1、设置binlog最大的文件数和文件大小2、定时清理过期binlog文件3、手动清理binlog文件4、禁用或启用binlogmysql binlog用于记录mysql数据库所有变更(数据库的DDL、DML操作)包括用户执行的语句,以及底层引擎所执行的操作的二进制日志,主要用…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
[特殊字符] Spring Boot底层原理深度解析与高级面试题精析
一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配,通过简化传统Spring应用的初始化和配置流程,显著提升开发效率。其底层原理可拆解为以下核心机制: 自动装配(Auto-Configuration) 核…...
