当前位置: 首页 > news >正文

JDBC简介与应用:Java数据库连接的核心概念和技术

简短介绍 JDBC 及其重要性。

简短介绍 JDBC

JDBC(Java Database Connectivity)是一种用于执行 SQL 语句的 Java API 并且独立于特定的数据库厂商。它允许开发者以一种标准的方式从 Java 应用程序中访问关系型数据库,这意味着一旦你掌握了 JDBC 的基本操作,你可以轻松地将你的应用程序与多种数据库连接起来,而不需要更改大量的代码。

JDBC 的重要性

1. 标准化: JDBC 提供了一套标准接口,使得开发者能够以一致的方式与各种数据库交互。这降低了对不同数据库产品的依赖,增强了应用程序的可移植性和可维护性。

2. 平台无关性: 由于 JDBC 是 Java 技术的一部分,因此它继承了 Java “一次编写,到处运行”的特性,可以在任何支持 Java 的平台上使用。

3. 增强的开发效率: JDBC 的引入简化了数据库访问的复杂性,开发者可以通过简单的 API 调用来执行 SQL 命令,减少了代码量和出错的机会。

4. 丰富的功能: JDBC 支持多种数据库操作,包括查询、更新、事务处理等,同时还提供了对高级功能的支持,如存储过程调用、结果集的滚动和更新等。

5. 安全性: 通过使用预编译的 SQL 语句(PreparedStatement),可以有效防止 SQL 注入攻击,提高了应用程序的安全性。

为什么学习 JDBC?

学习 JDBC(Java Database Connectivity)对于 Java 开发者来说非常重要,原因如下:

1. 广泛的应用: 几乎所有的企业级应用都需要与数据库交互,无论是进行数据存储还是数据检索。JDBC 提供了一个统一的接口来实现这一需求,使得开发者能够更专注于业务逻辑而不是底层的数据访问细节。

2. 跨平台能力: 由于 JDBC 是基于 Java 的,所以它继承了 Java 语言的跨平台特性。这意味着使用 JDBC 编写的数据库应用程序可以在不同的操作系统上运行,无需对数据库访问代码进行修改。

3. 广泛的数据库支持: JDBC 支持多种数据库管理系统(DBMS),如 MySQL、Oracle、SQL Server、PostgreSQL 等。这意味着开发者只需要掌握一套技能——即使用 JDBC 访问数据库的技术——就可以将其应用于多种数据库环境中。

4. 易于学习和使用: JDBC 的设计旨在简化数据库访问操作,提供了直观的 API 来执行 SQL 命令。即使你是数据库操作的新手,也可以快速上手并开始构建具有数据库交互功能的应用程序。

5. 强大的功能: JDBC 不仅支持基本的 SQL 操作,还支持更高级的功能,比如存储过程调用、事务管理和结果集的滚动访问等。这使得开发者能够根据需要选择最适合的工具来完成任务。

6. 社区支持: 由于 JDBC 已经存在了很长时间并且被广泛采用,所以围绕它有一个庞大的开发者社区。这意味着当你遇到问题时,很容易找到解决方案或者寻求帮助。

7. 与框架的兼容性: 很多流行的 Java 框架(如 Spring、Hibernate 等)都内置了对 JDBC 的支持,了解 JDBC 可以让你更好地理解和使用这些框架。

JDBC 是什么?

解释 JDBC 的全称以及它的目的。

JDBC 的全称是 Java Database Connectivity,中文翻译为“Java 数据库连接”。它是 Java 编程语言中用于与关系型数据库通信的一组 API(应用程序编程接口)。JDBC 的主要目的是为 Java 应用程序提供一个标准的方法来访问和操作关系型数据库,从而使得开发者能够在不同的数据库管理系统之间轻松切换,而不需要改变他们的核心数据库访问代码。

具体来说,JDBC 的目标包括:

1. 提供标准的数据库访问接口:JDBC 规定了一个标准的接口集,这些接口定义了如何与数据库进行交互的方法,包括连接数据库、执行 SQL 命令、处理结果集等。

2. 跨数据库兼容性:JDBC 允许 Java 应用程序以相同的方式与不同的数据库管理系统(如 Oracle、MySQL、Microsoft SQL Server、DB2 等)进行交互。这样,如果需要更换数据库供应商,只需要改变 JDBC 驱动程序即可,而不需要对应用程序的其余部分进行大量修改。

3. 简化数据库编程:JDBC 将复杂的数据库操作抽象成一组简单的 API 调用,使开发者能够更加专注于应用程序的业务逻辑而非具体的数据库操作细节。

4. 提高安全性:通过使用 JDBC 的预编译语句(PreparedStatement),可以有效地防止 SQL 注入攻击,从而提高应用程序的安全性。

JDBC 通过一系列的类和接口(如 java.sql.* 包中的类)来实现上述目标,这些类和接口为开发者提供了创建数据库连接、执行 SQL 查询、处理结果集等功能的方法。JDBC 驱动程序充当了桥梁的角色,将这些标准的 API 调用转换为特定数据库的实际命令。

JDBC 在 Java 生态系统中的位置。

在 Java 生态系统中,JDBC(Java Database Connectivity)占据了一个非常重要的位置,尤其是在那些需要与关系型数据库交互的企业级应用中。以下是 JDBC 在 Java 生态系统中的位置及其作用的一些概述:

1. Java 标准库的一部分:
JDBC 是 Java 标准库的一部分,被包含在 Java SE(Standard Edition)和 Java EE(Enterprise Edition)中。这意味着任何支持 Java 的环境都可以直接使用 JDBC 来访问数据库,而无需额外安装其他组件。

2. 数据库访问的抽象层:
JDBC 作为数据库访问的抽象层,它提供了一套标准的接口和类,使得开发者可以编写与数据库无关的代码。这种抽象性意味着只要数据库供应商提供了相应的 JDBC 驱动程序,你就可以使用相同的代码来访问不同的数据库。

3. 企业级应用的关键组件:
对于 Java Web 应用、服务器端应用以及其他需要持久化数据的企业级应用来说,JDBC 是一个关键组件。它使得应用程序能够与后端数据库进行高效、安全的交互。

4. ORM 框架的基础:
许多 ORM(Object-Relational Mapping)框架,如 Hibernate、MyBatis 等,都是基于 JDBC 构建的。这些框架提供了一种更高层次的抽象,使得开发者可以更方便地在对象和关系型数据库之间进行映射。

5. 与 Java EE 的集成:
在 Java EE 环境中,JDBC 经常与诸如 JNDI(Java Naming and Directory Interface)一起使用,来实现数据源(DataSource)的配置和管理,从而简化了在集群或多实例环境下共享数据库连接的工作。

6. 与 Spring 框架的整合:
Spring 框架也提供了对 JDBC 的支持,Spring 的 JDBC 模块封装了 JDBC 的复杂性,并且提供了一些高级特性,如异常转换和事务管理等。

 JDBC 架构

JDBC 驱动程序模型

JDBC 驱动程序模型描述了如何将 Java 应用程序与数据库连接起来。这个模型定义了不同类型的 JDBC 驱动程序以及它们如何与数据库交互。JDBC 驱动程序是连接 Java 应用程序和数据库管理系统(DBMS)之间的桥梁,它们负责将 JDBC API 调用转换为数据库特定的协议。

JDBC 驱动程序类型

根据 Sun Microsystems(现在的 Oracle)的分类,JDBC 驱动程序可以分为四类:

1. JDBC-ODBC 桥接驱动程序 (Type 1):
这是最简单的一种驱动程序类型,它实际上并不直接与数据库通信。相反,它通过 ODBC(Open Database Connectivity)桥接到数据库。这种方式现在较少使用,因为性能较差且依赖于 ODBC 驱动程序。
   
2. 部分 Java 驱动程序 (Type 2):
Type 2 驱动程序直接与数据库通信,但仍然需要一个本地(通常是 C 语言编写的)驱动程序。尽管比 Type 1 性能更好,但仍然不是纯 Java 解决方案,因此可能需要针对不同的操作系统安装不同的版本。

3. 纯 Java 驱动程序 (Type 3):
Type 3 驱动程序也是通过中间层(通常称为网络适配器或网络驱动程序)与数据库通信,但是这个中间层是用 Java 编写的。这种驱动程序允许客户端应用程序通过网络适配器与数据库通信,使得部署更为灵活。然而,这种类型现在也不太常见了,因为它引入了额外的网络延迟和复杂性。

4. 网络纯 Java 驱动程序 (Type 4):
Type 4 驱动程序是纯 Java 实现的,直接与数据库通信,没有中间层。这是最理想的解决方案,因为它既不需要本地驱动程序也不需要网络适配器,同时提供了最佳的性能和最大的平台独立性。Type 4 驱动程序是目前使用最广泛的一种。

选择合适的 JDBC 驱动程序

当选择 JDBC 驱动程序时,通常会倾向于选择 Type 4 驱动程序,因为它提供了最好的性能和可移植性。不过,在某些情况下,可能由于历史原因或其他限制因素,可能会继续使用其他类型的驱动程序。

关键 JDBC 接口和类

1. DriverManager

DriverManager类是 JDBC 的入口点,它负责管理 JDBC 驱动程序的加载和数据库连接的建立。DriverManager提供了静态方法来获取数据库连接,并且它还可以用来管理事务。

方法:
getConnection(String url, Properties info):根据给定的数据库 URL 和属性集来建立数据库连接。
getConnection(String url, String user, String password):使用用户名和密码来建立数据库连接。
getDrivers():返回所有已注册的 JDBC 驱动程序列表。
getConnection(String url):无参数版本的 getConnection 方法,适用于默认连接。

2. Connection

Connection接口代表与数据库的连接。它是所有数据库操作的基础,比如创建 Statement 或 PreparedStatement。

方法:
createStatement():创建一个新的 Statement 对象,用于发送 SQL 语句给数据库。
prepareStatement(String sql):创建一个新的 PreparedStatement 对象,用于发送预编译的 SQL 语句给数据库。
commit():提交当前事务。
rollback():回滚当前事务。
close():关闭连接。

3. Statement

Statement接口用于向数据库发送 SQL 语句。它可以执行简单的 SQL 语句,但不适合用于带有用户输入的动态 SQL 语句,因为那样容易导致 SQL 注入攻击。

方法:
executeQuery(String sql):执行查询语句,并返回一个ResultSet。
executeUpdate(String sql):执行更新(INSERT, UPDATE 或 DELETE)语句,并返回受影响的行数。
execute(String sql):执行任意 SQL 语句,并返回一个布尔值指示是否返回了ResultSet。

4. PreparedStatement

PreparedStatement接口扩展了Statement接口,它提供了预编译 SQL 语句的能力。预编译的语句可以多次执行,每次执行时只需设置不同的参数值。这对于执行重复的 SQL 语句特别有用,可以提高性能并增加安全性。

方法:
setX(int index, Object value):设置参数值。
executeQuery():执行预编译的查询语句,并返回一个 ResultSet。
executeUpdate():执行预编译的更新语句,并返回受影响的行数。

5. ResultSet

ResultSet接口表示由执行查询语句得到的结果集。你可以通过ResultSet来获取查询结果,并遍历结果集中的每一行。

方法:
next():移动游标到结果集的下一行,并返回是否还有更多行。
getString(String columnName):根据列名获取字符串值。
getInt(String columnName):根据列名获取整数值。
wasNull():检查最近获取的值是否为 SQL NULL。
close():关闭结果集。

连接数据库

1. 加载 JDBC 驱动

在使用 JDBC 连接数据库之前,你需要先加载相应的 JDBC 驱动。这通常通过调用 Class.forName()方法来完成,该方法会加载指定的 JDBC 驱动类。加载驱动程序的目的是为了让 JVM 知道如何处理特定数据库的连接请求。

2. 获取数据库连接

一旦 JDBC 驱动被加载,你就可以使用 DriverManager.getConnection()方法来获取数据库连接。这通常需要提供数据库的连接 URL、用户名和密码。

3. 示例代码展示如何使用 DriverManager建立连接

下面是一个简单的示例代码,展示了如何使用 JDBC 连接到 MySQL 数据库:

import java.sql.Connection; // 导入Connection接口
import java.sql.DriverManager; // 导入用于数据库连接的DriverManager类
import java.sql.Statement; // 导入Statement接口public class Main {public static void main(String[] args) throws Exception {// 加载MySQL JDBC驱动Class.forName("com.mysql.cj.jdbc.Driver");// 定义数据库连接信息String url = "jdbc:mysql://localhost:3306/my_db"; // 数据库URLString user = ""; // 数据库用户名String password = ""; // 数据库密码// 获取数据库连接Connection connection = DriverManager.getConnection(url, user, password);}
}

注意事项

1. 驱动程序加载:确保你已经下载了相应的 JDBC 驱动程序,并将其添加到项目的类路径中。例如,对于 MySQL 数据库,你需要将 `mysql-connector-java-x.x.x.jar` 文件添加到项目中。

2. 连接 URL:确保你提供的连接 URL 是正确的,包括主机名、端口号、数据库名等信息。例如,上面的示例中,my_db 应该替换为你实际的数据库名称。

3. 异常处理:务必处理可能出现的ClassNotFoundException和SQLException,以确保程序的健壮性。

通过上述步骤和示例代码,你可以建立起一个基本的 JDBC 连接到数据库的过程。这只是一个起点,实际应用中可能还需要进行更复杂的数据库操作和错误处理。

执行 SQL 查询

在 JDBC 中执行 SQL 查询通常涉及以下几个步骤:使用 Statement或PreparedStatement对象来发送 SQL 命令到数据库,并处理返回的ResultSet。下面分别介绍这两种方式,并提供示例代码。

 1. 使用 Statement对象执行查询

Statement对象用于执行不带参数的 SQL 命令。这是一个简单但不太安全的方法,因为它不适合用于带有用户输入的动态 SQL 语句,因为那样容易导致 SQL 注入攻击。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;public class ExecuteQuery {public static void main(String[] args) {// JDBC 驱动名称与数据库 URLString driverName = "com.mysql.cj.jdbc.Driver";String serverURL = "jdbc:mysql://localhost:3306/yourdatabase";String user = "root";String pass = "";try {// 加载 JDBC 驱动Class.forName(driverName);// 获取连接Connection conn = DriverManager.getConnection(serverURL, user, pass);// 创建 Statement 对象Statement stmt = conn.createStatement();// 执行 SQL 查询String sql = "SELECT * FROM your_table";ResultSet rs = stmt.executeQuery(sql);// 处理 ResultSetwhile (rs.next()) {// 读取结果集中的数据int id = rs.getInt("id");String name = rs.getString("name");int age = rs.getInt("age");System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);}// 关闭资源rs.close();stmt.close();conn.close();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}
}

2. 使用PreparedStatement对象执行参数化查询

PreparedStatement对象提供了预编译 SQL 语句的能力,使得每次执行时只需要设置不同的参数值即可。这种方法不仅可以提高性能,还可以增强安全性,因为它可以有效地防止 SQL 注入攻击。示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class ExecutePreparedQuery {public static void main(String[] args) {// JDBC 驱动名称与数据库 URLString driverName = "com.mysql.cj.jdbc.Driver";String serverURL = "jdbc:mysql://localhost:3306/yourdatabase";String user = "root";String pass = "";try {// 加载 JDBC 驱动Class.forName(driverName);// 获取连接Connection conn = DriverManager.getConnection(serverURL, user, pass);// 创建 PreparedStatement 对象String sql = "SELECT * FROM your_table WHERE id = ?";PreparedStatement pstmt = conn.prepareStatement(sql);// 设置参数pstmt.setInt(1, 1); // 假设要查询 ID 为 1 的记录// 执行 SQL 查询ResultSet rs = pstmt.executeQuery();// 处理 ResultSetwhile (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");int age = rs.getInt("age");System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);}// 关闭资源rs.close();pstmt.close();conn.close();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}
}

处理ResultSet

无论使用Statement还是PreparedStatement来执行查询,处理ResultSet的方式都类似。你需要通过ResultSet的方法来遍历结果集,并提取需要的数据。在上述示例代码中,我们展示了如何使用ResultSet的next()方法来遍历每一行数据,并使用getInt()和getString()等方法来获取列值。

注意事项

1. 资源管理:确保在完成操作后关闭所有打开的资源(如 ResultSet、Statement和Connection),以避免资源泄漏。
2. 异常处理:妥善处理可能出现的异常,如ClassNotFoundException和SQLException,确保程序的健壮性。
3. 安全性:使用PreparedStatement而不是Statement来处理带有用户输入的 SQL 语句,以防止 SQL 注入攻击。

事务处理

在 JDBC 中,事务处理是指对数据库的一系列操作作为一个整体来执行。如果事务中的所有操作都成功完成,则整个事务被提交;如果其中任何一个操作失败,则整个事务会被回滚,以保持数据的一致性和完整性。

如何在 JDBC 中管理事务。

在 JDBC 中,你可以通过以下步骤来管理事务:

1. 禁用自动提交:默认情况下,每当执行一个更新语句(如INSERT, UPDATE, DELETE)时,JDBC 会立即提交事务。为了手动控制事务,需要先将Connection的autoCommit属性设置为false。
2. 执行 SQL 语句:执行你的 SQL 更新语句。
3. 提交或回滚事务:根据需要,提交事务(使用Connection.commit())或将事务回滚(使用 Connection.rollback())。
4. 恢复自动提交模式:最后,可以将autoCommit属性重新设置为true,以便于后续的操作能够自动提交。

示例代码下面是一个示例代码,展示了如何在 JDBC 中管理事务:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TransactionExample {public static void main(String[] args) {// JDBC 驱动名称与数据库 URLString driverName = "com.mysql.cj.jdbc.Driver";String serverURL = "jdbc:mysql://localhost:3306/yourdatabase";String user = "root";String pass = "";try {// 加载 JDBC 驱动Class.forName(driverName);// 获取连接Connection conn = DriverManager.getConnection(serverURL, user, pass);// 禁用自动提交conn.setAutoCommit(false);// 创建 PreparedStatement 对象String sql1 = "INSERT INTO your_table (column1, column2) VALUES (?, ?)";PreparedStatement pstmt1 = conn.prepareStatement(sql1);pstmt1.setString(1, "value1");pstmt1.setString(2, "value2");// 执行第一条 SQL 插入语句pstmt1.executeUpdate();// 创建另一个 PreparedStatement 对象String sql2 = "UPDATE your_table SET column2 = ? WHERE column1 = ?";PreparedStatement pstmt2 = conn.prepareStatement(sql2);pstmt2.setString(1, "updated_value");pstmt2.setString(2, "value1");// 执行第二条 SQL 更新语句pstmt2.executeUpdate();// 提交事务conn.commit();// 关闭资源pstmt1.close();pstmt2.close();conn.close();System.out.println("Transaction completed successfully.");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {// 如果事务中的任何部分失败,则回滚整个事务try {if (conn != null) {conn.rollback(); // 回滚事务conn.close();}} catch (SQLException ex) {ex.printStackTrace();}e.printStackTrace();}}
}

示例代码说明

1. 禁用自动提交:通过调用conn.setAutoCommit(false)来禁止自动提交。
2. 执行 SQL 语句:在这个例子中,我们创建了两个PreparedStatement对象,分别用于插入和更新数据。
3. 提交事务:如果一切顺利,通过调用conn.commit()来提交事务。
4. 回滚事务:如果在执行过程中出现了任何异常,可以通过捕获异常并在catch块中调用conn.rollback()来回滚整个事务。
5. 恢复自动提交模式:在事务处理完成后,最好将autoCommit属性重新设置为true,以便于后续的操作能够自动提交。

异常处理

常见的 JDBC 异常

在使用 JDBC 进行数据库操作时,可能会遇到多种异常。了解这些异常的类型和如何处理它们对于编写健壮的应用程序至关重要。以下是一些常见的 JDBC 异常:

1.SQLException:
这是 JDBC 中最常见的一种异常,几乎所有的数据库访问错误都会抛出这个异常。SQLException 是所有其他特定异常的父类,比如SQLTimeoutException、SQLWarning等。
SQLException可以携带一个 SQL 状态码和一个错误消息,可以帮助开发者诊断问题。

2. SQLNonTransientException:
表示非瞬态的条件,即在重试后不会消失的条件。例如,当尝试访问不存在的对象时,可能会抛出此异常。

3. SQLSyntaxErrorException:
当 SQL 语法有误时抛出,例如拼写错误或语法结构错误。

4. SQLDataException:
当数据与预期不符时抛出,例如试图将一个整数放入需要字符串的字段中。

5. SQLIntegrityConstraintViolationException:
当违反了数据库完整性约束时抛出,例如尝试插入重复的主键值。

6. SQLFeatureNotSupportedException:
当请求的功能不受支持时抛出,例如使用了不支持的 JDBC 特性或方法。

7. SQLRecoverableException:
表示数据库或连接可以恢复的条件。例如,连接丢失但可以重新建立连接的情况。

8. SQLTransactionRollbackException:
当事务被强制回滚时抛出,例如因为违反了事务隔离级别。

如何捕获和处理这些异常

处理 JDBC 异常的最佳实践是使用适当的异常处理机制,确保应用程序能够优雅地处理错误并给出适当的反馈。以下是如何捕获和处理这些异常的示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class ExceptionHandlingExample {public static void main(String[] args) {// JDBC 驱动名称与数据库 URLString driverName = "com.mysql.cj.jdbc.Driver";String serverURL = "jdbc:mysql://localhost:3306/yourdatabase";String user = "root";String pass = "";Connection conn = null;PreparedStatement pstmt = null;try {// 加载 JDBC 驱动Class.forName(driverName);// 获取连接conn = DriverManager.getConnection(serverURL, user, pass);// 禁用自动提交conn.setAutoCommit(false);// 创建 PreparedStatement 对象String sql = "INSERT INTO your_table (column1, column2) VALUES (?, ?)";pstmt = conn.prepareStatement(sql);pstmt.setString(1, "value1");pstmt.setString(2, "value2");// 执行 SQL 插入语句pstmt.executeUpdate();// 提交事务conn.commit();System.out.println("Transaction completed successfully.");} catch (ClassNotFoundException e) {// 处理找不到驱动的异常e.printStackTrace();} catch (SQLException e) {// 处理 SQL 相关异常System.err.println("SQL Exception occurred: " + e.getMessage());// 如果事务中的任何部分失败,则回滚整个事务if (conn != null) {try {conn.rollback(); // 回滚事务} catch (SQLException ex) {ex.printStackTrace();}}e.printStackTrace();} finally {// 确保所有资源都被关闭try {if (pstmt != null) pstmt.close();if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}

 异常处理要点

1. 捕获异常:使用try-catch块来捕获可能抛出的异常。
2. 处理异常:在catch块中处理异常,可以打印错误信息、记录日志或者根据具体情况采取相应的措施。
3. 回滚事务:如果事务中有任何部分失败,应该回滚整个事务以确保数据一致性。
4. 关闭资源:在finally块中关闭所有打开的资源,如PreparedStatement和Connection。这一步非常重要,可以防止资源泄露。
5. 异常层次结构:了解异常层次结构,捕获更具体的异常类型(如SQLException而不是 Exception),以便更好地定位问题。

相关文章:

JDBC简介与应用:Java数据库连接的核心概念和技术

简短介绍 JDBC 及其重要性。 简短介绍 JDBC JDBC(Java Database Connectivity)是一种用于执行 SQL 语句的 Java API 并且独立于特定的数据库厂商。它允许开发者以一种标准的方式从 Java 应用程序中访问关系型数据库,这意味着一旦你掌握了 J…...

倒反天罡!这个AI风格模型可自由训练,还能批量生成同风格图像

在AIGC的新纪元中,模型已晋升为与算力并驾齐驱的生产力核心要素。也有不少用户反馈提到,如何利用神采PromeAI训练属于自己的风格模型?这需求必须安排!神采PromeAI「一致性模型」正式上线! 可自主训练风格化模型&#x…...

Stable Diffusion绘画 | ControlNet应用-Inpaint(局部重绘):更完美的重绘

Inpaint(局部重绘) 相当于小号的AI版PS,不但可以进行局部画面的修改,还可以去除背景中多余的内容,或者是四周画面内容的扩充。 预处理器说明 Inpaint_Global_Harmonious:重绘-全局融合算法,会对整个图片的画面和色调…...

电网谐波越限怎么处理

当电网中的谐波超出限值时,需要采取有效措施来处理和减少谐波,以保护电力系统的设备,确保电力质量。以下是处理电网谐波越限的主要措施: 1、谐波分析 监测与检测:使用谐波分析仪或功率质量分析仪监测谐波含量&#x…...

Redis中的AOF重写过程及其实际应用

引言 在Redis中,持久化是确保数据安全和稳定运行的关键部分。Redis提供了两种持久化方式:RDB快照和AOF(Append Only File)日志。相比RDB快照,AOF能够更频繁地保存数据变更,并且在服务器崩溃后能够更快地恢…...

JVM面试

1 黑马 1.1 什么是JVM 定义:JVM 就是java虚拟机,是运行在系统中的应用程序。它运行java的字节码文件,除了java还支持其他语言。作用:它主要作用就是实现java的代码一次编码,到处运行。实现java代码的跨平台性。功能&…...

【模板的特殊继承关系】 奇异的递归模板模式

一、奇异的递归模板模式范例 奇异的递归模板模式 ( C u r i o u s l y R e c u r r i n g T e m p l a t e P a t t e r n ) (Curiously \ Recurring \ Template \ Pattern) (Curiously Recurring Template Pattern)不是一种新技术,而是一种模板编程中使用的编程手…...

SAP B1 单据页面自定义 - 用户界面编辑字段

背景 接《SAP B1 基础实操 - 用户定义字段 (UDF)》,在设置完自定义字段后,如下图,通过打开【用户定义字段】可打开表单右侧的自定义字段页。然而再开打一页附加页面操作繁复,若是客户常用的定义字段,也可以把这些用户…...

MinIO【部署 02】Linux集群版本及Windows单机版、单机多目录版、分布式版(cmd启动脚本及winsw脚本分享)

Linux集群版及Windows单机版分布式版 1.Linux集群版1.1 安装启动停止1.2 将MinIO添加到服务 2.Windows2.1 官网安装2.2 本地测试2.2.1 cmd启动脚本2.2.2 winsw脚本 3.总结 1.Linux集群版 官网下载地址 https://min.io/download#/linux; 官网安装文档 https://min.i…...

手握18个大厂offer,我在大模型风口起飞

前言 在“金三银四”这一招聘旺季中,社交媒体上满是分享 offer 信息的“求助帖”。这些帖子通常只公布公司名称与薪资区间,而将具体岗位模糊化,以此作为判断岗位是否值得入职的衡量标准。 2024 年毕业的 985 硕士白丁(化名&…...

邦芒忠告:办公室聊天应避开的四个话题

职场人生风云变幻,害人之心不可有,防人之心不可无。千万别把同事当知己,无话不谈,把自己的私域圈起来当成办公室话题的禁区,轻易不让人涉足,其实是非常明智的一招,是竞争压力下的自我保护。 话题…...

交易型开放式指数基金(ETF)

交易型开放式指数基金(Exchange Traded Fund,简称 ETF)是一种投资工具,以下是用通俗易懂的语言对其进行的讲解: 一、基本概念 想象 ETF 是一个大篮子,里面装着很多不同的东西。在金融市场里,这…...

opencv将灰度图转为彩色图片

文章目录 背景灰度图优势opencv读取灰度图彩色转灰度算法需求 方法测试代码 背景 在图像处理中通常需要将图片转为灰度图 灰度图,也称为灰度图像或黑白图像,是一种只包含亮度信息而不包含颜色信息的图像。在灰度图中,每个像素的亮度级别通常…...

判断PDF与图片是否可以预览

一、判断图片是否可以预览 在JavaScript中,可以使用Image对象来判断一个图片URL是否可以访问。如果图片可以被加载,那么load事件会被触发;如果图片无法访问,error事件会被触发。 function checkImageAccessibility(url, callbac…...

多线程与并发区别

在Java中,多线程与并发是两个既相关又有所区别的概念。我们可以这样来理解它们: 多线程(Multi-threading): 多线程是指程序能够同时执行多个线程。每个线程都是一个独立的执行流,它们共享程序的内存空间&a…...

这个桌面日历真不错 笔记 提醒 生日记录 打卡 翻译都有 真的太方便了!

这个桌面日历真不错 笔记 提醒 生日记录 打卡 翻译都有 真的太方便了!日历产品非常的多,如何选择一个合适自己的桌面日历,这个很重要,今天小编给大家介绍这个芝麻日历,一起看下它有些什么功能,是不是你需要…...

多模态大语言模型综述(中)-算法实用指南

本文是Multimodal Large Language Models: A Survey的译文之算法实用指南部分。 上:摘要、概念与技术要点实用指南中:算法实用指南(本文)下: 任务的实用指南(应用)、挑战等 原始信息 标题: Multimodal Large Language Models: A Survey译文: 多模态大…...

Qt | ubuntu20.04安装Qt6.5.3并创建一个example完整教程(涉及诸多开发细节,商用慎重)

点击上方"蓝字"关注我们 01、下载 >>> 下载Qt在线安装包 这里采用镜像地址进行下载,避免网络过慢。 镜像地址:http://mirrors.ustc.edu.cn/qtproject/archive/online_installers/4.5/ 选择最新版本下载,如截至目前最新版本为qt-unified-linux-x64-4.5.2…...

苏州科技大学、和数联合获得国家知识产权局颁发的3项发明专利证书

近日,基于“苏州科技大学-和数智能软件区块链技术工程实验室”的研究成果,国家知识产权局正式授权了苏州科技大学、苏州和数区块链应用研究院联合申报的3项发明专利证书。 分别为: 一种基于双账本的物联网数据存储与共享方法 一种面向物联网…...

CleanMyMac X2024破解版mac电脑清理工具

今天,我要跟大家分享一个让我彻底告别电脑卡顿的秘密武器——CleanMyMac X。这不仅仅是一款普通的清理工具,它是你电脑的私人健身教练,让电脑焕发青春活力! CleanMyMac直装官方版下载地址: http://wm.makeding.com/i…...

微软数据库的SQL注入漏洞解析——Microsoft Access、SQLServer与SQL注入防御

说明:本文仅是用于学习分析自己搭建的SQL漏洞内容和原理,请勿用在非法途径上,违者后果自负,与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其相关法规内容【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安全和信息化委员会办公室】 。…...

无人机之处理器篇

无人机的处理器是无人机系统的核心部件之一,它负责控制无人机的飞行、数据处理、任务执行等多个关键功能。以下是对无人机处理器的详细解析: 一、处理器类型 无人机中使用的处理器主要包括以下几种类型: CPU处理器:CPU是无人机的…...

828华为云征文 | 华为云Flexus X实例上实现Docker容器的实时监控与可视化分析

前言 华为云Flexus X,以顶尖算力与智能调度,引领Docker容器管理新风尚。828企业上云节之际,Flexus X携手前沿技术,实现容器运行的实时监控与数据可视化,让管理变得直观高效。无论是性能瓶颈的精准定位,还是…...

缓存预热/雪崩/穿透/击穿

1. 缓存预热 预先将MySQL中的数据同步至Redis的过程 2. 缓存雪崩 Redis主机出现故障,或有大量的key同时过期大面积失效导致Redis不可用 Redis中key设置为永不过期,或者过期时间错开Redis缓存集群实现高可用多缓存结合预防雪崩服务降级 3. 缓存穿透 …...

C/C++:优选算法

一、双指针 1.1移动零 链接:283. 移动零 - 力扣(LeetCode) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操…...

用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响

高效的数据处理对于依赖大数据分析做出明智决策的企业和组织至关重要。显著影响数据处理性能的一个关键因素是数据的存储格式。本文探讨了不同存储格式(特别是 Parquet、Avro 和 ORC)对 Google Cloud Platform (GCP) 上大数据环境…...

【Jupyter Notebook】安装与使用

打开Anaconda Navigator点击"Install"(Launch安装前是Install)点击"Launch" 点击"File"-"New"-"Notebook" ​ 5.点击"Select"选择Python版本 6.输入测试代码并按"EnterShift"运…...

默认端口被占用后,如何修改Apache2 端口

你可以通过以下步骤修改 Apache2 的默认端口(80 端口): 1. 修改 Apache2 配置文件 首先,你需要编辑 Apache2 的端口配置文件: sudo nano /etc/apache2/ports.conf在文件中,你会看到类似以下的内容&#…...

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(2) (*****生成数据结构类的方式特别有趣****)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(1)-CSDN博客 本节内容 实现目标 通过已经得到的Excel表格…...

Idea 中的一些配置

配置 javap jdk 自带的 javap 可以用来查看字节码信息。 配置过程: 打开设置,定位到 Tools,External Tools新建项,Program 中填 javap 的路径Argument 中填 -c $FileClass$Working directory 中填 $OutputPath$ Argument 中也…...