Java零基础教学文档第三篇:JDBC

今日新篇章
【JDBC】
【主要内容】

  1. JDBC概述

  2. 使用JDBC完成添加操作

  3. 使用JDBC完成更新和删除

  4. DBUtils的简单封装

  5. 使用JDBC完成查询

  6. 使用JDBC完成分页查询

  7. 常用接口详解

  8. JDBC批处理

  9. SQL注入问题

  10. 事务处理解决转账问题

  11. 连接池

  12. 使用反射对DBUtils再次的封装

  13. BaseDAO的封装

【学习目标】
在这里插入图片描述

1. JDBC概述

1.1 什么是JDBC
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
在这里插入图片描述

1.2 JDBC的原理
早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动!
在这里插入图片描述

JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。

当然还有第三方公司专门为某一数据库提供驱动,这样的驱动往往不是开源免费的!

1.3 程序员,JDBC,JDBC驱动的关系及说明
1.3.1 JDBC API
提供者:Sun公司

内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如

DriverManager类 作用:管理各种不同的JDBC驱动

Connection接口

Statement接口

ResultSet接口

1.3.2 JDBC 驱动
提供者:数据库厂商

作用:负责连接各种不同的数据库

1.3.3 Java程序员
JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。

1.3.4 三方关系
SUN公司是规范制定者,制定了规范JDBC(连接数据库规范)

数据库厂商微软、甲骨文等分别提供实现JDBC接口的驱动jar包

程序员学习JDBC规范来应用这些jar包里的类。
在这里插入图片描述

1.4 总结
简单地说,JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。
在这里插入图片描述

DriverManager :依据数据库的不同,管理JDBC驱动

Connection :负责连接数据库并担任传送数据的任务

Statement :由 Connection 产生、负责发送执行SQL语句

ResultSet:负责保存Statement执行后所产生的查询结果

2. JDBC操作数据库的步骤

2.1 总体步骤

  1. 加载一个Driver驱动

  2. 创建数据库连接(Connection)

  3. 创建SQL命令发送器Statement

  4. 创建SQL

  5. 通过Statement发送SQL命令并得到结果

  6. 处理SQL结果(select语句)

  7. 关闭数据库资源

ResultSet

Statement

Connection

2.2 详细步骤
2.2.1 加载驱动
加载JDBC驱动是通过调用方法java.lang.Class.forName(),下面列出常用的几种数据库驱动程序加载语句的形式 :

Class.forName(“oracle.JDBC.driver.OracleDriver”);//使用Oracle的JDBC驱动程序

Class.forName(“com.microsoft.JDBC.sqlserver.SQLServerDriver”);//使用SQL Server的JDBC驱动程序

Class.forName(“com.ibm.db2.JDBC.app.DB2Driver”);//使用DB2的JDBC驱动程序

Class.forName(“com.mysql.jdbc.Driver”);//使用MySql的JDBC驱动程序

2.2.2 创建数据库连接
与数据库建立连接的方法是调用DriverManager.getConnection(String url, String user, String password )方法

Connection conn=null;

String url=“jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&charsetUnicode=UTF8”;

String user=“root";

String password=“123456";

conn = DriverManager.getConnection(url, user, password);

2.2.3 创建Statement并发送命令
Statement对象用于将 SQL 语句发送到数据库中,或者理解为执行sql语句

有三种 Statement对象:

Statement:用于执行不带参数的简单SQL语句;

PreparedStatement(从 Statement 继承):用于执行带或不带参数的预编译SQL语句;

CallableStatement(从PreparedStatement 继承):用于执行数据库存储过程的调用。
在这里插入图片描述

2.2.4 处理ResultSet结果
ResultSet对象是executeQuery()方法的返回值,它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。

ResultSet里的数据一行一行排列,每行有多个字段,且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。

ResultSet对象自动维护指向当前数据行的游标。每调用一次next()方法,游标向下移动一行。

初始状态下记录指针指向第一条记录的前面,通过next()方法指向第一条记录。循环完毕后指向最后一条记录的后面。
在这里插入图片描述

2.2.5 关闭数据库资源
作为一种好的编程风格,应在不需要Statement对象和Connection对象时显式地关闭它们。关闭Statement对象和Connection对象的语法形式为:

public void close() throws SQLException

用户不必关闭ResultSet。当它的 Statement 关闭、重新执行或用于从多结果序列中获取下一个结果时,该ResultSet将被自动关闭。

注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和ResultSet是需要连接是才可以使用的,所以在使用结束之后有可能其他的Statement还需要连接,所以不能先关闭Connection。

3. 准备工作

3.1 创建数据并创建student表
在这里插入图片描述

3.2 创建项目
在这里插入图片描述
在这里插入图片描述

3.3 创建lib目录并引入MYSQL驱动包
在这里插入图片描述

3.4 把lib包引入项目环境
在这里插入图片描述
在这里插入图片描述

4. 使用JDBC完成添加操作

4.1 步骤
Ø 加载MySQL的JDBC驱动

Ø 建立数据的连接

Ø 创建SQL命令的发送器

Ø 编写SQL

Ø 使用SQL命令发送器发送SQL命令并得到结果

Ø 处理结果

Ø 关闭数据库资源

4.2 代码
package com.bjpowernode.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Test01Add {
// 驱动器路径
private static final String DRIVER = “com.mysql.jdbc.Driver”;
//连接数据库地址
private static final String URL = “jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&characterEncoding=UTF8”;
//数据库用户名
private static final String USER_NAME = “root”;
//数据库密码
private static final String USER_PASSWORD = “123456”;
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载JDBC访问Oracle的驱动
Class.forName(DRIVER);
// 建立和数据库的连接
Connection conn = DriverManager.getConnection(URL, USER_NAME, USER_PASSWORD);
// 创建SQL命令发送器
Statement stmt = conn.createStatement();
// 使用SQL命令发送器发送SQL命令并得到结果
String sql = “insert into student values(1,‘小刚’,32,‘男’,‘湖北省武汉市’)”;
int n = stmt.executeUpdate(sql);
// 处理结果
if (n > 0) {
System.out.println(“添加成功”);
} else {
System.out.println(“添加失败”);
}
// 关闭数据库资源
stmt.close();
conn.close();
}
}

4.3 URL详解
4.3.1 为什么要定义URL
Java和MySQL是厂商的,Java程序和MySQL数据库此时不在同一个进程下,此时Java程序需要向MySQL发送请求。

4.3.2 如何发送请求呢?
jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&characterEncoding=UTF-8

使用URL的方式发送

jdbc 主协议

mysql 子协议

localhost MySQL服务器的地址,如果服务器就是我自己的主机,那么定义localhost就可以了

3306 MySQL服务器的端口号

whpowernode MySQL数据库服务器的数据库名称

useUnicode=true Java和MySQL交互使用Unicode编码

useSSL=false Java和MySQL交互不使用安全层协议

characterEncoding=UTF-8 Java和MySQL交互的编码方式为UTF-8 【如果不设置会有乱码的】

4.4 查看数据库
在这里插入图片描述

4.4.1 一个URL由哪些部分组成
Ø 协议://服务器主机:端口/服务器路径?查询参数

Ø 协议 jdbc:mysql:

Ø 服务器主机 localhost

Ø 端口 3306

Ø 服务器路径 whpowernode

Ø 参数useUnicode=true&useSSL=false&characterEncoding=UTF8

5. 使用JDBC完成更新和删除

5.1 步骤
Ø 加载MySQL的JDBC驱动

Ø 建立数据的连接

Ø 创建SQL命令的发送器

Ø 编写SQL

Ø 使用SQL命令发送器发送SQL命令并得到结果

Ø 处理结果

Ø 关闭数据库资源

5.2 修改代码
package com.bjpowernode.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Test02Update {
// 驱动器路径
private static final String DRIVER = “com.mysql.jdbc.Driver”;
//连接数据库地址
private static final String URL = “jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&characterEncoding=UTF8”;
//数据库用户名
private static final String USER_NAME = “root”;
//数据库密码
private static final String USER_PASSWORD = “123456”;
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载Oracle的JDBC驱动
Class.forName(DRIVER);
// 建立数据的连接
Connection conn=DriverManager.getConnection(URL, USER_NAME, USER_PASSWORD);
// 创建SQL命令的发送器
Statement stat=conn.createStatement();
// 编写SQL
String sql=“update student set name=‘小明’,age=23,sex=‘女’,address=‘武汉’ where id=1”;
// 使用SQL命令发送器发送SQL命令并得到结果
int res=stat.executeUpdate(sql);
// 处理结果
if(res>0){
System.out.println(“修改成功”);
}
else{
System.out.println(“处理失败”);
}
// 关闭数据库资源
stat.close();
conn.close();
}
}

5.3 删除代码
package com.bjpowernode.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Test03Delete {
// 驱动器路径
private static final String DRIVER = “com.mysql.jdbc.Driver”;
//连接数据库地址
private static final String URL = “jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&characterEncoding=UTF8”;
//数据库用户名
private static final String USER_NAME = “root”;
//数据库密码
private static final String USER_PASSWORD = “123456”;
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载Oracle的JDBC驱动
Class.forName(DRIVER);
// 建立数据的连接
Connection conn=DriverManager.getConnection(URL, USER_NAME, USER_PASSWORD);
// 创建SQL命令的发送器
Statement stat=conn.createStatement();
// 编写SQL
String sql=“delete from student where id=1”;
// 使用SQL命令发送器发送SQL命令并得到结果
int res=stat.executeUpdate(sql);
// 处理结果
if(res>0){
System.out.println(“删除成功”);
}
else{
System.out.println(“删除失败”);
}
// 关闭数据库资源
stat.close();
conn.close();
}
}

6. DBUtils的简单封装

6.1 为什么要封装
从我们上面的代码大家可以看到,每一次写我们创建一个连接,创建一个发送SQL的对象,最后还要关闭,那么我们可以考虑把这重复的代码提取出来!

6.2 创建DBUtils封装代码
package com.bjpowernode.utils;

import java.io.Closeable;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtils {
// 驱动器路径
private static final String DRIVER = “com.mysql.jdbc.Driver”;
// 连接数据库地址
private static final String URL = “jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&characterEncoding=UTF8”;
// 数据库用户名
private static final String USER_NAME = “root”;
// 数据库密码
private static final String USER_PASSWORD = “123456”;

/*** 静态加载驱动程序*/
static {try {Class.forName(DRIVER);} catch (ClassNotFoundException e) {e.printStackTrace();}
}
/*** @return 连接对象*/
public static Connection getConn() {try {return  DriverManager.getConnection(URL, USER_NAME, USER_PASSWORD);} catch (SQLException e) {e.printStackTrace();System.out.println("创建连接对象异常");}return null;
}/*** 关闭资源*/
public static void close(AutoCloseable closeable) {try {if (closeable != null) {closeable.close();}} catch (Exception e) {e.printStackTrace();}
}

}

6.3 创建上面的工具类对象前面的代码进行改造
package com.bjpowernode.jdbc;

import com.bjpowernode.utils.DBUtils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Test01Add {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBUtils.getConn();
// 创建SQL命令发送器
Statement stmt = conn.createStatement();
// 使用SQL命令发送器发送SQL命令并得到结果
String sql = “insert into student values(1,‘小刚’,32,‘男’,‘湖北省武汉市’)”;
int n = stmt.executeUpdate(sql);
// 处理结果
if (n > 0) {
System.out.println(“添加成功”);
} else {
System.out.println(“添加失败”);
}
// 关闭数据库资源
DBUtils.close(stmt);
DBUtils.close(conn);
}
}

7. 使用JDBC完成查询

7.1 循环向student表里面插入20条数
package com.bjpowernode.jdbc;

import com.bjpowernode.utils.DBUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;

public class Test01Add20 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBUtils.getConn();
// 创建SQL命令发送器
Statement stmt = conn.createStatement();
// 使用SQL命令发送器发送SQL命令并得到结果
Random random=new Random();
for (int i = 1; i <=20 ; i++) {
Integer id=i;
String name=“小明”+i;
int age=random.nextInt(100);
String sex=random.nextBoolean()?“男”:“女”;
String address=“武汉”+i;

        String sql = "insert into student values("+i+",'"+name+"',"+age+",'"+sex+"','"+address+"')";int n = stmt.executeUpdate(sql);// 处理结果if (n > 0) {System.out.println("添加成功");} else {System.out.println("添加失败");}}// 关闭数据库资源DBUtils.close(stmt);DBUtils.close(conn);
}

}

7.2 查询
package com.bjpowernode.jdbc;

import com.bjpowernode.utils.DBUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Test04Query {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBUtils.getConn();
// 创建SQL命令发送器
Statement stmt = conn.createStatement();
// 编写SQL
String sql=“select * from student”;
// 使用SQL命令发送器发送SQL命令并得到结果
ResultSet rs=stmt.executeQuery(sql);
// 处理结果
while(rs.next()){
int id=rs.getInt(1);
String name=rs.getString(2);
int age=rs.getInt(3);
String sex=rs.getString(4);
String address=rs.getString(5);
System.out.println(id+" “+name+” “+age+” “+sex+” "+address);
}
// 关闭数据库资源
DBUtils.close(rs);
DBUtils.close(stmt);
DBUtils.close(conn);
}
}

8. 使用JDBC完成分页查询

package com.bjpowernode.jdbc;

import com.bjpowernode.utils.DBUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Test05QueryForPage {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBUtils.getConn();
// 创建SQL命令发送器
Statement stmt = conn.createStatement();
int pageNum=2; //页码
int pageSize=5;//每页显示的条数
// 编写SQL
String sql=“select * from student limit “+(pageNum-1)*pageSize+”,”+pageSize;
// 使用SQL命令发送器发送SQL命令并得到结果
ResultSet rs=stmt.executeQuery(sql);
// 处理结果
while(rs.next()){
int id=rs.getInt(1);
String name=rs.getString(2);
int age=rs.getInt(3);
String sex=rs.getString(4);
String address=rs.getString(5);
System.out.println(id+" “+name+” “+age+” “+sex+” "+address);
}
// 关闭数据库资源
DBUtils.close(rs);
DBUtils.close(stmt);
DBUtils.close(conn);
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/612516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django报错处理

django.template.exceptions.TemplateDoesNotExist: django/forms/widgets/text.html django.template.exceptions.TemplateDoesNotExist: django/forms/widgets/number.html以上报错是pycharm中创建虚拟环境之后把原本自带的templates文件删除&#xff0c;重新在app01下面创建…

Unity Delaunay三角剖分算法 动态生成

Unity Delaunay三角剖分算法 动态生成 Delaunay三角剖分Delaunay三角剖分 定义Delaunay 边Delaunay 空圆特性 Delaunay 三角形Delaunay 最大化最小角特性 Delaunay 三角形特征Delaunay 算法Delaunay Lawson算法Delaunay Bowyer-Watson算法 Unity Delaunay三角剖分 应用Unity 工…

Linux——firewalld防火墙(二)

一、firewalld高级配置 1、IP地址伪装 地址伪装&#xff08;masquerade):通过地址伪装&#xff0c;NAT设备将经过设备的包转发到指定接收方&#xff0c;同时将通过的数据包的源地址更改为其自己的接口地址。当返回的数据包到达时&#xff0c;会将目的地址修改为原始主机的地址…

CMU15-445-Spring-2023-Project #2 - 前置知识(lec07-010)

Lecture #07_ Hash Tables Data Structures Hash Table 哈希表将键映射到值。它提供平均 O (1) 的操作复杂度&#xff08;最坏情况下为 O (n)&#xff09;和 O (n) 的存储复杂度。 由两部分组成&#xff1a; Hash Function和Hashing Scheme&#xff08;发生冲突后的处理&…

神经辐射场(NeRF)概述

神经辐射场&#xff08;NeRF&#xff09;是一种用于三维场景重建的深度学习算法。它能够从一组稀疏的二维图片中重建出高质量的三维场景。 以下是对NeRF算法的原理和实现方法的详细解释&#xff1a; NeRF算法原理&#xff1a; 基本概念&#xff1a; NeRF算法基于光线追踪的原理…

Unified-IO 2 模型: 通过视觉、语言、音频和动作扩展自回归多模态模型。给大家提前预演了GPT5?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

从0到1实现html文件转换为markdown文档(进度0.1)

Spider-Man 前言准备环境1、node.js2、git 执行指令顺序报错及其解决方案一、npm 错误&#xff01;可以在以下位置找到此运行的完整日志解决方案 二、没有修改权限解决方案&#xff1a; 注意事项总结 前言 当我们处理文档时&#xff0c;常常会遇到将HTML文档转换为Markdown文档…

残疾人聋哑人专用起床叫醒器震动起床提醒器

残疾人聋人专用起床叫醒器震动起床提醒器是为特殊教育学校提供的一种安全防护设施&#xff0c;符合特教行業標準8.7電教、信息網路設備的規定&#xff0c;系统采用了全自动IP网络控制、每个设备内带有IP地扯能独立控制每一个宿舍和教室&#xff0c;在同一时间内&#xff0c;多功…

TypeScript进阶(二)深入理解装饰器

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…

【解决】Unity Project 面板资源显示丢失的异常问题处理

开发平台&#xff1a;Unity 2021.3.7f1c1   一、问题描述 在开发过程中&#xff0c;遭遇 Project 面板资源显示丢失、不全的问题。但 Unity Console 并未发出错误提示。   二、解决方案&#xff1a;删除 Library 目录 前往 “工程目录/Library” 删除内部所有文件并重打开该…

【JVM】本地方法接口 Native Interface

一、JNI简介 JVM本地方法接口&#xff08;Java Native Interface&#xff0c;JNI&#xff09;是一种允许Java代码调用本地方法&#xff08;如C或C编写的方法&#xff09;的机制。这种技术通常用于实现高性能的计算密集型任务&#xff0c;或者与底层系统库进行交互。 二、JNI组…

Python教程16:使用海龟画图turtle画会动的时钟

---------------turtle源码集合--------------- Python教程36&#xff1a;海龟画图turtle写春联 Python源码35&#xff1a;海龟画图turtle画中国结 Python源码31&#xff1a;海龟画图turtle画七道彩虹 Python源码30&#xff1a;海龟画图turtle画紫色的小熊 Python源码29&a…

CRMEB多商户短信开发

在使用CRMEB多商户系统的时候&#xff0c;想要二开使用其他平台的短信&#xff0c;这里以阿里云短信为例的具体实现方法。 一、加载阿里云短信的SDK&#xff0c;执行命令&#xff1a;composer require alibabacloud/dysmsapi-20170525 二、增加阿里云短信的驱动 1.在 crmeb\…

【REST2SQL】07 GO 操作 Mysql 数据库

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 MySQL是一个关系型数据库管理系统&#xf…

什么是编程思路?如何训练提升自己的编程思路?

哈喽&#xff0c;大家上午好呀&#xff01;又和大家如期见面了&#xff01; 今天给大家分享改变编程思路的9条技巧。 1.拆分项目&#xff0c;再编程 先按大类写子程序&#xff0c;例如自动&#xff0c;手动&#xff0c;报警&#xff0c;然后子程序中写FB块&#xff0c;FC程序&…

el-upload实现可替换、删除、预览的图片上传。js 往返缓存(可判断当前页面是不是返回的页面)

el-upload实现可替换、删除、预览的图片上传 组件使用&#xff1a; <template><div><UploadImage sendUrl :limit"1" :size"size" :gifSize"gifSize" v-model"images"></UploadImage> </div> </tem…

【Linux】Linux系统编程——Linux目录结构

Linux的文件系统呈现为一种树状结构&#xff0c;以根目录/为最顶层&#xff0c;其下分布着各种不同的子目录&#xff0c;每个目录都有其特定的用途和功能。下面是Linux目录结构的详细介绍&#xff1a; 1. 根目录 / 根目录是整个文件系统的基础。所有的目录和文件都从这里开始…

LeetCode刷题13:回溯+剪枝解决216.组合总和 III

找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 解…

阿里云c8i服务器CPU性能、架构及费用测评

阿里云第八代云服务器ECS计算型c8i实例&#xff0c;CPU采用Intel Xeon Emerald Rapids或者Intel Xeon Sapphire Rapids&#xff0c;主频不低于2.7 GHz&#xff0c;全核睿频3.2&#xff0c;阿里云百科aliyunbaike.com分享阿里云c8i服务器CPU处理器型号、存储、网络、安全、使用场…

子域名收集

目录 1、OneForAll 2、利用Google的搜索 3、fofa 4、使用在线查询网站查询 5、利用ip反查 6、Layer子域名挖掘机 7、JSFinder 用法 在进行渗透的过程中有一个很重要的工作就是信息收集&#xff0c;而信息收集中的子域名收集是很重要的一项工作&#xff0c;在本篇中我会给大…