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

[spring] Spring JPA - Hibernate 多表联查 1

[spring] Spring JPA - Hibernate 多表联查

之前在 [spring] spring jpa - hibernate 名词解释&配置 和 [spring] spring jpa - hibernate CRUD 简单的学习了一下怎么使用 Hibernate 实现 CRUD 操作,不过涉及到的部分都是逻辑上比较简单的实现——只在一张表上进行操作

关于多表关联的部分,只是在关键字中提到了有提到过 Relationship 的注解,之后这两章内容就会对 Relationship 进行学习

基础概念

这里回顾一下数据库的基础概念,具体的使用方式在后面的笔记中会被提到,所以这里也就不 cv 代码了

  • 主键(Primary Key)& 外键(Foreign Key)

    主键是一个表中的一个或多个列,能够表示当前数据在当前表中的唯一性,每个表只能有一个主键

    比较常见用一个列作为主键的情况有学生 id,课程 id,书籍 id,图书馆 id 等

    用多个列作为主键的情况,一般代表单独的一个列无法完整表达对应信息,如学生选修的课程,这种情况下主键可以使用学生 id+课程 id+年份,或者图书的出借记录,可以使用学生 id+书籍 id+出借日期等

    外键用于引用另一张表的主键,如上面多个列作为主键的情况中,学生 id、书籍 id 都是外键

  • 级联(Cascade)

    Cascade 是一种为了维护数据库完整性的机制,这里不会过多的设计到数据库的 Cascade,而是提一下 hibernate 中的 Cascade 类型,也就是 CascadeType

    • PERSIST 代表当持久化一个实体时,其关联的实体也会被实体化

    • MERGE 代表当更新一个实体时,其关联的实体也会被更新

      准确的说是 merge 操作,不过大多数情况下 merge 操作被用来当做更新

    • REMOVE 代表当删除一个实体时,其关联的实体也会被删除

    • REFRESH 代表当更新一个实体时,其关联的实体也会被更新

    • DETACH 代表当更新一个分离时,其关联的实体也会被分离

      这个主要代表当前的 entity 不再被持久层所管理

    • ALL 代表上述所有的操作都会被执行

    默认情况下,hibernate 不会 cascade 任何操作

  • 数据加载——eager & lazy

    这代表的是两种数据的获取方式,eager 代表当 entity 被获取时,其关联的所有实体也会被同时获取

  • 关系

    • one to one

      即一对一的关系,比如说 国家首都用户用户信息 这种都是比较常见的一对一的关系

    • one to many

      一对多,也是多对一的关系,比较常见的有 作者书籍学生学校

    • many to many

      多对多的关系,这应该是最常见的情况了,比如说 作者出版商学生

    需要注意的是,不同的关系在不同的系统中都会有些微的差异,并非不可改变。比如说以电话系统为例,虽然日常生活中,常见的案例为 一号一人,设计上可能会偏好将 电话号码 以 一对多 的关系进行构建。但是在 ToB 的业务中就需要考虑到公司号码其实会被分拨到不同的客服手上的情况,相对于 ToC 端 one-to-many 的设计,toB 端可能就要进行 many-to-many 的设计修正

  • 实体生命周期

    hibernate session 中的生命周期有 4 个:

    • transient

      new instance,如果没有引用就会被 GC 回收

    • persist

      与 persistence context 关联,这个情况下,hibernate 会对数据的更新进行管理和同步

    • detached

      hibernate 不再对数据进行管理

    • removed

      准备彻底被删除

    geeksforgeeks 上找到了个图描述了一下生命周期:

    [外链图片转存中…(img-U6GRZ8j5-1742269905179)]

    整体来说这个部分还是比较复杂的,简单的几句话很难描述整个生命周期的流程,图里也缺少了一些必要的 op,比如 rollback 之类的,有空再补充一下 hibernate 好了

这章笔记主要过一遍 1-1 的数据关联,以及原始笔记是很久之前写的了,我重新走了一下流程补充了点内容,所以项目名称会有点差异……

one-to-one uni-relational

instructor details
instructor

uni-relational 的关系如上面图所示,即 A 能够找到 B 的关联,但是 B 无法回溯到 A

设置数据库

脚本如下:

DROP SCHEMA IF EXISTS `hb-01-one-to-one-uni`;CREATE SCHEMA `hb-01-one-to-one-uni`;use `hb-01-one-to-one-uni`;SET FOREIGN_KEY_CHECKS = 0;CREATE TABLE `instructor_detail` (`id` int NOT NULL AUTO_INCREMENT,`youtube_channel` varchar(128) DEFAULT NULL,`hobby` varchar(45) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;CREATE TABLE `instructor` (`id` int NOT NULL AUTO_INCREMENT,`first_name` varchar(45) DEFAULT NULL,`last_name` varchar(45) DEFAULT NULL,`email` varchar(45) DEFAULT NULL,`instructor_detail_id` int DEFAULT NULL,PRIMARY KEY (`id`),KEY `FK_DETAIL_idx` (`instructor_detail_id`),CONSTRAINT `FK_DETAIL` FOREIGN KEY (`instructor_detail_id`) REFERENCES `instructor_detail` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;SET FOREIGN_KEY_CHECKS = 1;

ER 图如下:

在这里插入图片描述

ER 图是 dbeaver(有免费版)根据对应的数据库自动生成的,有图就可以证明 ER 图生成的没问题了

配置项目

新建项目

依旧用 spring initializer 实现:

在这里插入图片描述

main 文件如下:

package com.example.demo;import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@Beanpublic CommandLineRunner commandLineRunner(String[] args) {return runner -> {System.out.println("Hello World!");};}
}

这样就创建了一个终端 app

properties 文件修改

如下:

# JDBC properties
spring.datasource.url=jdbc:mysql://localhost:3306/hb-01-one-to-one-uni
spring.datasource.username=springstudent
spring.datasource.password=springstudent
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect# Disable Hibernate usage of JDBC metadata
# not having this can resolve error
spring.jpa.properties.hibernate.boot.allow_jdbc_metadata_access=false# turn of the banner and lower the logging level
spring.main.banner-mode=off
logging.level.root=warn

运行结果如下:

2025-03-17T17:58:18.452-04:00  WARN 62459 --- [demo-one-to-one-uni] [           main] org.hibernate.orm.deprecation            : HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
Hello World!Process finished with exit code 0

创建 entity

主要就是两个,InstructorDetail 对应 instructor_detail, Instructor 对应 instructor

  • instructor details

    package com.example.demo.entity;import jakarta.persistence.*;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;@Entity
    @Table(name = "instructor_detail")
    @Data
    @NoArgsConstructor
    @ToString
    public class InstructorDetail {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id")private int id;@Column(name = "youtube_channel")private String youtubeChannel;@Column(name = "hobby")private String hobby;public InstructorDetail(String youtubeChannel, String hobby) {this.youtubeChannel = youtubeChannel;this.hobby = hobby;}
    }
  • instructor

    package com.example.demo.entity;import jakarta.persistence.*;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;@Entity
    @Table(name = "instructor")
    @Data
    @NoArgsConstructor
    @ToString
    public class Instructor {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id")private int id;@Column(name = "first_name")private String firstname;@Column(name = "last_name")private String lastname;@Column(name = "email")private String email;// set up mapping to InstructorDetail@OneToOne(cascade = CascadeType.ALL)@JoinColumn(name = "instructor_detail_id")private InstructorDetail instructorDetail;public Instructor(String firstname, String lastname, String email) {this.firstname = firstname;this.lastname = lastname;this.email = email;}
    }

基本上没什么新的东西,除了下面这段:

      @OneToOne(cascade = CascadeType.ALL)@JoinColumn(name = "instructor_detail_id")private InstructorDetail instructorDetail;

具体内容最后补充

DAO & DAOimpl

这个的实现就比较简单了,因为只是做 demo,所以没打算分成几个文件去写,所有数据库的操作都会放在这里,并且调用 entityManager 中的方法去实现,而不会用 extend JpaRepository 的方法去实现

  • AppDAO

    package com.example.demo.dao;import com.example.demo.entity.Instructor;public interface AppDAO {void save (Instructor instructor);
    }
  • AppDAOImpl

      package com.example.demo.dao;import com.example.demo.entity.Instructor;import jakarta.persistence.EntityManager;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Repository;@Repositorypublic class AppDAOImpl implements AppDAO{private final EntityManager entityManager;@Autowiredpublic AppDAOImpl(EntityManager entityManager) {this.entityManager = entityManager;}@Override@Transactionalpublic void save(Instructor instructor) {// it will also save instructor detail due to cascadeentityManager.persist(instructor);}}

    ⚠️:这个 @Transactional 导入 spring 的就好,导入 jakara 的话,spring boot 就不会管理了

更新一下 main

主要是增加一下 logging 以及输出结果

package com.example.demo;import com.example.demo.dao.AppDAO;
import com.example.demo.entity.Instructor;
import com.example.demo.entity.InstructorDetail;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@Beanpublic CommandLineRunner commandLineRunner(AppDAO appDAO) {return runner -> {createInstructor(appDAO);};}private void createInstructor(AppDAO appDAO) {// create the instructorInstructor instructor = new Instructor("John", "Doe", "johndoe@gmail.com");InstructorDetail instructorDetail = new InstructorDetail("http://www.example.com", "Coding");// associate the objectsinstructor.setInstructorDetail(instructorDetail);// NOTE: this will ALSO save the details object because of CascadeType.ALLSystem.out.println("Saving instructor: " + instructor);appDAO.save(instructor);System.out.println("Done!");}
}

运行结果:

在这里插入图片描述

可以看到,这里具体执行了 2 条 queries,一个是写入 instructor,另一个是写入 instructor_details

数据库截图:

在这里插入图片描述

查询实例

这个操作很简单,主要修改三个文件:

  • DAO

    public interface AppDAO {Instructor findInstructorById(int id);
    }
    
  • DAOImpl

    @Repository
    public class AppDAOImpl implements AppDAO{@Overridepublic Instructor findInstructorById(int id) {return entityManager.find(Instructor.class, id);}
    }
  • main

        @Beanpublic CommandLineRunner commandLineRunner(AppDAO appDAO) {return runner -> {findInstructor(appDAO);};}private void findInstructor(AppDAO appDAO) {int id = 1;System.out.println("Finding instructor id: " + id);Instructor instructor = appDAO.findInstructorById(id);System.out.println("Instructor: " + instructor);System.out.println("Associated Instructor Details: " + instructor.getInstructorDetail());}
    

效果如下:

在这里插入图片描述

删除实例

也是一样的操作,修改 3 个文件:

  • DAO

    public interface AppDAO {void deleteInstructorById(int id);
    }
    
  • DAOImpl

        @Override@Transactionalpublic void deleteInstructorById(int id) {Instructor instructor = this.findInstructorById(id);if (instructor != null) {entityManager.remove(instructor);}}
    
  • main

        @Beanpublic CommandLineRunner commandLineRunner(AppDAO appDAO) {return runner -> {deleteInstructor(appDAO);};}private void deleteInstructor(AppDAO appDAO) {int id = 2;System.out.println("Deleting instructor id: " + id);appDAO.deleteInstructorById(id);System.out.println("Done!");}
    

结果如下:

在这里插入图片描述

one-to-one bi-directional

这个修改其实没必要动数据库,等到之后捋一遍就明白为什么了

更新查询实例

public class InstructorDetail {// ...// updated code@OneToOne(mappedBy = "instructorDetails", cascade = CascadeType.ALL)private Instructor instructor;// ...// remove @ToString annotation as null field(private Instructor instructor;) will throw error@Overridepublic String toString() {return "InstructorDetail: id = " + this.getId() + ", youtubeChannel: " + this.getYoutubeChannel()+ ", hobby: " + this.getHobby() + ".";}
}

@toString 空值会造成 lombok 的一些问题,在这个 ticket 有提到:@ToString formatting ‘language’. #1297。这里用 getId() 比较合适,否则的话会造成循环调用,形成无止尽的递归

DAO 和 DAOImpl 更新

主要是获取新的 InstructorDetails,代码比较简单:

public interface AppDAO {InstructorDetail findInstructorDetailById(int id);
}
    @Overridepublic InstructorDetail findInstructorDetailById(int id) {return entityManager.find(InstructorDetail.class, id);}

更新 main 方法

其实就是新增一个方法,去获取输出通过 findInstructorDetailById 获取的实例:

	@Beanpublic CommandLineRunner commandLineRunner(AppDAO appDAO) {return runner -> {findInstructorDetail(appDAO);};}private void findInstructorDetail(AppDAO appDAO) {// find the instructor detail objectint id = 1;InstructorDetail instructorDetail = appDAO.findInstructorDetailById(id);System.out.println("Instructor Detail:" + instructorDetail);// print the associated instructorSystem.out.println("Associated instructor: " + instructorDetail.getInstructor());System.out.println("Done.");}

输出结果

在这里插入图片描述

删除实例更新

  • DAO

    void deleteInstructorDetailById(int id);
    
  • DAO Impl

        @Override@Transactionalpublic void deleteInstructorDetailById(int id) {InstructorDetail instructorDetail = this.findInstructorDetailById(id);if (instructorDetail != null) {entityManager.remove(instructorDetail);}}
    
  • main

      @Beanpublic CommandLineRunner commandLineRunner(AppDAO appDAO) {return runner -> {deleteInstructorDetail(appDAO);};}private void deleteInstructorDetail(AppDAO appDAO) {int id = 1;System.out.println("Deleting instructor id: " + id);appDAO.deleteInstructorDetailById(id);System.out.println("Done!");}
    

结果:

在这里插入图片描述

只删除 instructor detail 但是不删除 instructor

这个方式可以通过修改 CascadeType 去实现,如:

    @OneToOne(mappedBy = "instructorDetail", cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})private Instructor instructor;

修改 DAO Impl 去手动移除关联:

    @Override@Transactionalpublic void deleteInstructorDetailById(int id) {InstructorDetail instructorDetail = this.findInstructorDetailById(id);// remove the associated object reference, break the bi-directional linkinstructorDetail.getInstructor().setInstructorDetail(null);entityManager.remove(instructorDetail);}

最后运行结果:

在这里插入图片描述

在这里插入图片描述

建立关联的注解

@JoinColumn

这个代表的是当前属性为 foreign key,并且可以通过当前的 foreign key 寻找到对应的实例

需要注意的是, @JoinColumn 无法单独使用,必须要搭配对应的关系——@OneToOne@OneToMany@ManyToMany 才能够正确工作

@OneToOne

这个注解只代表了当前的属性与当前的 entity 存在 1-to-1 的对应关系,参考两种用法:

    @OneToOne(cascade = CascadeType.ALL)@JoinColumn(name = "instructor_detail_id")private InstructorDetail instructorDetail;// =====================================================@OneToOne(mappedBy = "instructorDetails", cascade = CascadeType.ALL)private Instructor instructor;

前者可以直接通过 foreign key 寻找对应的关系,写成 query 大体如下:

select * from instructor_detail where id = 1;

后者的 query 大体如下:

select * from instructor i join instructor_detail d on i.instructor_detail_id  = d.id where i.id = 1;

对比起来的话,前者因为直接用 foreign key 去找,不用调用一个 join,所以表现上会稍微快一些

reference

  • mysql 权限问题

    这个取决于 properties 文件中使用的用户,如果不是 root,那么可能就会有无法访问的问题,这个时候跑一下下面的脚本就行了,用户名和 db 名称用数据库中的代替:

    mysql -u root -p
    USE dbname;# 如果用户不存在,直接 grant 会报错
    CREATE USER 'username'@'%' IDENTIFIED BY 'your_password';
    GRANT ALL PRIVILEGES ON `hb-01-one-to-one-uni`.* TO 'username'@'%';FLUSH PRIVILEGES;SHOW GRANTS FOR 'username'@'%';
    
  • properties 文件配置

    来自官方的 repo: spring-lifecycle-smoke-tests

相关文章:

[spring] Spring JPA - Hibernate 多表联查 1

[spring] Spring JPA - Hibernate 多表联查 之前在 [spring] spring jpa - hibernate 名词解释&配置 和 [spring] spring jpa - hibernate CRUD 简单的学习了一下怎么使用 Hibernate 实现 CRUD 操作,不过涉及到的部分都是逻辑上比较简单的实现——只在一张表上…...

鸿蒙Next开发实战教程—电影app

最近忙忙活活写了不少教程,但是总感觉千篇一律,没什么意思,大家如果有感兴趣的项目可以私信给幽蓝君写一写。 今天分享一个电影App。 这个项目也比较简单,主要是一些简单页面的开发和本地视频的播放以及横竖屏切换。 页面搭建以…...

共享栈 线程局部存储 线程互斥 线程同步 消费者生产者模型

共享栈 第一个主线程会在栈区 而当其他线程创建时实在共享区动态申请的栈区 线程局部存储 __thread 关键字 与编译有关 全局变量是被线程共享的 每个线程都能看到 修改 但是如果对该全局变量加上__thread关键字后 该全局变量就不会被共享 将变量在库中的每一个线程的属…...

停车场停车位数据集,标注停车位上是否有车,平均正确识别率99.5%,支持yolov5-11, coco json,darknet,xml格式标注

停车场停车位数据集,标注停车位上是否有车,平均正确识别率98.0%,支持yolov5-11, coco json,darknet,xml格式标注 数据集-识别停车场所有车辆的数据集 数据集分割 一共184张图片 训练组 89&am…...

【Go】运算符笔记

基本数学运算 Go 语言支持常见的 算术运算符,用于执行数学计算。 运算符说明加法-减法*乘法/除法%取余自增--自减 整数运算只能得到整数部分 package mainimport ("fmt""math" )func main() {go_math() }func go_math() {x, y : 8, 5fmt.Pr…...

ssm框架之mybatis框架讲解

1,Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2…...

CEF 多进程模式时,注入函数,获得交互信息

CEF 控制台添加一函数,枚举 注册的供前端使用的CPP交互函数有哪些-CSDN博客 上篇文章,是在模拟环境,单进程中设置的,这篇文章,将其改到正常多进程环境中设置。 对应于工程中的 CEF_RENDER项目 一、多进程模式中,改写 修改步骤 1、注入函数 client_app_render.cpp 在…...

Androidstudio出现警告warning:意外的元素

这些警告信息通常与 Android SDK 或系统镜像的配置文件有关,可能是由于 SDK 工具或系统镜像的版本不兼容或配置文件格式发生了变化。以下是解决这些警告的步骤: 1. 更新 Android SDK 工具 确保你使用的是最新版本的 Android SDK 工具: 打开…...

深入了解Linux —— git三板斧

版本控制器git 为了我们方便管理不同版本的文件,就有了版本控制器; 所谓的版本控制器,就是能够了解到一个文件的历史记录(修改记录);简单来说就是记录每一次的改动和版本迭代的一个管理系统,同…...

Vala编程语言教程-运算符

运算符 ‌ 赋值操作。左操作数必须为标识符,右操作数必须为适当的值或引用。 ‌, -, /, *, %‌ 基础算术运算,作用于左右操作数。 运算符也可用于字符串拼接。 ‌, -, /, *, %‌ 左右操作数间算术运算,左操作数必须为标识符,运…...

C#本地将labelme数据集转换为机器视觉yolo数据集格式

C#本地,将labelme数据集转换为机器视觉yolo数据集格式 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.Encodings.Web; using System.Text.RegularExpressions; using System.Text.U…...

【软件系统架构】单体架构

一、引言 在软件开发的漫长历程中,架构的选择一直是至关重要的决策。单体架构作为一种经典的架构模式,曾经在许多项目中发挥着不可替代的作用。虽然如今微服务等架构逐渐流行,但理解单体架构对于深入掌握软件架构体系仍然有着重要意义。 二、…...

【求助】【建议放弃】【谷粒商城版】Kubernetes

本文作者: slience_me 文章目录 Kubernetes【谷粒商城版】【建议放弃】1. docker安装2. kubernetes安装前3. kubeadm,kubelet,kubectl3.1 简介kubeadmkubeletkubectl常用指令 3.2 安装3.3 kubeadm初始化3.4 加入从节点(工作节点)3.5 安装Pod网络插件(CNI…...

uniapp 实现微信小程序电影选座功能

拖动代码 /*** 获取点击或触摸事件对应的座位位置* 通过事件对象获取座位的行列信息* param {Event|TouchEvent} event - 点击或触摸事件对象* returns {Object} 返回座位位置对象,包含行(row)和列(col)信息,若未找到有效位置则返回 {row: -1, col: -1}*…...

python+flask实现360全景图和stl等多种格式模型浏览

1. 安装依赖 pip install flask 2. 创建Flask应用 创建一个基本的Flask应用,并设置路由来处理不同的文件类型。 from flask import Flask, render_template, send_from_directory app Flask(__name__) # 设置静态文件路径 app.static_folder static app.r…...

IntelliJ 配置文件plugin.xml

在 IntelliJ IDEA 插件开发中&#xff0c;plugin.xml 是插件的配置文件&#xff0c;它包含了关于插件的所有基本信息、扩展点、依赖关系等。该文件使用 XML 格式进行定义。以下是 plugin.xml 中常见的元素及其用途&#xff1a; <idea-plugin><!-- 插件的基本信息 --&…...

C# Unity 唐老狮 No.10 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho C# 1. 内存中&#xff0c;堆和…...

数据库系统——规范化1NF~BCNF

数据库规范化完全指南&#xff1a;从零到BCNF&#xff0c;中学生也能秒懂&#xff01;&#x1f4da;✨ 一、什么是数据库规范化&#xff1f; 科学定义 &#x1f50d; 数据库规范化是通过一系列规则&#xff08;范式&#xff09;将数据库表结构分解为更小、更高效、无冗余的表…...

第十五届蓝桥杯2024JavaB组省赛试题A:报数游戏

简单的找规律题目。题目给得数列&#xff0c;第奇数项是20的倍数&#xff0c;第偶数项时24的倍数。题目要求第n 202420242024 项是多少。这一项是偶数&#xff0c;所以答案一定是24的倍数&#xff0c;并且偶数项的个数和奇数项的个数各占一半&#xff0c;所以最终的答案ans( n…...

Matlab 汽车二自由度转弯模型

1、内容简介 Matlab 187-汽车二自由度转弯模型 可以交流、咨询、答疑 2、内容说明 略 摘 要 本文前一部分提出了侧偏角和横摆角速度作为参数。描述了车辆运动的运动状态&#xff0c;其中文中使用的参考模型是二自由度汽车模型。汽车速度被认为是建立基于H.B.Pacejka的轮胎模…...

关于 2>/dev/null 的作用以及机理

每个进程都有三个标准文件描述符&#xff1a;stdin&#xff08;标准输入&#xff09;、stdout&#xff08;标准输出&#xff09;和stderr&#xff08;标准错误&#xff09;。默认情况下&#xff0c;stderr会输出到终端。使用2>可以将stderr重定向到其他地方&#xff0c;比如…...

学c++的人可以几天速通python?

学了俩天啊&#xff0c;文章写纸上了 还是蛮有趣的...

HTML,CSS,JavaScript

HTML:负责网页的结构(页面元素和内容)。 CSS:负责网页的表现(页面元素的外观、位置等页面样式&#xff0c;如:颜色、大小等)。 Javascript:负责网页的行为(交互效果)。 MDN前端开发文档(MDN Web Docs) HTML HTML(HyperText Markup Language):超文本标记语言超文本:超越了文本的…...

微信小程序面试内容整理-图片优化

在微信小程序中,图片优化是提升加载速度、节省网络带宽和提高用户体验的重要步骤。图片通常是小程序页面中的主要资源,合理的图片优化能显著提高小程序的性能,尤其是在用户网络状况较差的情况下。 1. 选择合适的图片格式 不同的图片格式有不同的特点,选择合适的格式能够有效…...

Rocky Linux 9.x 基于 kubeadm部署k8s 1.32

一、部署说明 1、主机操作系统说明 序号操作系统及版本备注1Rocky Linux release 9下载链接&#xff1a;https://mirrors.163.com/rocky/9.5/isos/x86_64/Rocky-9.5-x86_64-minimal.iso 2、主机硬件配置说明 作用IP地址操作系统配置关键组件k8s-master01192.168.234.51Rocky…...

【每日学点HarmonyOS Next知识】上下拉列表、停止无限循环动画、页面列表跟随列表滑动、otf字体、日期选择

1、HarmonyOS 实现只需要保留上拉加载更多&#xff0c;但是不需要下拉刷新&#xff1f; Refresh通过参数refreshing判断当前组件是否正在刷新&#xff0c;可以控制该参数变化来触发下拉刷新&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5…...

解决git init 命令不显示.git

首先在自己的项目代码右击 打开git bash here 输入git init 之后自己的项目没有.git文件&#xff0c;有可能是因为.git文件隐藏了&#xff0c;下面是解决办法...

利用AI让数据可视化

1. 从问卷星上下载一份答题结果。 序号用户ID提交答卷时间所用时间来源来源详情来自IP总分1、《中华人民共和国电子商务法》正式实施的时间是&#xff08;&#xff09;。2、&#xff08;&#xff09;可以判断企业在行业中所处的地位。3、&#xff08;&#xff09;是指店铺内有…...

神经网络微调技术解析

神经网络微调技术 微调&#xff08;Fine-tuning&#xff09;是迁移学习的核心技术&#xff0c;通过在预训练模型基础上调整参数&#xff0c;使其适应特定任务或领域。以下从传统方法、参数高效微调&#xff08;PEFT&#xff09;、新兴技术三个维度展开&#xff0c;覆盖主流技术…...

WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)深度解析与实战复现

0x00 漏洞概述 CVE-2017-10271 是Oracle WebLogic Server WLS Security组件中的远程代码执行漏洞。攻击者通过构造恶意XML请求&#xff0c;利用XMLDecoder反序列化机制绕过安全验证&#xff0c;最终实现服务器权限接管。 影响版本 WebLogic 10.3.6.0WebLogic 12.1.3.0WebLog…...