JDBC操作数据库

news2024/11/17 7:48:01

数据库介绍

数据库是一种存储结构,允许使用各种格式输入、处理和检索数据,不必再每次需要数据时重新输入。当前比较流行的数据库主要有MySQL、Oracle、SQL Server等
使用JDBC操作数据库,SQL语句是比不可少的,SQL是一种结构化查询语句,通过使用它,可以很方便地查询、操作、定义和控制数据库中的数据(select、insert、update、delete)


JDBC(Java DataBase Connectivity)简介

它是一种可用于执行SQL语句的Java API(Application Programming Interface,应用程序设计接口),是连接数据库和Java应用程序的纽带
由于JDBC是一种底层的API,因此访问数据库时需要在业务逻辑层中嵌入SQL语句
在这里插入图片描述

JDBC常用类和接口(java.sql)

1.加载数据库驱动

(1)加载Oracle数据库驱动程序(包名为ojdbc6.jar)

Class.forName("oracle.jdbc.driver.OracleDriver");

(2)加载SQL Server 2005 以上版本数据库驱动程序(包名为sqljdbc.jar)

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

(3)加载MySQL驱动包

Class.forName("com.mysql.jdbc.Driver");

2.DriverManager类(管理驱动)

DriverManager类用来管理数据库中的所有驱动程序,它是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,并在数据库的驱动程序之间建立连接

常用方法

方法描述
getConnection(String url,String user,String password)指定三个入口(依次是URL、用户名、密码)来获取与数据库的连接
setLoginTimeout()获取驱动程序试图登录到某一数据库时可以等待的最长时间,以秒为单位
println(String message)将一条消息打印到当前JDBC日志流中

3.Connection接口(获得连接)

代表与特定的数据连接

常用方法

方法描述
createStatement()创建Statement对象
createStatement(int resultSetTpye,int resultSetConnection)创建一个Statement对象,该对象将生成具有给定类型、并发性和保存性的ResultSet对象
preparedStatement()创建预处理对象preparedStatement
prepareCall(String sql)创建一个CallableStatement对象来调用数据库存储过程
isReadOnly()查看当前Connection对象的读取模式是否是只读形式
setReadOnly()设置当前Connection对象的读写模式,默认为非只读模式
commit()是所有上一次提交/回滚后进行的更改成为持久的操作,并释放此Connection对象当前持有的所有数据库锁
roolback()取消在当前事务中进行的所有更改,并释放此Connection对象当前持有的所有数据库锁
close()立即释放此Connection对象的数据库和JDBC资源,而不是等待它们被自动释放

获得连接

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);

4.Statement接口(发送SQL)

在已经建立连接的基础上向数据库发送SQL语句(SQL注入)

常用方法

方法描述
execute(String sql)执行静态的select语句,该语句可能返回多个结果集
executeQuery(String sql)执行给定的SQL语句,该语句返回单个ResultSet对象
clearBatch()清空此Statement对象的当前SQL命令列表
executeBatch()将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。数组元素的排序与SQL语句的添加顺序对应
addBatch(String sql)将给定的SQL命令添加到此Statement对象的当前命令列表中。如果驱动程序不支持批量处理,将抛出异常
close()释放Statement实例占用的数据库和JDBC资源

发送SQL

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
stmt.execute("update user set name=1234 where id=1");

5.PreparedStatement接口(发送SQL,可以防止SQL注入)

继承自Statement接口,用来指定动态的SQL语句

常用方法

方法描述
setInt(int index,int k)将指定位置的参数设置为int值
setFloat(int index,float f)将指定位置的参数设置为float值
setLong(int index,long l)将指定位置的参数设置为long值
setDouble(int index,double d)将指定位置的参数设置为double值
setBoolean(int index,boolean b)将指定位置的参数设置为boolean值
setDate(int index,date date)将指定位置的参数设置为date值
executeQuery()在此PreparedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象
setString(int index,String s)将指定位置的参数设置为对应的String值
setNull(int index,int sqlType)将指定位置的参数设置为SQL NULL
executeUpdate()执行前面包含的参数的动态insert、update或delete语句
clearParameters()清除当前所有参数的值

安全发送SQL
使用连接数据库对象conn的prepareStatement()方法创建PreparedStatement对象sql,其中设置一个参数

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement ps = conn.prepareStatement("select * from stuednt where name=?");
ps.setString(1, "阿强");
ps.executeQuery();

6.CallableStatement接口

CallableStatement接口继承并扩展了PreparedStatement接口,用来执行对数据库的存储过程的调用

常用方法

方法描述
get+数据类型(如getInt)以JAVA中指定类型值的形式获取指定的JDBC中相应类型参数的值
set+数据类型(如setInt)将指定参数是设置为Java中指定数据类型的值

在执行存储过程之前,必须注册所有输出参数(out)的类型,它们的值是在执行后通过getXXX()方法获得的
使用Connection对象的prepareCall方法生成一个CallableStatement对象,并指定执行pro_insert存储过程:

// 调用存储过程
CallableStatement cablStmt = conn.prepareCall("{call pro_insert (?,?)}"); 

每个‘?’代表一个参数,之间用‘,’分隔


7.ResultSet接口(查询数据库获得结果集)

ResultSet接口类似于一个临时表,用来暂时存放数据库查询操作所获得的结果集。ResultSet实例具有指向当前数据行的指针,指针开始的位置在第一条记录前面,通过next()方法可将指针向下移

常用方法

(1)get + 数据类型(如getInt)
以指定类型值的获取ResultSet对象的当前行的指定列值
如果列值是NULL,则返回值是int:0/Float:0/Date、boolean、String、Object:null

方法描述
first()将指针移到当前记录的第一行
last()将指针移到当前记录的最后一行
next()将指针向下移一行
beforeFirst()将指针移到集合的开头(第一行位置)
afterLast()将指针移到集合的尾部(最后一行位置)
absolute(int index)将指针移到ResultSet给定编号的行
isFirst()判断指针是否位于当前ResultSet集合的第一行,是,返回true
isLast()判断指针是否位于当前ResultSet集合的最后一行
updateInt()用Int值更新指定列
updateLong()用指定的long值更新指定列
updateString()用指定的string值更新指定列
updateObject()用Object值更新指定列
updateNull()将指定的列值修改为NULL
updateDate()用指定的date值更新指定列
updateDouble()用指定的double值更新指定列
getrow()查看当前行的索引
insertRow()将插入行的内容插入到数据库
updateRow()将当前的内容同步到数据表
deleteRow()删除当前行,但并不同步到数据库总,而是在执行close()方法后同步到数据库

获取结果集

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement ps = conn.prepareStatement("select * from user where name=?");
ps.setString(1, "阿强");
ResultSet rs = ps.executeQuery();
List<User> list = new ArrayList<User>();
while(rs.next()) {  //指针下移
User b = new User();
	b.setId(rs.getInt("id"));
	b.setName(rs.getString("name"));
	list.add(b);
}

操作数据库步骤

①加载驱动程序
②建立连接
③向数据库中发送SQL语句
④处理返回结果
⑤关闭连接


简单工具类

1.basedao.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bdqn?useUnicode=true&characterEncoding=utf-8
username=root
password=password

2.工具类

public class BaseDao {
	private static String driver;
	private static String url;
	private static String username;
	private static String password;
	
	private static Connection conn;
	private static PreparedStatement ps;
	
	static {
		InputStream in=BaseDao.class.getClassLoader().getResourceAsStream("com/dao/basedao.properties");  相当于classes/目录
		Properties p = new Properties();
		try {
			p.load(in);
			driver=p.getProperty("driver");
			url=p.getProperty("url");
			username=p.getProperty("username");
			password=p.getProperty("password");
			Class.forName(driver);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConn() {
		try {
			return DriverManager.getConnection(url,username,password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	//增删改
	public static void toBaseDao(String sql,Object[] obj) {
		try {
			conn=getConn();
			ps=conn.prepareStatement(sql);
			if(obj.length>0&&obj!=null) {
				for(int i=0;i<obj.length;i++) {
					ps.setObject(i+1, obj[i]);
				}					
			}
			ps.execute();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			CloseAll(conn, ps, null);
		}
	}
	
//资源关闭
	public static void CloseAll(Connection conn,PreparedStatement ps,ResultSet rs) {
		if(rs!=null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		if(ps!=null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		if(conn!=null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

JDBC(Java DataBase Connectivity)

Java应用程序与各种不同数据库之间进行对话的媒介,可以把数据持久的保存,一种持久化机制。
持久化:将程序中的数据在瞬时状态和持久状态键转换的机制。通俗讲,就是瞬时数据(如内存中的数据,不能永久保存),持久化为持久数据(如持久化至数据库中,能够永久保存)

JDBC工作原理

1.JDBC API
提供了Java应用程序与各种不同数据库交互的标准接口,如Conntion(连接)接口、Statement接口、ResultSet(结果集)接口、PreparedStatement接口等

2.JDBC Driver Manager
驱动程序管理器,它是JDBC体系结构的支柱,负责管理各种不同的JDBC驱动,把Java应用程序连接到相应的JDBC驱动程序上,位于JDK的java.sql包中

3.JDBC驱动
JDBC驱动有各个数据库厂商或第三方中间提供,负责连接各种不同的数据库,
在开发Java应用程序时,我们只需要正确加载JDBC驱动,正确调用JDBC API,就可以进行数据访问


JDBC API介绍

DriverManager类:装载驱动程序,并为创建新的数据库连接提供支持
Connection接口:负责连接数据库并担任传送数据的任务
Statement接口:由Connection产生,负责执行SQL语句
ResultSet接口:负责保存和处理Statement执行后产生的查询结果
PreparedStatement接口:Statement的子接口,也由Connection产生,同样负责执行SQL语句。与Statement接口相比,PrepareStatement接口具有高安全性、高性能、高可读性和高可维护性的优点


JDBC访问步骤

(1)加载JDBC驱动
使用Class.forName()方法将给定的JDBC驱动类加载到Java虚拟机中。若系统中不存在给定的类,则会引发异常,异常类型为ClassNotFoundException。

Class.forName(“JDBC驱动类的名称”);

(2)与数据库建立连接
DiverManager类是JDBC的管理层,作用于用户和驱动程序之间。DriverManager类跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。当调用getConnection()方法时,DriverManager类首先从已加载的驱动程序列表中找到一个可以接收该数据库URL的驱动程序,然后请求该驱动程序使用相关的URL、用户名和密码连接到数据库中,于是就建立了与数据库的连接
创建并返回引用,代码:

Connection con=DriverManager.getConnection(数据连接字符串,数据库用户名,密码);

(3)发送SQL语句,并得到返回结果
一旦建立连接,就使用该连接创建Statement接口的对象,并将SQL语句传递给他所连接的数据库。如果是查询操作,将返回类型为ResultSet的结果集,它包含执行SQL查询的结果。如果是其他操作,将根据调用方法的不同返回布尔或操作影响的记录数目

Statement stmt = con.createStatement();
ResultSet rs = stmt.executQuery(“select id,name from master”);

(4)处理返回结果
处理返回结果主要是针对查询操作的结果集,通过循环取出结果集中每条记录并作出相应处理

while(rs.next()){
	Int id = rs.getInt(“id”);
	String name=rs.getString(“name”);
	System.out.println(id+” ”+name);
}

连接数据库

两种常用的驱动方式
①JDBC:由数据库厂商或第三方中间厂商提供、有两种较为常用的驱动方式
②JDBC-ODBC桥连方式:适用于个人开发和测试,它通过ODBC与数据库进行连接
纯Java驱动方式,它直接同数据库进行连接,在生产型开发中,推荐使用Java驱动方式

(1)使用JDBC-ODBC桥连方式连接数据库

JDK中包括了JDBC-ODBC驱动接口,所以只需要下载ODBC驱动程序

1.驱动下载

http://dev.mysql.com/downloads/connector/odbc

2.配置MySQL ODBC数据源

控制面板–>系统和安全–>管理工具–>数据源–>ODBC数据源管理器–>添加
配置如下:
(1)选择安装数据源的驱动程序
(2)配置数据源

配置描述
Data Source Name数据源名称
Description数据源描述信息
Server服务器IP地址,本机为localhost
User用户名
Password密码
Database连接的数据库

JDBC驱动类是sun.jdbc.odbc.JdbcOdbcDriver,数据库连接字符串将以“jdbc:odbc”开始,后面跟的是数据源名称
假设我已经配置了一个myDBde ODBC数据源,数据库连接字符串就是“jdbc:odbc:myDB”,登录数据库系统的用户名为“root”口令为“root”


使用纯Java方式连接数据库

由JDBC驱动直接访问数据库,驱动程序完全用Java语言编写,运行速度快,而且具备了跨平台特点。

由于技术限制,这类JDBC驱动一般只能有数据厂商自己提供,即这类JDBC驱动只对应一种数据库,甚至某个版本的数据库,如果数据库更新了,一般需要更换JDBC驱动程序

首先需要下载数据厂商提供的驱动程序jar包,并将jar包引入工程中

Statement接口和ResultSet接口
获取对象后就可以进行各种数据库的操作了,此时需要使用Connection对象创建Statement对象
Connection接口常用方法

方法描述
void close()立即释放此Connection对象的数据库和JDBC资源
Statement createStatement创建一个Statement对象来将SQL语句发送到数据库
PreparedStatement prepareStatement(String sql)创建一个PrearedStatement对象来将参数化的SQL语句发送数据库
boolean isClosed()查询此Connection对象是否已经被关闭

Statement接口常用方法

方法描述
ResultSet executeQuery(String sql)可以执行SQL查询并获取ResultSet
int executeUpdate(String sql)可以执行插入、删除、更新的操作,返回值是执行该操作所影响的行数
boolean execute(String sql)可以执行任意SQL语句,若结果为ResultSet对象,则返回true;若其为更新计数或者不存在任何结果,则返回false

ResultSet接口常用方法及作用

方法描述
boolean next()将光标从当前位置向下移动一行
boolean previous()将光标从当前位置向上移动一行
void close()关闭ResultSet对象
int getInt(int columnIndex)以int形式获取结果集当前行指定列名的值
int getInt(String columnLabel)以int形式获取结果集当前行指定列名的值
float getFloat(int columnIndex)以float的形式获取结果集当前行指定列号的值
float getFloat(String columnLabel)以float的形式获取结果集当前行指定列名的值
String getString(int columnIndex)以String的形式获取结果集当前行指定的列号的值
String getString(String columnLabel)以String的形式获取结果集当前指定列名的值
int getRow()得到光标当前所指行的行号
boolean absolute(int row)光标移动到row指定的行

PreparedStatement接口
继承自Statement接口,比普通的Statement对象使用起来更加灵活

方法描述
boolean exectute()在此PrearedStatement对象中执行SQL语句,该语句可以是任何SQL语句。如果是Result对象,则返回true;结果是更新计算或没有结果,则返回false
ResultSet executrQuery()在此PreparedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象
int executeUpdate()在此PrearedStatement对象中执行SQL语句,该语句必须是一个DML语句,如Insert、update或delete语句;或是无返回内容的SQL语句,如DDL语句。返回值是执行该操作所影响的行数
void setInt(int index,int x)将指定参数设置为给定Java int值。设置其他类型参数也类似,如setFloat(int index,flost x)、setDouble(int index,double x)等
void setObject(int index,Object x)使用给定对象设置指定参数的值




上一篇:Java Class类和Java反射                        下一篇:Java网络通信




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

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

相关文章

安装配置 ZLMediaKit

一、ZLMediaKit 库简介 ZLMediaKit 是一个基于 C11 的高性能运营级流媒体服务框架 官方写的项目特点&#xff1a; 基于 C11 开发&#xff0c;避免使用裸指针&#xff0c;代码稳定可靠&#xff0c;性能优越。 支持多种协议(RTSP/RTMP/HLS/HTTP-FLV/Websocket-FLV/GB28181/MP4…

【数据分析之道-Pandas(一)】Series操作

文章目录 专栏导读1、Series简介2、创建Series3、Series索引4、Series切片 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领域知识。 ✍ 本文录入于《数据分析之道》&#xff0c;本专栏针对大学生、初级数据分析工…

光线追踪 1(基本概念Whitted-Style Ray Tracing)

为什么要光线追踪 光栅化存在什么问题 无法实现软阴影&#xff08;光源不是严格点光源时&#xff09; 无法解决光线反射超过一次的情况 相对来说光照效果的质量低 光线追踪的特点 准确慢&#xff08;相对光栅化&#xff09; 什么是光线追踪 光线的基本假设 光线沿直…

王道计组(23版)5_中央处理器

CPU 功能 指令控制&#xff1a;取指、分析、执行 操作控制&#xff1a;一条指令的功能由若干操作信号组合实现 时间控制、数据加工、中断处理 基本结构 运算器 ALU&#xff1a;算术/逻辑运算 暂存寄存器&#xff1a;暂存从主存读来的数据&#xff0c;透明 ACC&#xff1a;…

【变量的解构赋值】

变量的解构赋值 1 数组的解构2 对象的解构 ES6允许按照一定模式从数组和对象中提取值&#xff0c;对变量进行赋值&#xff0c;这称为解构赋值。 1 数组的解构 <script>// 1.数组的解构const F4 [小沈阳,刘能,赵四,宋小宝];let [xiao,liu,zhao,song] F4;console.log(xi…

算法基础(三):链表知识点及题型讲解

算法基础&#xff08;三&#xff09;&#xff1a;链表知识点及题型讲解 1 链表定义2 Python链表常用操作2.1 创建链表2.2 添加元素2.3 访问元素2.4 搜索元素2.5 更新元素2.6 删除元素2.7 获取链表长度 3 力扣题目训练 一些算法基础知识点和leetcode题解&#xff0c;语言是pytho…

体验 buildah

体验 buildah 什么是 Buildah安装 BuildahBuildah 使用 Dockerfiles参考资料 什么是 Buildah Buildah 是一个便于构建开放容器倡议&#xff08;OCI&#xff09;容器镜像的工具。 Buildah软件包提供了一个命令行工具&#xff0c;可以用来&#xff1a; 创建一个工作容器&#x…

代码随想录算法训练营第三十九天|62.不同路径、63. 不同路径 II

文章目录 62.不同路径63. 不同路径 II 62.不同路径 题目链接&#xff1a;代码随想录 解题思路&#xff1a; 1.dp(i)(j)&#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp(i)(j)条不同的路径 2.确定dp的表达式: dp(i)(j) dp(i-1)(j) …

OpenCV核心运算(二)—图像基本与算术操作

目录 2.1 图像的基本操作目标访问和修改像素值访问图像属性图像ROI分割和合并图像通道为图像制作边框&#xff08;填充&#xff09; 2.2 图像上的算术操作目标图像加法图像混合位操作练习 2.3 性能测量和改进技术目标用OpenCV测量性能OpenCV中的默认优化更多的IPython魔法命令性…

[HBZ分享] 小米手机如何解BL锁

第一步&#xff1a; 进入【设置—>我的设备–>全部参数–>连续疯狂的点MIUI版本那一行】 第二步&#xff1a;进入【更多设置–>开发者模式】&#xff0c;打开USB调试 与 USB安装 第三步&#xff1a;进入【更多设置–>开发者模式】&#xff0c;进入【设别解锁状…

spring eurake中使用IP注册

在开发spring cloud的时候遇到一个很奇葩的问题&#xff0c;就是服务向spring eureka中注册实例的时候使用的是机器名&#xff0c;然后出现localhost、xxx.xx等这样的内容&#xff0c;如下图&#xff1a; eureka.instance.perferIpAddresstrue 我不知道这朋友用的什么spring c…

单片机设计_自动追光系统、光源跟踪系统(AT89C51 光敏电阻 步进电机)

想要更多项目私wo!!! 一、电路设计 51 单片机双轴自动追光系统主要由 STC89C52RC 5516 光敏电阻 ADC0832 ULN2803 步进电机 LCD1602 显示屏组成。 1.通过子电路板的上、下、左、右四个光敏电阻来感受四个方向的光强&#xff0c;自 动寻找光强最强的方向。四个光敏电阻的…

MySQL存储引擎InnoDB、MyISAM和MEMORY介绍详解和区别

文章目录 MySQL存储引擎InnoDB、MyISAM和MEMORY介绍详解和区别InnoDB存储引擎特点操作示例创建InnoDB表修改表引擎为InnoDB MyISAM存储引擎特点操作示例创建MyISAM表修改表引擎为MyISAM MEMORY存储引擎特点操作示例创建MEMORY表修改表引擎为MEMORY 总结 MySQL存储引擎InnoDB、M…

代码随想录算法训练营第六天|242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

先了解一下什么是哈希表 哈希表是根据关键码的值而直接进行访问的数据结构 所以数组就是哈希表 盗个卡哥的图 哈希表中关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素&#xff0c;如下图所示&#xff1a; 哈希表能解决的问题&#xff1a; 一般哈…

【LeetCode】987.二叉树的垂序遍历

二叉树遍历系列 144.二叉树的前序遍历94.二叉树的中序遍历145.二叉树的后续遍历102.二叉树的层序遍历107.二叉树的层序遍历II103.二叉树的锯齿形层序遍历&#xff08;之字形遍历&#xff09;199.二叉树的右视图 二叉树的垂序遍历目录 二叉树遍历系列1.问题示例 1示例 2示例 3 …

校招又临近了,怎么在面试中应对设计模式相关问题呢?

夏天开始了&#xff0c;那么夏天结束时的毕业季也不远了。毕业是个伤感、期待而又略带残酷的时节&#xff0c;就像蜜桃无论成熟与否都会在这个时间被采摘&#xff0c;如果毫无准备就踏入社会&#xff0c;就会……马上变成低级社畜。所以说还是要早点为了毕业找工作做点准备&…

Stereo-Detection:YOLO v5与双目测距结合,实现目标的识别和定位测距

简介&#xff1a;Stereo-Detection 是一个传统的SGBM深度测距yolov5目标检测&#xff0c;并部署在Jeston nano的开源教程。它致力于让更多的大四学生毕业&#xff0c;以及让研一学生入门 开源链接&#xff1a;yzfzzz/Stereo-Detection: Conventional SGBM depth ranging yolov…

【android专题】学习android,第一天学习:软件和组件了解

开发软件和手机建立连接 1.建立连接 2.运行App程序到手机&#xff0c;通过USB线 选择你的小米设备 run按钮 下面这个&#xff0c;就是你设备的日志 通过USB安装时&#xff0c;报错&#xff0c;大概意思就是&#xff0c;默认手机是禁止通过usb安装软件的&#xff0c; 要打开…

Automa自动化爬取图片(二)

Automa插件可以扩展Automa的功能&#xff0c;使其可以与其他应用程序进行交互。例如&#xff0c;Automa插件可以用于自动化测试Web应用程序&#xff0c;批量发送邮件&#xff0c;自动化填写表单等。通过Automa插件&#xff0c;我们可以更加灵活地定制自己的自动化测试工具&…

Linux 配置YUM源(FTP方式获取软件源、使用阿里云yum源、同时使用本地源与在线源)YUM获取安装包并生成YUM软件仓库

YUM介绍 YUM&#xff08;yellow dog updater modified&#xff09; 基于RPM包构建的软件更新机制 自动解决依赖关系 yum软件仓库集中管理软件包 RPM软件包的来源 centos发布的RPM包集合第三方组织发布的RPM包集合用户自定义的RPM包集合 软件仓库的提供方式 FTP服务&#xff1a;…