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

news2024/11/23 21:44:59

一、Java 操作 MySQL 数据库

alt

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;

}

@Override

public List<User> findAllUsers() {

// 执行查询数据库操作

// 返回用户列表

}

@Override

public 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 扩展连接数据库的示例:


<?php

try {

$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 对象,提供更便捷的操作接口。其优势包括:

  1. 提高开发效率,降低开发成本。
  1. 实现数据模型与数据库的解耦,方便更换数据库。
  1. 使代码更清晰易维护。

以 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 数据库的方法

  1. 安装与配置
    • 安装 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 可以实现前后端技术的统一,提高开发效率。

总之,在实际项目中选择哪种技术应综合考虑项目规模、性能需求、开发团队技术栈、项目周期等多方面因素。

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

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

相关文章

我不喜欢蔚来的原因

商业逻辑 蔚来主打的是换电和服务。 先说服务&#xff0c;这种极其依赖人工&#xff0c;打造极致尊贵感的服务&#xff0c;是完全无法随着销售规模扩大而降低成本的&#xff0c;相反&#xff0c;如果要保持相同水准的服务&#xff0c;可能会导致成本随着规模扩大而增高&#x…

桥田动态|盛夏官宣 · 桥田全新品牌形象正式发布

VISUAL IDENTITY 2024品牌革新 桥田智能品牌VI系统升级发布 Hi 各位伙伴们&#xff0c;很高兴的告知大家&#xff0c;我们的品牌形象VI和官方网站全面升级。全新的LOGO设计和官方网站将为您带来更为直观和互动的体验。 1 品牌标识 Brand identity 全新LOGO&#xff0c;彰显…

学习STM32(3)--STM32单片机中断的应用

1 引 言 本次实验旨在深入探究STM32F103单片机中断的应用。通过实验&#xff0c;我们将全面掌握STM32F103中断的定义、NVIC&#xff08;Nested Vectored Interrupt Controller&#xff0c;嵌套向量中断控制器&#xff09;的使用和开发&#xff0c;以及外部中断&#xff08;E…

SpringBoot AOP 简单的权限校验

本篇文章的主要内容是通过AOP切面编程实现简单的权限校验。 书接上回登录与注册功能 我们的用户表里面不是有role(权限)这个字段吗 在JWT令牌的生成中&#xff0c;我们加入了role字段。 那么接下来&#xff0c;我们就可以通过这个字段来实现权限校验。 我这里就很简单&#x…

pywinauto:Windows桌面应用自动化测试(七)

前言 上一篇文章地址&#xff1a; pywinauto&#xff1a;Windows桌面应用自动化测试&#xff08;六&#xff09;-CSDN博客 下一篇文章地址&#xff1a; 暂无 一、实战常用方法 1、通过Desktop快速获取窗口 通过之前章节我们了解到控制应用的方法为Application&#xff0…

实战OpenCV之环境安装与配置

OpenCV是什么 OpenCV&#xff0c;英文全称为Open Source Computer Vision Library&#xff0c;是一个开源的计算机视觉和机器学习软件库。它设计用于提供一系列功能强大的算法&#xff0c;以帮助开发者处理图像和视频数据&#xff0c;实现各种视觉任务&#xff0c;包括&#xf…

Nginx进阶-常见配置(三)

nginx 变量 Nginx的配置文件使用的语法的就是一门微型的编程语言。既然是编程语言&#xff0c;一般也就少不了“变量”这种东西。 Nginx配置文件使用的语法主要包括以下几个方面&#xff1a; &#xff08;1&#xff09;配置块 (Block Directives): Nginx配置文件由多个嵌套的…

渗透8-05作业

第十五关: 利用时间盲注 拦截并放到intruder里 请求的参数替换或改写一下 uname1 OR IF(SUBSTRING((SELECT database()), 2, 1)e, sleep(1), 1) -- &passwd1&submitSubmit payload1设置 payload2设置&#xff08;点击从列表中添加可快速找到a到z的列表&#xff09; 开始…

Python | Leetcode Python题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; class Solution:def isPowerOfThree(self, n: int) -> bool:return n > 0 and 1162261467 % n 0

spdlog日志库--基础介绍

文章目录 1. 简介1.1. spdlog代码特点1.2. 说明1.3. spdlog架构 2. spdlog的安装2.1. 使用包管理器安装2.2. 使用源码安装2.3. 仅使用头文件 3. 相关概念3.0 常用的头文件3.1. level_enum3.2. sink3.3. logger3.4 格式输出3.5 对齐方式3.6 截断3.7 字符串格式化fmt 4. 特性4.1.…

职业教育云计算实验实训室建设应用案例

云计算作为信息技术领域的一次革命&#xff0c;正在深刻改变着我们的工作和生活方式。随着企业对云计算技术的依赖日益加深&#xff0c;对具备云计算技能的专业人才的需求也日益迫切。职业院校面临着培养符合行业标准的云计算人才的挑战。唯众凭借其在教育技术领域的专业经验&a…

Web3时代的智能合约:区块链技术的革命性应用

随着区块链技术的发展&#xff0c;Web3时代已经悄然来临。智能合约作为这一时代的重要组成部分&#xff0c;正引领着技术应用的革命性变革。本文将深入解析智能合约的概念、工作原理、应用场景及其带来的挑战与机遇&#xff0c;全面展现其在Web3时代的重要作用。 一、智能合约…

Spring Cloud 整合 Nacos、Sentinel、OpenFigen 实战【微服务熔断降级实战】

前言&#xff1a; 上一篇我们分析了 Sentinel 的各种核心概念点以及 Sentinel 的执行流程&#xff0c;并分别演示了使用 Sentinel 编码和注解方式来管理资源的场景&#xff0c;加上我们前面学习的 Nacos&#xff0c;本篇来分享 Spring Cloud 整合 Nacos、Sentinel、OpenFigen …

密码学基础:搞懂Hash函数SHA1、SHA-2、SHA3(1)

目录 1.消息摘要(Hash) 2.SHA-1 3.SHA-2 4.小结 1.消息摘要(Hash) Hash函数是一种单向密码体制&#xff0c;把任意长度的输入经过变换得到一个固定长度的输出&#xff0c;同时它还具备单向性&#xff0c;只能从明文到密文&#xff0c;不能逆向&#xff0c;正是由于Hash函数…

Golang | Leetcode Golang题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; func isPowerOfThree(n int) bool {return n > 0 && 1162261467%n 0 }

onlyoffice使用Https访问

开发服务器用的是http&#xff0c;一切正常使用&#xff0c;部署到服务器后&#xff0c;由于服务器使用了Https&#xff0c;导致访问onlyoffice时控制台报错。Mixed Content: The page at http://xxxxx// was loaded over HTTPS, but requested an insecure frame http://xxxxx…

Jpa-多表关联-OneToOne

Jpa-多表关联-OneToOne 准备JoinColumnOneToOne属性targetEntitycascade*PERSISTMERGEREMOVEREFRESH orphanRemovalfetchoptionalMappedBy* OneToOne在 hibernate中用于对表与表之间进行维护关联 准备 import com.alibaba.fastjson.JSON; import jakarta.persistence.*; impor…

K210烧录固件失败原因

1.检查固件信息&#xff0c;我这里用的是亚博智能提供的canmv固件 2.检查串口有无被占用&#xff0c;我就是因为打开了另一个正点原子的串口接收软件卡这么久 3.你要烧录canmv固件而非maixypy固件 若烧录maixypy要用maixipy来开发 4。可以看看换不同下载方式

辛迪·克劳馥与“惊艳”家人合影,装扮完美协调 幸福满满

我的意思是——辛迪克劳馥拥有一个令人叹为观止的家庭&#xff0c;这真的有什么好奇怪的吗&#xff1f;毕竟&#xff0c;她是世界知名的超级名模&#xff0c;她把基因和颧骨传给了她的孩子&#xff0c;让他们很容易追随她的脚步。所以&#xff0c;当我们看到她最近的家庭照片时…

面试笔记 8.5

面试常见: Jvm&#xff0c;高并发&#xff0c;多线程&#xff0c;数据库&#xff0c;redis&#xff0c;框架 1.N I/O有什么核心组件 Java NIO 基本原理以及三大核心组件_java nio核心组件有哪些-CSDN博客 Buffer 缓冲 Channel 一对一 Channel 读取数据 Selector对应线程…