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操作)包括用户执行的语句,以及底层引擎所执行的操作的二进制日志,主要用…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...

如何做好一份技术文档?从规划到实践的完整指南
如何做好一份技术文档?从规划到实践的完整指南 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...

Axure Rp 11 安装、汉化、授权
Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...
MySQL基本操作(续)
第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...

Qt/C++学习系列之列表使用记录
Qt/C学习系列之列表使用记录 前言列表的初始化界面初始化设置名称获取简单设置 单元格存储总结 前言 列表的使用主要基于QTableWidget控件,同步使用QTableWidgetItem进行单元格的设置,最后可以使用QAxObject进行单元格的数据读出将数据进行存储。接下来…...

LangChain + LangSmith + DeepSeek 入门实战:构建代码生成助手
本文基于 Jupyter Notebook 实践代码,结合 LangChain、LangSmith 和 DeepSeek 大模型,手把手演示如何构建一个代码生成助手,并实现全流程追踪与优化。 一、环境准备与配置 1. 安装依赖 pip install langchain langchain_openai2. 设置环境变…...