JAVA数据库技术(一)
JDBC 简介
JDBC(Java Database Connectivity)是Java平台提供的一套用于执行SQL语句的Java API。它允许Java程序连接到数据库,并通过发送SQL语句来查询、更新和管理数据库中的数据。JDBC为不同的数据库提供了一种统一的访问方式,使得Java程序可以独立于特定的数据库管理系统(DBMS)进行开发。
以下是JDBC的一些关键特性和组件:
1. 驱动管理器(DriverManager):
JDBC的入口点,用于管理数据库驱动程序。通过DriverManager.getConnection()方法,Java程序可以获取到与数据库的连接。
2. 数据库连接(Connection):
代表Java程序与数据库之间的连接。通过这个连接,Java程序可以执行SQL语句并获取结果。
3. 语句(Statement)和预处理语句(PreparedStatement):
用于执行SQL语句的对象。Statement对象用于执行静态SQL语句,而PreparedStatement对象则用于执行带参数的SQL语句,这有助于防止SQL注入攻击。
4. 结果集(ResultSet):
代表数据库查询的结果。通过遍历ResultSet对象,Java程序可以获取查询返回的每一行数据。
5. 异常处理:
JDBC API定义了一组异常类,用于处理数据库访问过程中可能发生的错误。常见的异常包括SQLException、SQLIntegrityConstraintViolationException等。
6. 元数据(MetaData):
JDBC还提供了获取数据库、表和列等元数据的方法。通过元数据,Java程序可以在运行时动态地了解数据库的结构。
7. 事务支持:
JDBC支持事务处理,允许Java程序在多个数据库操作之间保持数据的一致性。通过调用Connection对象的setAutoCommit(false)方法,可以关闭自动提交模式,从而开始一个事务。完成所有操作后,可以调用commit()方法提交事务,或者调用rollback()方法回滚事务。
使用JDBC时,通常需要按照以下步骤进行:
1. 加载数据库驱动程序。
2. 通过DriverManager获取数据库连接。
3. 创建Statement或PreparedStatement对象。
4. 执行SQL语句。
5. 处理结果集(如果有的话)。
6. 关闭ResultSet、Statement和Connection对象以释放资源。
尽管JDBC提供了强大的数据库访问能力,但它也带来了一些复杂性,比如需要手动管理资源、处理SQL注入等。因此,在实际开发中,开发者通常会使用ORM框架(如Hibernate、MyBatis等)或JDBC模板(如Spring JDBC Template)来简化数据库操作。这些工具提供了更高层次的抽象,使得开发者可以更加专注于业务逻辑的实现。
JDBC 驱动程序分类
JDBC(Java Database Connectivity)是Java与数据库的接口规范,由Java语言编写的类和接口组成。JDBC驱动程序由实施了这些接口的类组成,它实现了Java应用程序与数据库之间的连接。JDBC驱动程序主要分为以下四种类型:
1. JDBC-ODBC桥驱动程序(JDBC-ODBC Bridge)
• 工作原理:JDBC-ODBC桥驱动程序使用ODBC驱动程序连接到数据库,它将JDBC方法调用转换为ODBC函数调用。
• 优点:使用简单,可以轻松连接到任何已安装ODBC驱动的数据库。
• 缺点:性能下降,因为JDBC方法调用需要被转换为ODBC函数调用。此外,由于需要在客户端安装ODBC驱动,因此不适合基于Internet的应用。自Java 8开始,Oracle不再支持JDBC-ODBC桥接,并建议使用由数据库供应商提供的JDBC驱动程序。
2. 本机API驱动程序(Native-API Partly Java Driver)
• 工作原理:本机API驱动程序使用数据库的客户端库,将JDBC方法调用转换为数据库API的本机调用。
• 优点:性能比JDBC-ODBC桥驱动程序有所提升。
• 缺点:需要在每个客户端机器上安装本机驱动程序和供应商的客户端库,因此不适合基于Internet的应用。并且,尽管其性能有所提升,但相较于完全使用Java编写的驱动程序,其执行效率仍然较低。
3. 网络协议驱动程序(Network-Protocol Pure Java Driver)
• 工作原理:网络协议驱动程序使用中间件(应用服务器),将JDBC调用直接或间接地转换为特定供应商的数据库协议。它完全使用Java编写。
• 优点:不需要在客户端安装数据库厂商提供的代码库,因为应用服务器可以执行许多任务,如审计、负载平衡、日志记录等。同时,它在执行效率和可升级性方面表现良好。
• 缺点:客户端机器需要网络支持,且需要在中间层中完成特定于数据库的编码,因此维护成本较高。
4. Thin驱动程序(Local-Protocol Pure Java Driver)
• 工作原理:Thin驱动程序将JDBC调用直接转换为特定供应商的数据库协议,因此也被称为“轻量级”驱动程序。它完全使用Java语言编写。
• 优点:执行效率高,不需要在客户端或服务器端装载任何的软件或驱动,且可以动态地被下载。由于它是完全用Java编写的,因此实现了平台独立性。
• 缺点:对于不同的数据库需要下载不同的驱动程序。
总的来说,JDBC驱动程序的四种类型各有优缺点,适用于不同的应用场景。在选择JDBC驱动程序时,需要根据具体的应用需求、性能要求以及客户端和服务器端的配置来进行合理选择。
选择数据库连接方式
在Java中,选择数据库连接方式通常有几种方法。根据需求、开发环境和具体应用的不同,可以选择不同的数据库连接方式。以下是几种常见的数据库连接方式:
1. JDBC (Java Database Connectivity)
JDBC 是 Java 提供的一种标准 API 用于连接和操作数据库。JDBC 主要通过 DriverManager 或 DataSource 来获取数据库连接。
DriverManager方式:通过手动加载数据库驱动类来管理数据库连接。
.DataSource方式:通过配置数据源(如在应用服务器中配置),更适合生产环境,支持连接池。使用 DriverManager 连接数据库:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class JDBCExample {public static void main(String[] args) {Connection connection = null;try {// 加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");// 建立数据库连接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/yourdb", "username", "password");System.out.println("Connected to the database successfully.");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 关闭连接try {if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}}
}
使用 DataSource 连接数据库:
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;public class DataSourceExample {public static void main(String[] args) {DataSource dataSource = setupDataSource();try (Connection connection = dataSource.getConnection()) {System.out.println("Connected to the database using DataSource.");} catch (SQLException e) {e.printStackTrace();}}public static DataSource setupDataSource() {BasicDataSource dataSource = new BasicDataSource();dataSource.setUrl("jdbc:mysql://localhost:3306/yourdb");dataSource.setUsername("username");dataSource.setPassword("password");dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");return dataSource;}
}
2. JPA (Java Persistence API)
JPA 是一种对象关系映射 (ORM) 技术,它让开发者通过对象模型来操作数据库,而不需要直接编写 SQL。JPA 在后台使用 JDBC 实现数据库操作。
JPA 通过 EntityManager 来进行数据库操作,通常和 Spring 框架一起使用。
Hibernate 是 JPA 最常用的实现。
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;public class JPAExample {public static void main(String[] args) {EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("yourPersistenceUnit");EntityManager entityManager = entityManagerFactory.createEntityManager();// 执行数据库操作entityManager.close();entityManagerFactory.close();}
}
3. Spring JDBC
Spring 提供了 JdbcTemplate 类,简化了 JDBC 操作,减少了大量的样板代码。Spring JDBC 通过 JdbcTemplate 管理数据库连接和执行 SQL 查询,通常与 Spring 框架一起使用。
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;public class SpringJDBCExample {public static void main(String[] args) {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/yourdb");dataSource.setUsername("username");dataSource.setPassword("password");JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);String sql = "SELECT COUNT(*) FROM users";int rowCount = jdbcTemplate.queryForObject(sql, Integer.class);System.out.println("Row count: " + rowCount);}
}
4. Spring Data JPA
Spring Data JPA 是基于 JPA 的一个扩展,简化了数据访问层的开发。它提供了用于数据库操作的接口,通过注解自动生成 SQL 查询。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public void displayUserCount() {long count = userRepository.count();System.out.println("Total users: " + count);}
}interface UserRepository extends JpaRepository<User, Long> {// 自动生成查询方法
}
5. 数据库连接池
在生产环境中,数据库连接池(如 HikariCP、C3P0 或 Apache DBCP)通常被使用。连接池可以复用数据库连接,避免了每次数据库操作时都创建新连接的开销,提高了系统性能。HikariCP:是一个高性能的 JDBC 连接池。
C3P0:是一个传统的数据库连接池,功能全面。
Apache DBCP:也是一个常用的数据库连接池。
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.SQLException;public class HikariCPExample {public static void main(String[] args) {HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/yourdb");config.setUsername("username");config.setPassword("password");HikariDataSource dataSource = new HikariDataSource(config);try (Connection connection = dataSource.getConnection()) {System.out.println("Connected using HikariCP.");} catch (SQLException e) {e.printStackTrace();}}
}
总结:
JDBC:直接操作数据库,灵活但代码冗长。
JPA:通过 ORM 操作数据库,适合对象映射,常用于 Spring Boot 应用。
Spring JDBC:简化了 JDBC 的使用,适合复杂应用。
Spring Data JPA:在 JPA 的基础上进一步简化操作,适用于快速开发。
数据库连接池:提高性能,减少数据库连接的创建和销毁开销。
选择数据库连接方式时要根据项目的需求来决定,如果是小型应用可以选择简单的 JDBC 连接,如果是大型应用或需要更高性能的应用,则建议使用连接池或 JPA。
JDBC 装载
JDBC(Java Database Connectivity)是 Java 提供的一种用于与数据库进行交互的标准 API,它使 Java 程序能够执行 SQL 查询、更新操作以及管理数据库事务。JDBC 提供了一个标准接口来访问不同类型的数据库。装载 JDBC 主要是指通过加载 JDBC 驱动来连接数据库并执行相关的数据库操作。
JDBC 装载的步骤
1.加载 JDBC 驱动程序:
JDBC 驱动程序是实现数据库连接的核心。为了让 Java 程序与特定的数据库进行通信,我们需要加载相应的数据库驱动。
2.在早期的 JDBC 版本中,加载驱动程序的方式是使用 Class.forName() 方法:
Class.forName("com.mysql.cj.jdbc.Driver");
这行代码会加载 MySQL 数据库的 JDBC 驱动(在这个例子中是 com.mysql.cj.jdbc.Driver)。
现代 JDBC 版本通常不需要显式地加载驱动程序,因为大多数 JDBC 驱动已经通过服务提供者接口(SPI)自动加载。你只需要在 classpath 中正确地放置 JDBC 驱动 jar 文件即可。
3.创建数据库连接:
使用 DriverManager.getConnection() 方法来创建数据库连接:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");
这行代码创建了一个到 MySQL 数据库 mydatabase 的连接,用户名是 username,密码是 password。连接字符串 jdbc:mysql://localhost:3306/mydatabase 需要根据数据库类型和实际的连接信息进行修改。
4.执行 SQL 查询或更新:
创建一个 Statement 或 PreparedStatement 对象,并使用其执行 SQL 查询或更新操作。例如,查询操作如下:
Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
对于更新操作(如插入、删除、更新等),可以使用 executeUpdate() 方法:
int rowsAffected = statement.executeUpdate("UPDATE users SET name='John' WHERE id=1");
5.处理结果集:
如果执行的是查询操作,结果将存储在 ResultSet 对象中。可以通过 ResultSet 获取查询结果:
while (resultSet.next()) {String name = resultSet.getString("name");int age = resultSet.getInt("age");System.out.println("Name: " + name + ", Age: " + age);}
6.关闭连接:
数据库操作完成后,需要关闭数据库连接、语句和结果集,防止资源泄露:
resultSet.close();statement.close();connection.close();
常见 JDBC 驱动类型
JDBC 驱动可以分为以下几种类型:
JDBC-ODBC 桥接驱动(Type 1): 通过 ODBC 接口连接数据库,速度较慢,已经不推荐使用。
本地客户端驱动(Type 2): 使用本地数据库驱动程序通过本地协议与数据库进行通信。效率较高,但需要安装数据库的本地驱动。
网络协议驱动(Type 3): 使用网络协议(如 TCP/IP)与数据库进行通信。可以支持多种数据库,不需要安装本地客户端。
纯 Java 驱动(Type 4): 完全用 Java 实现,直接通过网络协议与数据库通信。速度较快,跨平台支持好。示例代码
以下是一个简单的 JDBC 示例,展示如何加载驱动、连接数据库并执行查询操作:
import java.sql.*;public class JDBCExample {public static void main(String[] args) {// 1. 加载 JDBC 驱动try {Class.forName("com.mysql.cj.jdbc.Driver");// 2. 建立数据库连接Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");// 3. 创建 Statement 对象Statement statement = connection.createStatement();// 4. 执行查询操作ResultSet resultSet = statement.executeQuery("SELECT * FROM users");// 5. 处理查询结果while (resultSet.next()) {String name = resultSet.getString("name");int age = resultSet.getInt("age");System.out.println("Name: " + name + ", Age: " + age);}// 6. 关闭资源resultSet.close();statement.close();connection.close();} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}}
}
小结
JDBC 装载的核心是通过加载数据库的驱动程序,让 Java 应用能够连接和操作数据库。
使用 JDBC 时,我们通常需要加载驱动、创建连接、执行 SQL 操作、处理结果,并最终关闭数据库连接。
现代 JDBC 驱动通常会通过服务提供者接口(SPI)自动加载,不再需要手动使用 Class.forName()。
希望这能帮助你更好地理解 JDBC 装载的过程。如果有其他问题或需要进一步的讲解,随时告诉我!
拓展JDBC API
JDBC (Java Database Connectivity) 是一个用于在 Java 应用程序中与数据库进行交互的标准 API。它允许开发人员通过标准的接口来执行 SQL 查询、更新数据以及管理数据库连接等。
拓展 JDBC API 主要是指如何在基础 JDBC 的基础上,增强或自定义功能,使得其更加符合某些特定需求或提供更高效、更安全的数据库操作。
下面是一些常见的扩展 JDBC API 的方式和方法:
1. 使用数据源(DataSource)替代 DriverManager
在传统的 JDBC 编程中,数据库连接是通过 DriverManager 获取的。但是,DataSource 提供了一种更灵活的方式,它支持连接池等特性,能够提高应用的性能。
示例代码:
import javax.sql.DataSource;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.sql.Connection;
import java.sql.SQLException;public class DataSourceExample {public static void main(String[] args) throws SQLException, NamingException {// 假设数据源已经在 JNDI 中注册InitialContext ctx = new InitialContext();DataSource ds = (DataSource) ctx.lookup("jdbc/myDataSource");try (Connection conn = ds.getConnection()) {// 执行数据库操作System.out.println("Connected to the database successfully!");}}
}
2. 使用连接池
通过扩展 JDBC API,开发者可以实现自定义的数据库连接池。连接池允许多个连接共享,减少了频繁创建和销毁连接的性能开销。常用的连接池实现库有 Apache Commons DBCP, HikariCP 和 C3P0 等。
示例代码:
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;import java.sql.Connection;
import java.sql.SQLException;public class HikariCPExample {public static void main(String[] args) throws SQLException {HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");config.setUsername("root");config.setPassword("password");HikariDataSource dataSource = new HikariDataSource(config);try (Connection conn = dataSource.getConnection()) {// 执行数据库操作System.out.println("Connected to the database with HikariCP!");}}
}
3. 批量处理和批量插入
JDBC 允许执行批量操作,通过 Statement 或 PreparedStatement 来进行批量插入、更新或删除操作。这对于提高大量数据操作的性能非常重要。
示例代码:
import java.sql.*;public class BatchInsertExample {public static void main(String[] args) throws SQLException {String url = "jdbc:mysql://localhost:3306/mydb";String username = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, username, password)) {String sql = "INSERT INTO employees (name, age) VALUES (?, ?)";try (PreparedStatement pstmt = conn.prepareStatement(sql)) {conn.setAutoCommit(false);pstmt.setString(1, "Alice");pstmt.setInt(2, 30);pstmt.addBatch();pstmt.setString(1, "Bob");pstmt.setInt(2, 25);pstmt.addBatch();pstmt.executeBatch();conn.commit();System.out.println("Batch insert executed successfully.");}}}
}
4. JDBC 中的事务管理
JDBC 提供了事务管理机制,开发人员可以通过 Connection 对象管理事务的开始、提交和回滚。事务管理是确保数据库操作一致性和完整性的关键。
示例代码:
import java.sql.*;public class TransactionManagementExample {public static void main(String[] args) throws SQLException {String url = "jdbc:mysql://localhost:3306/mydb";String username = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, username, password)) {conn.setAutoCommit(false); // 禁用自动提交try {String sql1 = "UPDATE account SET balance = balance - 100 WHERE id = 1";String sql2 = "UPDATE account SET balance = balance + 100 WHERE id = 2";try (Statement stmt = conn.createStatement()) {stmt.executeUpdate(sql1);stmt.executeUpdate(sql2);}conn.commit(); // 提交事务System.out.println("Transaction committed successfully.");} catch (SQLException e) {conn.rollback(); // 回滚事务System.out.println("Transaction rolled back due to an error.");e.printStackTrace();}}}
}
5. 自定义 ResultSet 和 RowMapper
JDBC 的 ResultSet 提供了从查询中提取数据的功能,但有时我们希望将结果集映射到自定义对象中。这时可以使用 RowMapper 模式来扩展 JDBC API。
示例代码:
import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class RowMapperExample {public static class Employee {private int id;private String name;private int age;public Employee(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}@Overridepublic String toString() {return "Employee{id=" + id + ", name='" + name + "', age=" + age + '}';}}public static List<Employee> getEmployees(Connection conn) throws SQLException {List<Employee> employees = new ArrayList<>();String sql = "SELECT id, name, age FROM employees";try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) {while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");int age = rs.getInt("age");employees.add(new Employee(id, name, age));}}return employees;}public static void main(String[] args) throws SQLException {String url = "jdbc:mysql://localhost:3306/mydb";String username = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, username, password)) {List<Employee> employees = getEmployees(conn);employees.forEach(System.out::println);}}
}
6. JDBC 异常处理与日志记录
为了在数据库操作中更好地捕获错误,很多开发人员会使用日志记录工具(如 Log4j、SLF4J 等)来记录 SQL 错误、执行时间等信息。此外,处理 SQLException 时,我们可以根据错误代码或 SQLState 进行细致的错误处理。
示例代码:
import java.sql.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class JdbcExceptionExample {private static final Logger logger = LoggerFactory.getLogger(JdbcExceptionExample.class);public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydb";String username = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, username, password)) {String sql = "SELECT * FROM non_existent_table";try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) {while (rs.next()) {System.out.println(rs.getString("name"));}}} catch (SQLException e) {logger.error("Database error occurred: ", e);}}
}
总结
扩展 JDBC API 的方式有很多,可以通过使用连接池、事务管理、批量操作、日志记录、映射工具等来增强功能。通过这些扩展,开发者能够提升应用的性能、灵活性以及易用性。
相关文章:
JAVA数据库技术(一)
JDBC 简介 JDBC(Java Database Connectivity)是Java平台提供的一套用于执行SQL语句的Java API。它允许Java程序连接到数据库,并通过发送SQL语句来查询、更新和管理数据库中的数据。JDBC为不同的数据库提供了一种统一的访问方式,使…...
【Agent】OpenManus-Flow组件详细分析
1. Flow架构概述 OpenManus 的Flow组件实现了一个灵活的工作流管理系统,主要用于协调多个智能体的协作,以完成复杂任务。Flow组件的核心是基于计划的执行模型,它将任务分解为一系列步骤,然后逐步执行这些步骤,直到任务…...
MySQL环境安装详细教程(Windows/macOS/Linux)
摘要:本文详细介绍了在Windows、macOS和Linux三大操作系统下安装MySQL数据库的完整流程,帮助开发者快速搭建本地MySQL环境。 一、MySQL安装前准备 官网下载 访问MySQL官网 → 选择"Downloads" → 选择"MySQL Community (GPL) Downloads&…...
【人工智能基础2】人工神经网络、卷积神经网络基础、循环神经网络、长短时记忆网络
文章目录 三、人工神经网络1. 神经元感知模型2. 神经网络模型3. 学习规则:修改神经网络的权重和偏置反向传播算法(BP)优化器 - 梯度下降法 四、卷积神经网络基础(CNN)1. 基本原理2. 计算过程 五、循环神经网络(RNN&…...
如何查看windows系统的硬件环境(附方法
方法一:使用命令指示符查询 在“开始”菜单中搜索:命令指示符,并以管理员身份打开, 输入:systeminfo,就可以查看硬件、CPU、处理器等详细内容 systeminfo 方法二:在资源监视器中查看 按住 “…...
基于树莓派的水果分类系统(论文+源码)
针对小型农户的在水果加工销售环节中的分类需求,本文设计并实现了基于树莓派的视觉识别分类系统。本章根据所选水果的具体情况,简述系统各模块的实现方法,设计树莓派的程序算法,并选择合适的器件型号,开发所用的辅助工…...
Gemini Robotics:将人工智能带入物理世界
25年3月来自谷歌的技术报告“Gemini Robotics: Bringing AI into the Physical World”。 大型多模态模型的最新进展,已使数字领域出现卓越的通才能力,但将其转化为机器人等物理智体仍然是一项重大挑战。一般有用的机器人需要能够理解周围的物理世界&am…...
2.5[frontEnd]
requestAnimationFrame 是 浏览器原生 API,定义在 window 对象中,属于 Web API 的一部分。无需任何导入即可直接使用,其类型定义包含在 TypeScript 标准库中。 React 组件挂载时执行该 useEffect 初始化节流计时器 lastEmit 和 25ms 触发间隔…...
【动手学深度学习】#2线性神经网络
主要参考学习资料: 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 目录 2.1 线性回归2.1.1 线性回归的基本元素线性模型损失函数解析解随机梯度下降 2.1.3 最大似然估计 2.2 线性回归从零开始实现2.2.1 生成数据集2.2.2 读取数…...
C语言动态内存管理(上)
欢迎拜访:雾里看山-CSDN博客 本篇主题:C语言动态内存管理(上) 发布时间:2025.3.16 隶属专栏:C语言 目录 为什么需要动态内存管理静态分配的局限性动态分配的优势 动态内存函数malloc函数介绍函数使用 free函数介绍函数使用 calloc…...
图解多头注意力机制:维度变化一镜到底
目录 一、多头注意力机制概述二、代码实现1. pyTorch 实现2. tensorFlow实现 三、维度变化全流程详解1. 参数设定2. 维度变化流程图3. 关键步骤维度变化 四、关键实现细节解析1. 多头拆分与合并2. 注意力分数计算3. 掩码处理技巧 五、完整运行示例六、总结与常见问题1. 核心优势…...
Navicat如何查看密码
近期遇到需要将大部分已存储的navicat数据库转发给其他人,于是乎进行导出文件 奈何对方不用navicat,无法进行文件的导入从而导入链接 搜罗navicat的密码查看,大部分都为php代码解析 以下转载GitHub上看到的一个python代码解析的脚本 这里是对…...
第4节:分类任务
引入: 独热编码(one-hot):对于分类任务的输出,也就是是或不是某类的问题,采取独热编码的形式将y由一离散值转化为连续的概率分布,最大值所在下标为预测类 输入的处理:对于任意一张…...
EasyCVR安防视频汇聚平台助力工业园区构建“感、存、知、用”一体化智能监管体系
在现代工业园区的安全管理和高效运营中,视频监控系统扮演着不可或缺的角色。然而,随着园区规模的扩大和业务的复杂化,传统的视频监控系统面临着诸多挑战,如设备众多难以统一管理、数据存储分散、智能分析能力不足、信息利用率低下…...
计算机网络——DNS
一、什么是DNS? DNS(Domain Name System,域名系统) 是互联网的核心服务,负责将人类可读的域名(如 www.baidu.com)转换为机器可识别的 IP地址(如 14.119.104.254)。它像一…...
STC89C52单片机学习——第20节: [8-2]串口向电脑发送数据电脑通过串口控制LED
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.15 51单片机学习——第20节: [8-2]串口向电脑发送数据&电脑通过串口控制LED 前言…...
1.5[hardware][day5]
Link类跳转指令可以拆分为两个部分,一个是跳转,即下一个PC的生成,如果将分支条件的比较放到译码级来进行,则这部分只涉及取值级和译码级流水;另一个是Link操作,简单来说就是写寄存器,这部则主要…...
Java 多线程编程:提升系统并发处理能力!
多线程是 Java 中实现并发任务执行的关键技术,能够显著提升程序在多核处理器上的性能以及处理多任务的能力。本文面向初级到中级开发者,从多线程的基本定义开始,逐步讲解线程创建、状态管理、同步机制、并发工具以及新兴的虚拟线程技术。每部…...
Mininet 的详细设计逻辑
Mininet 是一个轻量级网络仿真工具,其核心目标是在单台物理机上快速构建复杂的虚拟网络拓扑,支持 SDN(软件定义网络)和传统网络协议的实验与验证。其设计逻辑围绕 虚拟化、模块化 和 灵活性 展开,以下是其详细设计架构…...
原生微信小程序实现导航漫游(Tour)
效果: 小程序实现导航漫游 1、组件 miniprogram/components/tour/index.wxml <!--wxml--> <view class"guide" wx:if"{{showGuide}}"><view style"{{guideStyle}}" class"guide-box"><view class&quo…...
Spring(6)——Spring、Spring Boot 与 Spring MVC 的关系与区别
Spring、Spring Boot 与 Spring MVC 的关系与区别 1. 核心定位 Spring 定位:基础框架,提供 IoC(控制反转) 和 DI(依赖注入) 核心功能,管理对象生命周期及依赖关系。功能:支持事务管…...
神聖的綫性代數速成例題2. 行列式的性質
性質 1:行列式與它的轉置行列式相等: 設為行列式,為其轉置行列式,則。 性質 2:交換行列式的兩行 (列),行列式變號: 若行列式經過交換第行和第行得到行列式,則。 性質 3ÿ…...
ModelScope推理QwQ32B
文章目录 ModelScope推理QwQ32Bmodel_scope下载QwQ32BModelScope 调用QwQ-32B ModelScope推理QwQ32B 以下载 qwq32b 为例子 需要安装的 python 包 transformers4.49.0 accelerate>0.26.0 torch2.4.1 triton3.0.0 safetensors0.4.5可以使用 conda 创建一个虚拟环境安装 cond…...
使用unsloth进行grpo强化学习训练
说明 unsloth框架可以进行各种sft训练,包括lora和grpo训练。我参考官方方法,使用模型Qwen2.5-3B-Instruct和数据集gsm8k,写了一个grpo训练的例子。 代码 这个代码加载模型Qwen2.5-3B-Instruct和数据集gsm8k。训练完成后先保存lora模型然后…...
【c++】【智能指针】shared_ptr底层实现
【c】【智能指针】shared_ptr底层实现 智能指针之前已经写过了,但是考虑到不够深入,应该再分篇写写。 1 shared_ptr 1.1 shared_ptr 是什么 std::shared_ptr是一个类模板,它的对象行为像指针,但是它还能记录有多少个对象共享它…...
python拉取大视频导入deepseek大模型解决方案
使用Python拉取大视频并导入大模型,需要综合考虑数据获取、存储、处理和资源管理,确保高效稳定地处理大视频数据,同时充分利用大模型的性能,以下是分步方案及代码示例: --- 1. 分块下载大视频(避免内存溢出…...
【Python】面向对象
编程的两大特点 面向过程:着重于做什么面向对象( oop):着重于谁去做 python是面向对象语言,面向对象三大特点:封装、继承、多态 面向对象:便于代码管理,方便迭代更新。 新式类、经…...
leetcode日记(100)填充每个节点的下一个右侧节点指针
和层序遍历差不多的思路,将节点储存在队列里,一边取出节点一边放入取出节点的左右节点,直到队列空。 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NU…...
docker入门篇
使用docker可以很快部署相同的环境,这也是最快的环境构建,接下来就主要对docker中的基础内容进行讲解.Docker 是一个用于开发、交付和运行应用程序的开源平台,它可以让开发者将应用程序及其依赖打包到一个容器中,然后在任何环境中运行这个容器࿰…...
python语法
1. 前面先写import导入模块,完整的语法是: [from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名] 语法还可以是: from 模块名 import 功能名 如果import整个模块的话,需要用.功能名(),来用这个功能ÿ…...
Dify使用部署与应用实践
最近在研究AI Agent,发现大家都在用Dify,但Dify部署起来总是面临各种问题,而且我在部署和应用测试过程中也都遇到了,因此记录如下,供大家参考。Dify总体来说比较灵活,扩展性比较强,适合基于它做…...
微信小程序接入DeepSeek模型(火山方舟),并在视图中流式输出
引言: DeepSeek,作为一款先进的自然语言处理模型,以其强大的文本理解和生成能力著称。它能够处理复杂的文本信息,进行深度推理,并快速给出准确的回应。DeepSeek模型支持流式处理,这意味着它可以边计算边输…...
前端性能优化指标及优化方案
前端性能优化的核心目标是 提高页面加载速度、降低交互延迟、减少资源占用。常见的 Web 性能指标包括 LCP、FID、CLS、TTFB、TTI、FCP 等。 关键性能指标(Web Vitals) 指标优化方案 (1)LCP(Largest Contentful Paint&…...
正则化介绍
简单介绍 正则化是用于控制模型的复杂度,防止模型在训练数据上过度拟合(overfitting)。正则化通过在模型的损失函数中引入额外的惩罚项,来对模型的参数进行约束,从而降低模型的复杂度。这个额外的惩罚通常与模型参数的…...
AI时代:数字媒体的无限可能
人工智能和数字媒体技术正深刻改变着我们的生活。通过大数据分析、机器学习等技术,人工智能不仅能精准预测用户需求,还能在医疗、金融等多个领域提供高效解决方案。与此同时,数字媒体技术的进步使得信息传播更加迅速和广泛。社会计算作为新兴…...
自动化爬虫drissionpage
自动化爬虫drissionpage官网 自动化测试框架:DrissionPage DrissionPage调用工具汇总 网络爬虫工具比较-DrissionPage、Selenium、Playwright...
禁毒知识竞赛主持稿串词
尊敬的各位领导、各位来宾、参赛选手们:大家好! 在市禁毒委员会的领导下,今年我市开展了以“参与禁毒战争,构建和谐社会”为主题的禁毒宣传月活动。为了进一步加强我市禁毒宣传力度,促进社会治安的好转和社会主义物质文…...
【JDK17】Jlink一秒生成精简的JRE
之前介绍了 Java17模块化的JDK,模块化后按需使用Jlink 用于精简生成 JRE 环境,这让快速的开发环境增强了编码的愉悦感。在实际生产环境中使用 mave 进行项目的构建,其次再是精简 JRE 缩小容器镜像体积,为实现一体化的流程…...
机器学习周报--文献阅读
文章目录 摘要Abstract 1 文章内容1.1 模型结构1.1.1 LSTMAT的结构设置1.1.2 AWPSO算法优化模型 1.2 实验与结果讨论1.2.1 处理缺失数据1.2.2 模型评估指标1.2.3 比较实验1.2.4 消融实验(ABLATION EXPERIMENTS) 2相关知识2.1 自适应权重粒子群优化&#…...
硬件地址反序?用位操作为LED灯序“纠偏”。反转二进制数即可解决
特别有意思,LED的灯序与其硬件地址刚好相反,没办法直接通过加1实现二进制进位的亮灯操作,查了一些资料说用数组和switch实现,觉得太麻烦了,思索良久,就想到了反转二进制数解决这个问题。 reverse_bits( )是…...
A* floyd算法 bellman-ford
求源点到目标点最短距离 排序的里面要加上与目标点一个预估距离,与dj算法差距只有这儿 预估要小于等于真实的最短距离,吸引力要适当 越接近实际距离越快 #include<bits/stdc.h> using namespace std;// 方向向量:上、右、下、左 const vector<int> …...
【数据挖掘】KL散度(Kullback-Leibler Divergence, KLD)
KL散度(Kullback-Leibler Divergence, KLD) 是衡量两个概率分布 P 和 Q之间差异的一种非对称度量。它用于描述当使用分布 Q 逼近真实分布 P 时,信息丢失的程度。 KL散度的数学定义 给定两个离散概率分布 P(x)和 Q(x),它们在相同的…...
Linux shell 进度条
概述 在 Linux Shell 中实现一个简单的进度条可以通过 printf 命令结合特殊字符来实现,以下是一个示例脚本,它模拟了一个从 0% 到 100% 的进度条。 作用 反馈任务进度:让用户直观了解任务执行的进展情况,比如文件拷贝、系统更新…...
ctfshow web刷题记录
RCE 第一题 eval代码执行 : 1、使用system 加通配符过滤 ?csystem("tac%20fl*") ; 2、反字节执行 xxx %20 echo 反字节 3、变量转移 重新定义一个变量 让他代替我们执行 4、伪协议玩法 ?cinclude$_GET[1]?>&1php://filter/readc…...
leetcode日记(101)填充每个节点的下一个右侧节点指针Ⅱ
意料之中有这题,将之前的思路换一下即可,层序遍历的思路将record(记录下一个循环的次数)手动加减。 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL)…...
大语言模型微调和大语言模型应用的区别?
1. 基本概念 微调(Fine-tuning) 定义:微调是指在预训练大语言模型的基础上,通过在特定领域或任务的数据上进一步训练,从而使模型在该特定任务上表现更优。 目的:适应具体的任务需求,比如法律文…...
Leetcode-131.Palindrome Partitioning [C++][Java]
目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-131.Palindrome Partitioninghttps://leetcode.com/problems/palindrome-partitioning/description/131. 分割回文串 - 力扣(LeetCode)131. 分割回文串 - 给你一个字符串 s,请你…...
DeepSeek:开启机器人智能化的革命性突破
引言 在2025年全球机器人产业格局中,中国AI公司深度求索(DeepSeek)凭借开源机器人智能控制系统DeepSeek-R1,正在掀起一场从底层算法到应用生态的技术革命。不同于传统机器人依赖预设程序的局限,DeepSeek通过深度推理能…...
解决load()文件报错zipfile.BadZipFile: File is not a zip file
报错如下图: 有可能是资源没有关闭造成了错误,这个网上已经有很多解决方案了,大家可自行查阅。 如果你在别的地方都没有找到解决问题,那么可能是以下这种情况。 1、描述 我在服务器上的代码load()加载文件时,出现了…...
【Tools】Visual Studio Code安装保姆级教程(2025版)
00. 目录 文章目录 00. 目录01. Visual Studio Code概述02. Visual Studio Code下载03. Visual Studio Code安装04. Visual Studio Code配置05. 附录 01. Visual Studio Code概述 Visual Studio Code(简称 VS Code)是由微软开发的一款免费、开源且跨平台…...