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

Hibernate 使用详解

在现代的Java开发中,数据持久化是一个至关重要的环节。而在众多持久化框架中,Hibernate以其强大的功能和灵活性,成为了开发者们的首选工具。本文将详细介绍Hibernate的原理、实现过程以及其使用方法,希望能为广大开发者提供一些有价值的参考。

1. 什么是Hibernate

Hibernate是一个对象关系映射(ORM)框架,它将Java类与数据库表映射起来,从而实现数据持久化。Hibernate通过提供一种透明的持久化机制,使开发者可以通过面向对象的方式操作数据库,而无需编写大量的SQL代码。它支持多种数据库,并且能够根据需求自动生成SQL语句,大大简化了数据库操作的复杂性。

2. Hibernate的核心组件

要深入了解Hibernate,首先需要认识其核心组件:

  1. Configuration:配置Hibernate,加载Hibernate配置文件和映射文件,创建SessionFactory。
  2. SessionFactory:负责初始化Hibernate,创建Session对象。是线程安全的,可以被多个线程共享使用。
  3. Session:代表与数据库的一次会话,用于执行CRUD(增删改查)操作。Session不是线程安全的,每个线程应该有自己的Session实例。
  4. Transaction:用于管理事务。可以显式地开启、提交和回滚事务。
  5. Query:用于执行数据库查询,支持HQL(Hibernate Query Language)和原生SQL。

3. Hibernate的配置

在使用Hibernate之前,我们需要进行一些基本的配置。通常,Hibernate的配置文件有两种:hibernate.cfg.xmlhibernate.properties。下面我们来看看一个简单的hibernate.cfg.xml示例:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><!-- JDBC Database connection settings --><property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">password</property><!-- JDBC connection pool settings --><property name="hibernate.c3p0.min_size">5</property><property name="hibernate.c3p0.max_size">20</property><property name="hibernate.c3p0.timeout">300</property><property name="hibernate.c3p0.max_statements">50</property><property name="hibernate.c3p0.idle_test_period">3000</property><!-- SQL dialect --><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!-- Echo all executed SQL to stdout --><property name="hibernate.show_sql">true</property><!-- Drop and re-create the database schema on startup --><property name="hibernate.hbm2ddl.auto">update</property><!-- Names the annotated entity class --><mapping class="com.example.MyEntity"/></session-factory>
</hibernate-configuration>

在这个配置文件中,我们定义了数据库连接属性、连接池设置、SQL方言、SQL输出以及实体类的映射。通过这些配置,Hibernate可以自动管理数据库连接并生成相应的SQL语句。

4. 实体类映射

实体类是Hibernate进行对象关系映射的核心。每个实体类对应数据库中的一个表,每个类的属性对应表中的列。通过注解或XML配置,我们可以指定这些映射关系。以下是一个简单的实体类示例:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;@Entity
public class MyEntity {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String description;// Getters and setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}
}

在这个示例中,我们使用了JPA注解来定义实体类的映射关系。@Entity表示这是一个实体类,@Id表示主键,@GeneratedValue定义了主键的生成策略。此外,类中的属性会自动映射到对应的数据库列。

5. Hibernate的基本操作

5.1 保存实体

保存实体是将对象持久化到数据库中的过程。通过Session对象,我们可以轻松地将实体保存到数据库中。下面是一个示例:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateSaveExample {public static void main(String[] args) {// 创建SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();// 获取SessionSession session = sessionFactory.openSession();// 开始事务session.beginTransaction();// 创建实体对象MyEntity myEntity = new MyEntity();myEntity.setName("Example Name");myEntity.setDescription("Example Description");// 保存实体session.save(myEntity);// 提交事务session.getTransaction().commit();// 关闭Sessionsession.close();}
}

在这个示例中,我们首先创建了一个SessionFactory对象,然后通过SessionFactory获取一个Session对象。接着,开启事务,创建实体对象,并使用session.save方法将实体保存到数据库中。最后,提交事务并关闭Session

5.2 查询实体

Hibernate提供了多种查询方式,包括HQL、Criteria API和原生SQL。下面我们以HQL为例,演示如何查询实体:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;import java.util.List;public class HibernateQueryExample {public static void main(String[] args) {// 创建SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();// 获取SessionSession session = sessionFactory.openSession();// 开始事务session.beginTransaction();// 执行HQL查询List<MyEntity> results = session.createQuery("from MyEntity", MyEntity.class).list();// 输出结果for (MyEntity entity : results) {System.out.println(entity.getName() + ": " + entity.getDescription());}// 提交事务session.getTransaction().commit();// 关闭Sessionsession.close();}
}

在这个示例中,我们使用session.createQuery方法执行了一条简单的HQL查询,获取了所有MyEntity对象,并打印出它们的名称和描述。

5.3 更新实体

更新实体是修改已存在的持久化对象。通过Session对象,我们可以轻松地更新实体。下面是一个示例:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateUpdateExample {public static void main(String[] args) {// 创建SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();// 获取SessionSession session = sessionFactory.openSession();// 开始事务session.beginTransaction();// 获取实体对象MyEntity myEntity = session.get(MyEntity.class, 1L);if (myEntity != null) {// 更新实体属性myEntity.setDescription("Updated Description");// 更新实体session.update(myEntity);}// 提交事务session.getTransaction().commit();// 关闭Sessionsession.close();}
}

在这个示例中,我们首先通过session.get方法获取一个持久化的MyEntity对象,然后修改其属性,并使用session.update方法将修改后的实体更新到数据库中。

5.4 删除实体

删除实体是从数据库中移除持久化对象的过程。通过Session对象,我们可以轻松地删除实体。下面是一个示例:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateDeleteExample {public static void main(String[] args) {// 创建SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();// 获取SessionSession session = sessionFactory.openSession();// 开始事务session.beginTransaction();// 获取实体对象MyEntity myEntity = session.get(MyEntity.class, 1L);if (myEntity != null) {// 删除实体session.delete(myEntity);}// 提交事务session.getTransaction().commit();// 关闭Sessionsession.close();}
}

在这个示例中,我们首先通过session.get方法获取一个持久化的MyEntity对象,然后使用session.delete方法将其从数据库中删除。

6. 事务管理

事务管理是保证数据一致性的关键。Hibernate提供了简单易用的事务管理接口。以下是一个示例:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;public class HibernateTransactionExample {public static void main(String[] args) {// 创建SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();// 获取SessionSession session = sessionFactory.openSession();Transaction transaction = null;try {// 开始事务transaction = session.beginTransaction();// 执行一些数据库操作MyEntity myEntity = new MyEntity();myEntity.setName("Transactional Name");myEntity.setDescription("Transactional Description");session.save(myEntity);// 提交事务transaction.commit();} catch (Exception e) {if (transaction != null) {// 回滚事务transaction.rollback();}e.printStackTrace();} finally {// 关闭Sessionsession.close();}}
}

在这个示例中,我们使用session.beginTransaction方法开始事务,并在出现异常时回滚事务。这样可以确保在发生错误时,数据库不会处于不一致的状态。

7. 高级特性

7.1 一级缓存和二级缓存

Hibernate的缓存机制能够显著提高应用程序的性能。Hibernate提供了一级缓存和二级缓存:

  • 一级缓存:是Session级别的缓存,在Session的生命周期内有效。每个Session都有自己的一级缓存。
  • 二级缓存:是SessionFactory级别的缓存,可以被多个Session共享。常用的二级缓存实现有Ehcache、OSCache等。

7.2 延迟加载

延迟加载(Lazy Loading)是Hibernate的一个重要特性。它允许我们在需要时才加载实体的属性,从而提高性能。可以通过在实体类的属性上使用@Basic(fetch = FetchType.LAZY)注解来实现延迟加载。例如:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Basic;
import javax.persistence.FetchType;@Entity
public class MyEntity {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@Basic(fetch = FetchType.LAZY)private String description;// Getters and setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}
}

在这个示例中,description属性会在第一次访问时才被加载。

7.3 级联操作

级联操作允许我们在操作一个实体时,自动操作与之关联的其他实体。可以通过@OneToMany@ManyToOne@OneToOne@ManyToMany注解的cascade属性来实现。例如:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.OneToMany;
import javax.persistence.CascadeType;
import java.util.Set;@Entity
public class MyEntity {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@OneToMany(cascade = CascadeType.ALL)private Set<RelatedEntity> relatedEntities;// Getters and setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<RelatedEntity> getRelatedEntities() {return relatedEntities;}public void setRelatedEntities(Set<RelatedEntity> relatedEntities) {this.relatedEntities = relatedEntities;}
}

在这个示例中,当我们保存或删除MyEntity对象时,relatedEntities集合中的所有RelatedEntity对象也会被相应地保存或删除。

8. 实战演练:构建一个简单的博客系统

为了更好地理解Hibernate的使用,我们将通过一个简单的博客系统示例来演示其应用。

8.1 创建实体类

我们需要创建三个实体类:UserPostComment

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.OneToMany;
import java.util.Set;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;@OneToMany(mappedBy = "user")private Set<Post> posts;// Getters and setters// ...
}@Entity
public class Post {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String title;private String content;@ManyToOneprivate User user;@OneToMany(mappedBy = "post", cascade = CascadeType.ALL)private Set<Comment> comments;// Getters and setters// ...
}@Entity
public class Comment {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String content;@ManyToOneprivate Post post;// Getters and setters// ...
}

8.2 配置Hibernate

我们需要在hibernate.cfg.xml中配置这些实体类:

<hibernate-configuration><session-factory><!-- JDBC Database connection settings --><property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/blog</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">password</property><!-- JDBC connection pool settings --><property name="hibernate.c3p0.min_size">5</property><property name="hibernate.c3p0.max_size">20</property><property name="hibernate.c3p0.timeout">300</property><property name="hibernate.c3p0.max_statements">50</property><property name="hibernate.c3p0.idle_test_period">3000</property><!-- SQL dialect --><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!-- Echo all executed SQL to stdout --><property name="hibernate.show_sql">true</property><!-- Drop and re-create the database schema on startup --><property name="hibernate.hbm2ddl.auto">update</property><!-- Names the annotated entity class --><mapping class="com.example.User"/><mapping class="com.example.Post"/><mapping class="com.example.Comment"/></session-factory>
</hibernate-configuration>

8.3 实现业务逻辑

我们将实现一些基本的业务逻辑,例如创建用户、发布文章和添加评论。

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class BlogApplication {private static SessionFactory sessionFactory;public static void main(String[] args) {// 初始化SessionFactorysessionFactory = new Configuration().configure().buildSessionFactory();// 创建用户User user = createUser("john_doe", "password123");// 发布文章Post post = createPost(user, "My First Post", "This is the content of my first post.");// 添加评论addComment(post, "Great post!");// 关闭SessionFactorysessionFactory.close();}public static User createUser(String username, String password) {Session session = sessionFactory.openSession();session.beginTransaction();User user = new User();user.setUsername(username);user.setPassword(password);session.save(user);session.getTransaction().commit();session.close();return user;}public static Post createPost(User user, String title, String content) {Session session = sessionFactory.openSession();session.beginTransaction();Post post = new Post();post.setTitle(title);post.setContent(content);post.setUser(user);session.save(post);session.getTransaction().commit();session.close();return post;}public static void addComment(Post post, String content) {Session session = sessionFactory.openSession();session.beginTransaction();Comment comment = new Comment();comment.setContent(content);comment.setPost(post);session.save(comment);session.getTransaction().commit();session.close();}
}

通过这个简单的博客系统示例,我们可以看到如何使用Hibernate进行基本的CRUD操作,以及如何处理实体之间的关系。

结语

Hibernate作为一个强大的ORM框架,通过提供透明的持久化机制,大大简化了Java开发者对数据库的操作。本文详细介绍了Hibernate的原理、配置、基本操作、高级特性以及一个实际的应用示例,希望能帮助读者更好地理解和使用Hibernate。在实际开发中,Hibernate不仅能提高开发效率,还能有效地管理数据的一致性和完整性,是Java开发者不可或缺的利器。

相关文章:

Hibernate 使用详解

在现代的Java开发中&#xff0c;数据持久化是一个至关重要的环节。而在众多持久化框架中&#xff0c;Hibernate以其强大的功能和灵活性&#xff0c;成为了开发者们的首选工具。本文将详细介绍Hibernate的原理、实现过程以及其使用方法&#xff0c;希望能为广大开发者提供一些有…...

乐普医疗校招社招笔试/测评通关攻略、最新北森题库、可搜索答案

乐普医疗为什么要做笔试/测评? 笔试/测评是乐普医疗校招社招招聘流程中的必经环节&#xff0c;只有完成笔试/测评,候选人才有机会进入面试流程,同学们收到笔试测评通知后请尽快完成。我们给部分岗位安排了笔试,笔试的成绩对于面试官来说是很重要的参考依据,请同学们在笔试过程…...

uniapp在线下载安装包更新app

首先用getSystemInfo判断平台、 再通过json文件模拟接口 判断版本号是否一致 不一致则下载服务器apk进行更新 外加网络波动导致失败重新下载更新包 uni.getSystemInfo({success: function (e) {// #ifndef H5// 获取手机系统版本const system e.system.toLowerCase();const pl…...

Unity | AmplifyShaderEditor插件基础(第一集:简单了解ASE和初识)

前言 我本来老老实实的写着我的Shader&#xff0c;群里的小伙伴强烈建议我开始讲ASE&#xff0c;我只能说&#xff0c;我是一个听话的Up。 一、什么是ASE 全称AmplifyShaderEditor&#xff0c;是一个unity插件&#xff0c;存在于unity商城中&#xff0c;售价看他们心情。&am…...

Windows文件资源管理器未响应,磁盘状态正常,很可能是这个原因

最近使用电脑&#xff0c;老感觉性能吃力&#xff0c;就想着自己把一些自动和延迟启动的服务给关掉一些&#xff0c;结果不小心把Work Folders给关闭了。于是&#xff0c;文件资源管理器能正常打开窗口&#xff0c;但是去点击磁盘或者去打开近期访问文件夹&#xff0c;它就会一…...

良好的代码习惯

虽然我们大家都知道这个道理&#xff0c;但能长期坚持下来的并不多。 在多年的项目开发过程中&#xff0c;遇到了各型各色的程序员&#xff0c;有技术一流的&#xff0c;有速度一流的&#xff0c;当然也有bug不断的&#xff0c;但真正能做到养成良好代码习惯并不多&#xff0c…...

音乐生成模型应用

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...

DBEUG:二维图尺寸没思路

问题 标注总是不对 解决 关注孔&#xff08;螺纹 沉头 通孔 标注清楚&#xff09;关注孔的定位&#xff08;同心圆 靠边定位&#xff09;0.02一定打开三维图 看装配关系过盈 还是 查公差表可以min max限制装配公差一定要有意义部分宽度变化大的加平行修改的rev改成1 方框1表…...

【图像去雾系列】使用SSR/MSR/MSRCR/MSRCP/automatedMSRCR算法对单图像进行图像增强,达到去雾效果

目录 一 图像去雾算法概述 二 SSR/MSR/MSRCR算法 三 实践 一 图像去雾算法概述 近些年来,出现了众多的单幅图像去雾算法,其主要可以分为 3 类:基于图像增强的去雾算法、基于图像复原的去雾算法和基于 CNN 的去雾算法。 ▲基于图像增强的去雾算法 通过图像增强技术突出图…...

oracle普通导出导入

原始的普通导出导入工具&#xff0c;是一个客户端工具。使用导出工具&#xff08;export utility简称exp&#xff09;是将数据从oracle数据库以二进制形式写入操作系统文件&#xff0c;这个文件存储在数据库之外&#xff0c;并且可以被另一个数据库使用导入工具&#xff08;imp…...

如何将CSDN文章导出为pdf文件

第一步&#xff1a; 打开想要导出的页面&#xff0c;空白处点击鼠标右键⇒点击“检查”或“check”&#xff0c;或直接在页面按F12键。 第二步&#xff1a; 复制以下代码粘贴到控制台&#xff0c;并按回车。 若提示让输入“允许粘贴”或“allow pasting”&#xff0c;按提示…...

利用Python实现供应链管理中的线性规划与资源优化——手机生产计划1

目录 写在开头1. Python与线性规划的基础2.供应链管理中的资源优化3.利用Python进行供应链资源优化3.1 简单的优化实例3.2 考虑多种原材料3.3 多种原材料、交付时间与物流融合的情况 4.规范性分析在供应链管理中的应用价值写在最后 写在开头 在全球供应链日益复杂的背景下&…...

Spring Cloud全解析:配置中心之springCloudConfig分布式配置动态刷新

分布式配置动态刷新 当配置中心中的配置修改之后&#xff0c;客户端并不会进行动态的刷新&#xff0c;每次修改配置文件之后&#xff0c;都需要重启客户端&#xff0c;那么如何才能进行动态刷新呢 可以使用RefreshScope注解配合actuator端点进行手动刷新&#xff0c;不需要重…...

mac如何查看shell是 zsh还是bash

怎么确定mac使用的 shell类型 在终端中输入echo $0命令查看你所使用的 shell&#xff08;默认使用的zsh&#xff09; echo $0# 或者 echo $SHELL 如果是 bash 配置文件则为&#xff1a;~/.bash_profile 是 zsh&#xff0c;则配置文件为&#xff1a;~/.zshrc 如何更改默认 S…...

STM32cubeMX配置Systick的bug

STM32cubeMX版本&#xff1a;6.11.0 现象 STM32cubeMX配置Systick的时钟&#xff0c;不管选择不分频 还是8分频。 生成的代码都是一样的&#xff0c;代码都是不分频。 即不管选择不分频还是8分频&#xff0c;Systick都是使用的系统时钟 函数调用 HAL_Init() → HAL_Init…...

分享几个好用js片段

最近在做telegram小程序&#xff0c;所以又回归了web端了&#xff0c;发现几个好用又简洁的代码片段&#xff0c;在这里分享一下。 获取浏览器cookie值 const cookie name > ; ${document.cookie}.split(; ${name}).pop().split(;).shift();cookie(_ga); 2. 将RGB转换为1…...

web前端之实现一只可爱的小杰尼乌龟、伪元素、动画

MENU 前言效果图htmlstyle 前言 代码段使用HTML和CSS创建一个“杰尼龟”的动画。 效果图 html <div class"squirtle"><div class"tail"></div><div class"body"><div class"stomach"></div><d…...

银河麒麟服务器版在rc.local使用ifcong 配置IP和nmcli的区别

1、使用ifconfig配置IP ‌ifconfig是一个传统的网络配置工具&#xff0c;‌它直接操作网络接口&#xff0c;‌允许用户手动设置IP地址、‌子网掩码等网络参数。‌这种方式比较直接&#xff0c;‌但需要用户对网络接口和配置有较深入的了解。‌使用ifconfig配置的IP地址在系统重…...

【运维】深入理解 Linux 中的 `mv` 命令,使用 `mv` 移动所有文件但排除特定文件或文件夹

文章目录 一、基本语法二、基本用法三、使用 `mv` 移动所有文件但排除特定文件或文件夹**命令解释:**四、其他常用选项五、总结深入理解 Linux 中的 mv 命令:移动文件和文件夹的艺术 在日常使用 Linux 的过程中,mv(move)命令是我们经常会用到的一个命令,它不仅可以用来移…...

Xilinx课程,就这么水灵灵地上线了~

如果你想了解&#xff1a; 如何利用精通流水线&#xff08;Pipeline&#xff09;技术&#xff0c;让电路设计效率倍增&#xff1f; 如何掌握利用性能基线指导设计流程的方法&#xff1f; 如何理解集成电路设计中的UltraFast Design Methodology Implementation设计方法学中的…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...