Java、PHP、Node 操作 MySQL 数据库常用方法
一、Java 操作 MySQL 数据库

1、Java 连接 MySQL 数据库
1. 使用 JDBC 驱动程序连接
使用这种方式,首先需要导入 MySQL 的 JDBC 驱动程序依赖,然后通过 Class.forName() 方法加载驱动程序类。其创建连接的过程相对直接,只需提供准确的数据库连接 URL、用户名和密码即可。这种方式简单易懂,适用于小型项目或简单的数据库操作场景。但每次连接都需要重新建立,对于高并发场景可能会影响性能。
2. 使用连接池连接
常见的连接池如 Apache Commons DBCP、HikariCP 等。通过配置连接池参数,如最大连接数、最小连接数等,可以优化资源利用。在高并发场景下,连接池能够显著提高性能,避免频繁创建和关闭连接的开销。适用于对性能要求较高、数据库访问频繁的大型项目。
3. 使用 ORM 框架连接
像 Hibernate、MyBatis 这样的 ORM 框架,提供了高级的对象持久化功能。能够将数据库表映射为 Java 对象,简化了数据库操作的代码编写。适用于复杂的业务逻辑和需要高度抽象的项目,能有效减少 SQL 语句的直接编写,提高开发效率。
在选择连接方式时,需要综合考虑项目规模、性能要求、开发复杂度等因素。如果是简单的项目,JDBC 驱动程序连接可能足够;对于大型、高并发项目,连接池或 ORM 框架则更为合适。同时,不同版本的 MySQL 驱动也需要根据数据库版本和项目需求进行选择,以确保兼容性和稳定性。
2、MySQL 数据库操作
1. 数据的增删改查
(1)详细阐述使用 Java 进行数据增加、删除、修改和查询的具体代码实现及注意事项
在 Java 中,使用 PreparedStatement 进行数据操作通常比 Statement 更安全和高效。以下是一个简单的示例:
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;public class MySQLDataOperation {private static String url = "jdbc:mysql://localhost:3306/test";private static String user = "root";private static String password = "123456";public static void insertData(String name, String password) {try (Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO users (name, password) VALUES (?,?)")) {preparedStatement.setString(1, name);preparedStatement.setString(2, password);preparedStatement.executeUpdate();} catch (Exception e) {e.printStackTrace();}}public static void updateData(int id, String newName) {try (Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement preparedStatement = connection.prepareStatement("UPDATE users SET name =? WHERE id =?")) {preparedStatement.setString(1, newName);preparedStatement.setInt(2, id);preparedStatement.executeUpdate();} catch (Exception e) {e.printStackTrace();}}public static void deleteData(int id) {try (Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM users WHERE id =?")) {preparedStatement.setInt(1, id);preparedStatement.executeUpdate();} catch (Exception e) {e.printStackTrace();}}public static void queryData() {try (Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM users");ResultSet resultSet = preparedStatement.executeQuery()) {while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");String password = resultSet.getString("password");System.out.println("ID: " + id + ", Name: " + name + ", Password: " + password);}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {insertData("John", "123");updateData(1, "Alice");deleteData(2);queryData();}}注意事项:确保数据库连接的正确配置,包括 URL、用户名和密码。
处理好可能出现的异常,以避免程序崩溃。
合理使用参数绑定,防止 SQL 注入。
(2)介绍不同方式(如 PreparedStatement 与 Statement)的优劣
PreparedStatement 的优势在于:
- 可以防止 SQL 注入,提高安全性。
- 对于相同结构但参数不同的 SQL 语句,预编译后执行效率更高。
Statement 的劣势在于:
- 容易受到 SQL 注入攻击。
- 每次执行都需要重新编译 SQL 语句,效率较低。
2. 优化策略
(1)讲解如何通过合理的索引设计、SQL 语句优化等提高数据库操作性能
合理的索引设计是提高数据库性能的关键。例如,对于经常用于查询、连接和排序的列,应创建合适的索引。在创建索引时,要考虑列的选择性,选择性高的列更适合建立索引。
SQL 语句优化方面,应避免全表扫描,尽量使用索引。减少不必要的数据返回,只查询需要的列。避免在 WHERE 子句中使用复杂的函数和表达式,以免导致索引失效。
(2)分析常见的性能瓶颈及解决方法
常见的性能瓶颈包括:
- 大量数据导致的查询缓慢。解决方法可以是分表、分区,或者使用索引优化查询。
- 高并发下的锁竞争。可以通过调整事务隔离级别、优化锁机制来解决。
- 磁盘 I/O 瓶颈。可以考虑使用高性能的存储设备,或者优化数据库的存储结构。
总之,要综合运用索引设计、SQL 语句优化、数据库配置调整等手段来解决性能瓶颈问题,提高数据库的性能和稳定性。
3、数据处理与结果集处理
1. 数据的获取与处理
在 Java 操作 MySQL 数据库中,从数据库获取数据并处理结果集是关键步骤。可以使用PreparedStatement和ResultSet来实现。以下是一个示例代码:
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;public class DataFetchAndProcess {private static String url = "jdbc:mysql://localhost:3306/test";private static String user = "root";private static String password = "123456";public static void getDataAndProcess() {try (Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM your_table");ResultSet resultSet = preparedStatement.executeQuery()) {while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");// 在此处根据表结构获取并处理数据System.out.println("ID: " + id + ", Name: " + name);}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {getDataAndProcess();}}实用技巧:合理使用数据类型转换,确保获取的数据类型与预期一致。
对于大数据量的结果集,可以考虑分页处理,避免一次性加载过多数据导致内存溢出。
2. 异常处理
在数据库操作中,异常处理至关重要。它可以帮助我们及时发现并处理各种问题,确保程序的稳定性和可靠性。常见的异常包括连接异常、SQL 执行异常等。
对于连接异常,可能是由于数据库服务不可用、用户名密码错误等原因导致。在处理时,需要明确提示用户检查数据库服务状态和连接配置信息。
对于 SQL 执行异常,可能是由于 SQL 语句语法错误、数据库约束冲突等。在处理时,需要详细记录异常信息,以便后续排查问题。
以下是一个简单的异常处理示例:
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;public class ExceptionHandlingExample {private static String url = "jdbc:mysql://localhost:3306/test";private static String user = "root";private static String password = "123456";public static void performDatabaseOperation() {try (Connection connection = DriverManager.getConnection(url, user, password);PreparedStatement preparedStatement = connection.prepareStatement("YOUR_SQL_STATEMENT")) {preparedStatement.executeUpdate();} catch (SQLException e) {// 记录详细的异常信息System.out.println("Database operation failed: " + e.getMessage());// 根据异常类型进行不同的处理if (e instanceof com.mysql.jdbc.exceptions.jdbc4.CommunicationsException) {System.out.println("Check database server availability and connection configuration.");} else if (e instanceof com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException) {System.out.println("Check your SQL syntax.");}}}public static void main(String[] args) {performDatabaseOperation();}}
4、高级应用与最佳实践
1. DAO 模式
解释 DAO 模式在 Java 操作 MySQL 数据库中的应用和优势
DAO 模式(Data Access Object)在 Java 操作 MySQL 数据库中有着广泛的应用。它将数据访问的逻辑与业务逻辑分离,使得代码结构更加清晰、易于维护和扩展。其优势主要体现在以下几个方面:
- 提高了代码的可维护性:当数据库操作发生变化时,只需修改 DAO 层的相关代码,而不会影响到业务逻辑层。
- 增强了代码的可复用性:不同的业务模块可以复用相同的 DAO 实现,减少了重复代码的编写。
- 降低了代码的耦合度:业务逻辑不直接依赖于具体的数据访问方式,便于进行单元测试和系统的升级。
提供简单的代码示例
// 定义 DAO 接口interface UserDao {List<User> findAllUsers();void addUser(User user);}// 实现 DAO 接口class UserDaoImpl implements UserDao {private Connection connection;public UserDaoImpl(Connection connection) {this.connection = connection;}@Overridepublic List<User> findAllUsers() {// 执行查询数据库操作// 返回用户列表}@Overridepublic void addUser(User user) {// 执行插入用户到数据库操作}}
2. 数据库资源管理
讲述如何正确关闭数据库连接、释放资源,以确保程序的稳定性和性能
在 Java 操作 MySQL 数据库时,正确关闭数据库连接和释放资源至关重要。可以通过以下方式来实现:
- 使用try-with-resources语句:在try块中创建数据库连接等资源,当try块执行完毕或发生异常时,资源会自动关闭。
- 在finally块中关闭资源:如果不使用try-with-resources,则在finally块中手动关闭连接、语句和结果集等资源。
分享一些资源管理的最佳实践经验
- 合理控制连接数量:避免创建过多的数据库连接,以免消耗系统资源。
- 及时释放资源:操作完数据库后尽快关闭连接和释放相关资源。
- 使用连接池:连接池可以有效地管理数据库连接,提高资源利用率和系统性能。
- 监控资源使用情况:通过监控工具查看数据库连接的使用情况,及时发现并处理异常。
5、总结与展望
1. 总结 Java 操作 MySQL 数据库的关键要点和常见问题解决方案
在 Java 操作 MySQL 数据库的过程中,关键要点包括选择合适的连接方式(如 JDBC 驱动、连接池或 ORM 框架)以满足不同项目的需求。对于数据操作,使用 PreparedStatement 提高安全性和效率,同时注意合理的索引设计和 SQL 语句优化来提升性能。在数据处理和结果集处理时,要妥善处理异常情况,确保程序的稳定性。
常见问题解决方案方面,如连接失败时要检查连接配置,包括 URL、用户名和密码的正确性。遇到 SQL 注入问题,应优先使用参数化查询。性能瓶颈可能源于数据量、并发或不合理的查询,可通过分表、分区、调整事务隔离级别等方法解决。
2. 对未来 Java 与 MySQL 结合的发展趋势进行展望,为读者提供进一步学习和探索的方向
随着技术的不断发展,Java 与 MySQL 的结合将更加紧密和高效。在云计算和大数据的背景下,两者有望在分布式架构中发挥更大的作用,实现更强大的数据处理和存储能力。
未来,MySQL 可能会进一步优化其存储和查询机制,提供更智能的索引和缓存策略。而 Java 也将不断改进其数据库操作的 API,提供更简洁、高效的编程接口。
对于开发者而言,进一步学习的方向可以包括深入研究 MySQL 的高级特性,如存储过程、视图和触发器的优化使用。在 Java 方面,掌握新的数据库操作框架和技术,如响应式编程与数据库的结合,以及探索数据库与微服务架构的融合。
同时,关注行业动态,了解最新的数据库安全和性能优化的最佳实践,将有助于在实际项目中更好地运用 Java 和 MySQL 这一强大的组合,创
二、PHP 操作 MySQL 数据库
通过 mysqli 或 PDO 扩展连接数据库
在 PHP 中,通过 mysqli 扩展连接数据库的示例如下:
<?php$host = '127.0.0.1';$username = 'root';$password = '';$dbname = 'test';$conn = mysqli_connect($host, $username, $password, $dbname);if (!$conn) {die("Connection failed: ". mysqli_connect_error());}?>使用 PDO 扩展连接数据库的示例:<?phptry {$dsn = 'mysql:host=127.0.0.1;dbname=test';$username = 'root';$password = '';$pdo = new PDO($dsn, $username, $password);$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);} catch (PDOException $e) {die("Connect error:".$e->getMessage());}?>执行各种 SQL 语句,如查询、插入、更新和删除
查询:<?php$sql = "SELECT * FROM users";$result = mysqli_query($conn, $sql);if (mysqli_num_rows($result) > 0) {while ($row = mysqli_fetch_assoc($result)) {// 处理数据}}?>插入:<?php$sql = "INSERT INTO users (name, age) VALUES ('John', 25)";mysqli_query($conn, $sql);?>更新:<?php$sql = "UPDATE users SET age = 26 WHERE name = 'John'";mysqli_query($conn, $sql);?>删除:<?php$sql = "DELETE FROM users WHERE age < 18";mysqli_query($conn, $sql);?>处理跨表查询和计算数据
假设我们有 users 表和 orders 表,要进行跨表查询用户的订单数量,可以这样写:<?php$sql = "SELECT users.id, users.name, COUNT(orders.id) AS orders_count FROM users LEFT JOIN orders ON users.id = orders.user_id GROUP BY users.id, users.name";$result = mysqli_query($conn, $sql);if (mysqli_num_rows($result) > 0) {while ($row = mysqli_fetch_assoc($result)) {// 处理数据}}?>避免 SQL 注入攻击的方法
使用预处理语句:<?php$stmt = $pdo->prepare("SELECT * FROM users WHERE username =?");$stmt->execute([$username]);?>使用参数化查询:<?php$stmt = $mysqli->prepare("SELECT * FROM users WHERE username =?");$stmt->bind_param('s', $username);$stmt->execute();?>使用过滤器:<?php$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);?>
限制数据库用户权限:确保数据库用户只有执行必要操作的最小权限。
三、Node 操作 MySQL 数据库
使用 mysql、mysql2 等模块连接数据库
在 Node.js 中,有多种模块可用于连接 MySQL 数据库,如 mysql 和 mysql2 。使用 mysql 模块连接数据库时,通过 createConnection 方法创建连接,并在回调函数中处理连接结果。以下是示例代码:
const mysql = require('mysql');const connection = mysql.createConnection({host: 'localhost',user: 'username',password: 'password',database: 'database_name'});connection.connect((err) => {if (err) {console.error('Error connecting to MySQL database:', err);return;}console.log('Connected to MySQL database.');// 在这里执行数据库查询和操作connection.end();});而 mysql2 模块是一个更高性能的选择,连接方式与 mysql 类似。const mysql2 = require('mysql2');const connection = mysql2.createConnection({host: 'localhost',user: 'username',password: 'password',database: 'database_name'});connection.connect((err) => {if (err) {console.error('Error connecting to MySQL database:', err);return;}console.log('Connected to MySQL database.');// 在这里执行数据库查询和操作connection.end();});
利用 ORM 库进行数据库操作的优势和示例
ORM(对象关系映射)库能将数据库表映射为 JavaScript 对象,提供更便捷的操作接口。其优势包括:
- 提高开发效率,降低开发成本。
- 实现数据模型与数据库的解耦,方便更换数据库。
- 使代码更清晰易维护。
以 Sequelize 为例,示例代码如下:
const Sequelize = require('sequelize');const sequelize = new Sequelize('database_name', 'username', 'password', {host: 'localhost',dialect:'mysql'});sequelize.authenticate().then(() => {console.log('Connected to MySQL database.');// 在这里执行数据库查询和操作sequelize.close();}).catch((err) => {console.error('Error connecting to MySQL database:', err);});
在 Egg.js 框架中操作 MySQL 数据库的方法
- 安装与配置
-
- 安装 egg-mysql 插件:npm i egg-mysql --save
-
- 在 {app_root}/config/plugin.js 中启用插件:
exports.mysql = {enable: true,package: 'egg-mysql'};在配置文件中配置连接信息:exports.mysql = {client: {host: 'mysql.com',port: '3306',user: 'test_user',password: 'test_password',database: 'test'},app: true,agent: false};数据操作
查找数据:const result = await this.app.mysql.get('user', { id: 2 });插入数据:const result = await this.app.mysql.insert('user', { username: '赵四', 'password': '223423' });更新数据:const row = { id: 7, username: '赵四' };const result = await this.app.mysql.update('user', row);删除数据:const result = await this.app.mysql.delete('user', { username: '赵四' });执行 SQL 语句:app.mysql.query(sql, values);处理事务:const conn = await this.app.mysql.beginTransaction();try {await conn.insert('user', { 'username': 'hahahh', 'password': '223423' });const row = { id: 8, username: '王麻子' };await conn.update('user', row);await conn.commit();} catch (err) {await conn.rollback();throw err;}
四、总结与对比
分析各自的特点和适用场景
Java:
- 特点:具有良好的封装性和规范性,代码结构清晰,成熟的框架生态,如 MyBatis 等,能应对大型复杂项目。
- 适用场景:适用于企业级的大型项目,对代码质量、可维护性和扩展性要求较高的场景。
PHP:
- 特点:语法简单易懂,对于不同数据库有较好的兼容性,开发效率较高。
- 适用场景:中小型网站或快速开发的项目,尤其在 Web 开发领域应用广泛。
Node:
- 特点:基于事件驱动的非阻塞 I/O 模型,适合高并发的场景,具有丰富的模块生态。
- 适用场景:实时性要求高、并发量大的 Web 应用,如聊天系统、实时数据处理等。
给出在不同项目需求下选择合适技术的建议
- 对于大型企业级应用,数据处理复杂,对系统的稳定性和可扩展性要求极高,建议选择 Java 。
- 若项目规模较小,开发周期短,需要快速上线,且对成本较为敏感,PHP 可能是更合适的选择。
- 当项目需要处理高并发请求,对实时性要求严格,例如实时通信应用或大规模的网络服务,Node 则具有明显优势。
- 对于既有前端又有后端需求的全栈项目,若前端使用 JavaScript 技术栈,选择 Node 可以实现前后端技术的统一,提高开发效率。
总之,在实际项目中选择哪种技术应综合考虑项目规模、性能需求、开发团队技术栈、项目周期等多方面因素。
相关文章:
Java、PHP、Node 操作 MySQL 数据库常用方法
一、Java 操作 MySQL 数据库 1、Java 连接 MySQL 数据库 1. 使用 JDBC 驱动程序连接 使用这种方式,首先需要导入 MySQL 的 JDBC 驱动程序依赖,然后通过 Class.forName() 方法加载驱动程序类。其创建连接的过程相对直接,只需提供准确的数据库…...
nVisual分享社区正式上线啦!
nVisual分享社区正式上线啦! 访问地址:分享社区 nVisual是耐威迪基于数字孪生技术物联网技术开发的一款基础设施数字孪生软件工具,主要实现OSP室外与ISP室内基础设施的规划、记录、分析的可视化管理。 规划:nVisual可视化、智能化…...
4.5.门控循环单元GRU
门控循环单元GRU 对于一个序列,不是每个观察值都是同等重要的,可能会遇到一下几种情况: 早期观测值对预测所有未来观测值都具有非常重要的意义。 考虑极端情况,第一个观测值包含一个校验和,目的是在序列的末尾辨别…...
10种 Python数据结构,从入门到精通
今天我们将深入探讨 Python 中常用的数据结构,帮助你从基础到精通。每种数据结构都有其独特的特点和适用场景,通过实际代码示例和生活中的比喻,让你更容易理解这些概念。 学习数据结构的三个阶段 1、掌握基本用法:使用这些数据结…...
【AI】人工智能时代,程序员如何保持核心竞争力?
目录 程序员在AI时代的应对策略1. 引言2. AI在编程领域的影响2.1 AI辅助编程工具的现状2.2 AI对编程工作的影响2.3 程序员的机遇与挑战 3. 深耕细作:专注领域的深度学习3.1 专注领域的重要性3.2 深度学习的策略3.2.1 选择合适的领域3.2.2 持续学习和研究3.2.3 实践与…...
WPF学习(3)- WrapPanel控件(瀑布流布局)+DockPanel控件(停靠布局)
WrapPanel控件(瀑布流布局) WrapPanel控件表示将其子控件从左到右的顺序排列,如果第一行显示不了,则自动换至第二行,继续显示剩余的子控件。我们来看看它的结构定义: public class WrapPanel : Panel {pub…...
【python】Python中实现定时任务常见的几种方式原理分析与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
老公请喝茶,2024年老婆必送老公的养生茶,暖暖的很贴心
在这个快节奏的时代,每个人都在为生活奔波,而家的温馨与关怀,成了我们最坚实的后盾。随着2024年的已经过半,作为妻子,你是否也在寻找一份特别的礼物,来表达对老公深深的爱意与关怀?在这个充满爱…...
3d打印相关资料
模型库 拓竹makerworld爱给...
MySQL1 DDL语言
安装与配置 官网: MySQL :: Download MySQL Installer 阿里云: MySQL8 https://www.alipan.com/s/auhN4pTqpRp 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速…...
el-tree懒加载状态下实现搜索筛选(纯前端)
1.效果图 (1)初始状态 (2)筛选后 2.代码 <template><div><el-inputplaceholder"输入关键字进行过滤"v-model"filterText"input"searchValue"></el-input><el-tree…...
NLP——Transfromer 架构详解
Transformer总体架构图 输入部分:源文本嵌入层及其位置编码器、目标文本嵌入层及其位置编码器 编码器部分 由N个编码器层堆叠而成 每个编码器层由两个子层连接结构组成 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接 第二个子层连接结构包…...
大模型算法面试题(二十)
本系列收纳各种大模型面试题及答案。 1、描述Encoder和Decoder中Attention机制的不同之处 Encoder和Decoder中的Attention机制在自然语言处理(NLP)和序列到序列(Seq2Seq)模型中扮演着重要角色,它们虽然都利用了Attent…...
2024最新最全面的Selenium 3.0 + Python自动化测试框架
文档说明 Selenium是一个用于Web应用程序自动化测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。 Selenium测试的主要功能包括: 测试与浏览器的兼容性:测试应用程序是否能很好的工作在不同的浏览器和操作系统之上。…...
海运中的甩柜是怎么回事❓怎么才能避免❓
什么是甩柜? 甩柜又叫甩箱,是指集装箱船在起运离港时,船公司没有将此前计划装船的集装箱装运上船,导致部分货物滞留港口。多出现在海运旺季。 为什么会甩柜? 甩箱是集装箱物流中常见的事件,主要因为承运…...
Win11+docker+gpu+vscode+pytorch配置anomalib(2)
在上一篇文章中,我在Win11上通过Docker配置了pytorch,并顺利调用了GPU。在这篇文章中,我将继续完成anomalib的配置。 anomalib是一个非常完善的异常检测框架,我希望通过它来学习经典异常检测算法,并且测试这些算法在我自己的数据集上的效果。 步骤如下: 1. 从docker Hub上…...
AI在招聘市场趋势分析中的应用
一、引言 在数字化、智能化的时代背景下,人工智能(AI)技术正逐步渗透到各行各业,其中招聘市场也不例外。AI技术的运用不仅极大地提高了招聘的效率和精准度,还在招聘市场趋势分析方面展现出巨大的潜力。本文旨在探讨AI在…...
AMEYA360:太阳诱电应对 165℃的叠层金属类功率电感器实现商品化!
太阳诱电株式会社实现了可以满足车载被动部件认定的可靠性试验规格“AEC-Q200”的叠层金属类功率电感器 MCOIL™“LACNF2012KKTR24MAB”(2.0x1.25x1.0mm,高度为最大值)等 4 个产品的商品化。通过本公司独有的金属类材料和叠层工艺的提高,在叠层金属类功率…...
Nginx进阶-常见配置(三)
nginx 变量 Nginx的配置文件使用的语法的就是一门微型的编程语言。既然是编程语言,一般也就少不了“变量”这种东西。 Nginx配置文件使用的语法主要包括以下几个方面: (1)配置块 (Block Directives): Nginx配置文件由多个嵌套的…...
开源协作式书签管理器推荐
不知道有没有人和我一样,不怎么爱用app,反而喜欢保留用古老的浏览器浏览新闻和知识的习惯。那么归档网页和书签一定是你非常头疼的事情。 推荐一款开源软件:Linkwarden ,这是一款独立的开源协作式书签管理器。 Linkwarden 允许用户收集、组…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
