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

Java 代码生成工具:如何快速构建项目骨架?

Java 代码生成工具:如何快速构建项目骨架?

在 Java 项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作。幸运的是,Java 领域有许多代码生成工具可以帮助我们快速完成这一任务,大大提高开发效率。

一、代码生成工具概述

(一)常用 Java 代码生成工具简介

  1. MyBatis Generator

    • MyBatis Generator 是专为 MyBatis 框架设计的代码生成工具。它可以根据数据库表结构自动生成对应的 Mapper 接口、XML 映射文件、实体类等代码。例如,当我们有一个 “users” 表,包含 “id”“name”“age” 等字段,使用 MyBatis Generator 可以快速生成 User 实体类,其中包含这些字段以及对应的 getter 和 setter 方法;同时生成 UserMapper 接口,里面会有诸如 insert、delete、update、select 等基本的数据库操作方法声明,以及对应的 UserMapper.xml 文件,用于书写 MyBatis 的映射 SQL 语句。
  2. Spring Initializr

    • Spring Initializr 是 Spring 官方提供的一个在线项目初始化工具。它可以帮助开发者快速生成基于 Spring Boot 的项目骨架。我们只需要在网页上选择项目的基本信息,如项目名称、版本、依赖(如 Spring Web、Spring Data JPA 等),然后点击生成按钮,就会下载一个完整的项目目录结构,里面包含了构建文件(如 Maven 的 pom.xml 或 Gradle 的 build.gradle)、基础的配置文件(application.properties)、主程序入口类等。
  3. FreeMarker(作为代码生成模板引擎)

    • FreeMarker 是一个基于模板的生成代码工具。它本身不是专门为 Java 代码生成设计的,但可以结合 Java 程序灵活地用于代码生成场景。例如,我们可以定义一套代码模板,如 Java 服务类的模板,规定好类的结构、方法的格式等。然后通过 Java 程序读取数据库表信息或其他元数据,将这些数据填充到 FreeMarker 模板中,就可以生成对应的 Java 代码文件,如根据表字段生成实体类的字段以及相关的操作方法。

(二)代码生成工具的优势

  1. 提高开发效率

    • 减少了手动编写重复、模式化代码的工作量。例如,对于数据库持久层代码,像实体类、Mapper 接口等,通过代码生成工具可以瞬间生成,而手动编写这些代码可能需要花费较多时间和精力,并且容易出错。
  2. 保证代码一致性

    • 按照统一的模板生成代码,可以确保代码风格、结构和命名规范的一致性。这对于团队开发来说尤为重要,有助于提高代码的可读性和可维护性。

二、使用 MyBatis Generator 构建项目骨架

(一)搭建 MyBatis Generator 环境

  1. 添加依赖
    • 如果我们使用 Maven 构建项目,在项目的 pom.xml 文件中添加 MyBatis Generator 的依赖:
<dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.4.1</version>
</dependency>
  1. 配置 MyBatis Generator 配置文件
    • 创建一个 generatorConfig.xml 文件,用于配置数据库连接信息、代码生成的目标位置、模板等。示例配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 数据库连接信息 --><context id="DB2Tables" targetRuntime="MyBatis3Simple"><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/your_database"userId="root"password="password"></jdbcConnection><!-- 生成的实体类等代码的目标位置 --><javaModelGenerator targetPackage="com.example.entity" targetProject="src/main/java"></javaModelGenerator><sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"></sqlMapGenerator><javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"></javaClientGenerator><!-- 指定要生成代码的数据库表 --><table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table></context>
</generatorConfiguration>

(二)运行 MyBatis Generator 生成代码

  1. 编写运行代码的 Java 程序
    • 创建一个 Java 类,使用 MyBatis Generator 的 API 加载配置文件并生成代码:
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;import java.io.File;
import java.util.ArrayList;
import java.util.List;public class Generator {public static void main(String[] args) {List<String> warnings = new ArrayList<>();boolean overwrite = true;File configFile = new File("generatorConfig.xml");ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = null;try {config = cp.parseConfiguration(configFile);DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);myBatisGenerator.generate(null);} catch (Exception e) {e.printStackTrace();}for (String warning : warnings) {System.out.println(warning);}}
}
  1. 查看生成的代码
    • 运行上述 Java 程序后,在指定的目标位置会自动生成 User 实体类、UserMapper 接口和 UserMapper.xml 文件。例如,User 实体类代码如下:
public class User {private Integer id;private String name;private Integer age;// getter 和 setter 方法public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

三、使用 Spring Initializr 构建项目骨架

(一)在 Spring Initializr 网页端操作

  1. 访问 Spring Initializr 网址

    • 打开浏览器,访问https://start.spring.io/。
  2. 填写项目基本信息

    • 在页面上填写项目的基本信息,如 Group(项目的 Maven GroupId)、Artifact(项目的 Maven ArtifactId,通常为项目名称)、Version(项目版本)、Project Metadata(项目元数据,如名称、描述等)。
    • 选择项目使用的构建工具,如 Maven 或 Gradle,以及 Java 版本。
  3. 添加依赖

    • 点击 “Dependencies” 下拉菜单,选择所需的依赖。例如,如果我们是要构建一个 Web 应用,就选择 “Spring Web”;如果是需要操作关系型数据库,就添加 “Spring Data JPA” 以及对应的数据库驱动依赖(如 “MySQL Driver”)。
  4. 生成项目

    • 点击 “Generate” 按钮后,网站会生成一个压缩包。下载并解压后,我们就可以得到一个完整的 Spring Boot 项目骨架。

(二)查看生成的项目结构

  1. 构建文件
    • 对于 Maven 项目,生成的 pom.xml 文件包含了所有选定的依赖。例如,添加了 Spring Web 和 Spring Data JPA 以及 MySQL Driver 依赖后的 pom.xml 部分内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven -4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency></dependencies>
</project>
  1. 主程序入口类
    • 生成的主程序入口类非常简单,包含一个 main 方法,通过 Spring Boot 的 SpringApplication.run() 方法启动应用。示例代码如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

四、使用 FreeMarker 构建项目骨架

(一)引入 FreeMarker 依赖

  1. Maven 依赖配置
    • 在项目的 pom.xml 文件中添加 FreeMarker 的依赖:
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.32</version>
</dependency>

(二)创建代码生成模板

  1. 定义实体类模板(entity.ftl)
    • 例如,以下是一个简单的实体类模板,用于根据表字段生成 Java 实体类代码:
package ${package}.entity;public class ${className} {<#list table.columns as column>// ${column.comments}private ${column.javaType} ${column.javaField};public ${column.javaType} get${column.javaCap}() {return this.${column.javaField};}public void set${column.javaCap}(${column.javaType} ${column.javaField}) {this.${column.javaField} = ${column.javaField};}</#list>
}

(三)结合 Java 程序生成代码

  1. 读取数据库表信息

    • 编写 Java 程序,通过 JDBC 或其他数据库访问方式读取数据库表的元数据,包括表名、字段名、字段类型、字段注释等信息。然后将这些信息封装成一个数据模型,用于填充到 FreeMarker 模板中。
  2. 使用 FreeMarker 生成代码

    • 示例代码如下:
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;public class CodeGenerator {public static void main(String[] args) {// 配置 FreeMarkerConfiguration cfg = new Configuration(Configuration.VERSION_2_3_32);try {// 设置模板文件所在的目录cfg.setDirectoryForTemplateLoading(new File("templates"));// 加载模板Template template = cfg.getTemplate("entity.ftl");// 创建数据模型Map<String, Object> dataModel = new HashMap<>();dataModel.put("package", "com.example");dataModel.put("className", "User");dataModel.put("table", getTableInfo());// 输出代码Writer out = new FileWriter(new File("src/main/java/com/example/entity/User.java"));template.process(dataModel, out);out.close();} catch (IOException | TemplateException e) {e.printStackTrace();}}// 模拟获取表信息的方法public static Table getTableInfo() {Table table = new Table();table.setName("users");// 添加字段信息Column column1 = new Column();column1.setName("id");column1.setJavaType("Integer");column1.setJavaField("id");column1.setJavaCap("Id");column1.setComments("用户 ID");Column column2 = new Column();column2.setName("name");column2.setJavaType("String");column2.setJavaField("name");column2.setJavaCap("Name");column2.setComments("用户名字");Column column3 = new Column();column3.setName("age");column3.setJavaType("Integer");column3.setJavaField("age");column3.setJavaCap("Age");column3.setComments("用户年龄");table.setColumns(new Column[]{column1, column2, column3});return table;}// Table 类用于封装表信息public static class Table {private String name;private Column[] columns;// getter 和 setter 方法public String getName() {return name;}public void setName(String name) {this.name = name;}public Column[] getColumns() {return columns;}public void setColumns(Column[] columns) {this.columns = columns;}}// Column 类用于封装字段信息public static class Column {private String name;private String javaType;private String javaField;private String javaCap;private String comments;// getter 和 setter 方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getJavaType() {return javaType;}public void setJavaType(String javaType) {this.javaType = javaType;}public String getJavaField() {return javaField;}public void setJavaField(String javaField) {this.javaField = javaField;}public String getJavaCap() {return javaCap;}public void setJavaCap(String javaCap) {this.javaCap = javaCap;}public String getComments() {return comments;}public void setComments(String comments) {this.comments = comments;}}
}

通过这种方式,就可以根据数据库表结构生成相应的 Java 实体类代码,如根据上述代码生成的 User 实体类代码如下:

package com.example.entity;public class User {// 用户 IDprivate Integer id;// 用户名字private String name;// 用户年龄private Integer age;public Integer getId() {return this.id;}public void setId(Integer id) {this.id = id;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}public Integer getAge() {return this.age;}public void setAge(Integer age) {this.age = age;}
}

五、对比不同代码生成工具

(一)功能对比

  1. MyBatis Generator

    • 主要针对 MyBatis 持久层框架,功能聚焦在根据数据库表生成 MyBatis 相关的代码,如实体类、Mapper 接口、XML 映射文件等,对于非 MyBatis 项目或不涉及数据库操作的代码生成支持有限。
  2. Spring Initializr

    • 主要用于快速生成 Spring Boot 项目的初始骨架,侧重于项目的整体搭建,包括构建文件、主程序入口类等,但对于项目内部具体的业务代码(如实体类、服务类等)生成能力较弱,需要开发者进一步手动编码。
  3. FreeMarker(结合 Java 程序)

    • 具有高度灵活性,可以根据需求自定义模板,生成各种类型的代码。不仅可以生成 Java 代码,还可以生成配置文件、HTML 页面等。但需要开发者自己编写读取元数据(如数据库表信息)的代码以及处理模板的逻辑,相对来说开发成本较高。

(二)易用性对比

  1. MyBatis Generator

    • 对于熟悉 MyBatis 和数据库操作的开发者来说,配置和使用相对简单。只需要编写一个配置文件,通过简单的运行就可以生成代码。但需要一定的 XML 配置知识来设置代码生成的各种细节。
  2. Spring Initializr

    • 提供了非常友好的网页界面,即使是初学者也可以轻松上手。只需要填写项目基本信息和选择依赖,点击生成按钮即可得到项目骨架。在本地使用时,也有对应的 Maven 和 Gradle 插件,方便集成到开发环境中。
  3. FreeMarker(结合 Java 程序)

    • 使用起来相对较复杂。需要先学习 FreeMarker 的模板语法,同时还要开发配套的 Java 程序来读取数据和处理模板。不过,一旦掌握了基本原理和开发模式,就可以灵活地用于各种代码生成场景。

六、总结与展望

Java 代码生成工具为我们快速构建项目骨架提供了极大的便利。MyBatis Generator 在持久层代码生成方面表现出色;Spring Initializr 是搭建 Spring Boot 项目的利器;FreeMarker 则提供了灵活自定义的代码生成方式。在实际项目开发中,我们可以根据项目的技术选型和具体需求,选择合适的代码生成工具,或者结合多种工具来高效地完成项目骨架的构建。随着技术的不断发展,未来的代码生成工具可能会更加智能化、自动化,能够更好地理解业务逻辑,生成更加高质量和贴合实际需求的代码,进一步提升软件开发的效率和质量。

在这里插入图片描述

相关文章:

Java 代码生成工具:如何快速构建项目骨架?

Java 代码生成工具&#xff1a;如何快速构建项目骨架&#xff1f; 在 Java 项目开发过程中&#xff0c;构建项目骨架是一项繁琐但又基础重要的工作。幸运的是&#xff0c;Java 领域有许多代码生成工具可以帮助我们快速完成这一任务&#xff0c;大大提高开发效率。 一、代码生…...

模板初阶【C++】

一、 泛型编程 前言&#xff1a; 我们经常会用到数据的交换&#xff0c;C中的函数重载可以完成 //函数重载 void swap(int& x,int& y) {int tmp x;x y;y tmp; }void swap(double& x, double& y) {double tmp x;x y;y tmp; }void swap(char& x, ch…...

URL 类知识点详解

URL 类知识点详解 1. 基本概念与位置 所属包: java.net.URL核心功能: 表示统一资源定位符(Uniform Resource Locator),用于标识和定位网络资源(如网页、文件、API接口)。支持多种协议:HTTP、HTTPS、FTP、file(本地文件)等。不可变类:一旦创建,内容不可修改(线程安全…...

如何使用redis做限流(golang实现小样)

在实际开发中,限流(Rate Limiting)是一种保护服务、避免接口被恶意刷流的常见技术。常用的限流算法有令牌桶、漏桶、固定窗口、滑动窗口等。由于Redis具备高性能和原子性操作,常常被用来实现分布式限流。 下面给出使用Golang结合Redis实现简单限流的几种常见方式(以“固定…...

OpenHarmony外设驱动使用 (九),Pin_auth

OpenHarmony外设驱动使用 &#xff08;九&#xff09; Pin_auth 概述 功能简介 口令认证是端侧设备不可或缺的一部分&#xff0c;为设备提供一种用户认证能力&#xff0c;可应用于设备解锁、支付、应用登录等身份认证场景。用户注册口令后&#xff0c;口令认证模块就可为设备…...

MySQL基础(​​InnoDB)

✅ ​​InnoDB​​&#xff1a;支持事务、行级锁、外键。 ​​为什么要用事务&#xff1f;​​ ​​安全​​&#xff1a;如果中途发现错误&#xff08;比如改错分数&#xff09;&#xff0c;可以一键撤销所有操作&#xff0c;就像游戏里的“回档”功能&#xff01; ​​原子…...

自建srs实时视频服务器支持RTMP推流和拉流

文章目录 一、整体示意图二、服务器端1.srs简介及架构2.docker方式安装3.k8s方式安装4.端口 三、推流端1.OBS Studio2.ffmpeg推流3.streamlabs苹果手机4.twire安卓手机5.网络推流摄像头 四、拉流端1.vlc2.srs 参考awesome系列&#xff1a;https://github.com/juancarlospaco/aw…...

​C++性能优化的7大核心策略与实战案例

在大型C项目中&#xff0c;性能优化需从语言特性、系统架构、硬件特性等多维度切入。以下是经过验证的关键技术路径&#x1f447; &#x1f527; ​一、内存管理的极致控制​ ​问题​&#xff1a;频繁的动态内存分配会导致性能抖动和内存碎片&#xff0c;尤其在实时系统中可能…...

《国家高等教育智慧平台:重塑学习新时代》

时代之需&#xff1a;平台应运而生 在数字化浪潮席卷全球的当下&#xff0c;高等教育领域也在经历着深刻的变革。数字化技术的迅猛发展&#xff0c;正以前所未有的力量重塑着高等教育的形态。从在线课程的兴起&#xff0c;到虚拟实验室的应用&#xff0c;再到智能化教学工具的普…...

【Django】Django DRF 中如何手动调用分页器返回分页数据(APIView,action场景)

&#x1f4e6; Django DRF 中如何手动调用分页器返回分页数据&#xff08;APIView&#xff0c;action场景&#xff09; 在使用 Django REST Framework&#xff08;DRF&#xff09;时&#xff0c;很多人习惯了用 GenericAPIView 或 ViewSet 自动帮我们处理分页。但在某些场景中…...

遨游科普:三防平板有哪些品牌?哪个品牌值得推荐?

在工业数字化与户外作业场景日益多元化的今天&#xff0c;三防平板凭借其卓越的防护性能与功能集成能力&#xff0c;成为电力巡检、地质勘探、应急救援等领域不可或缺的智能终端。所谓“三防”&#xff0c;即防尘、防水、防摔&#xff0c;国际标准IP68与军用标准MIL-STD-810H的…...

Flannel后端为UDP模式下,分析数据包的发送方式(一)

Flannel 使用的是 UDP 模式&#xff0c;分析发往 10.244.2.5 的数据包会从哪个网卡发出。 路由表 以下是提供的路由表&#xff1a; Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 …...

华为鸿蒙电脑发布,折叠屏怎么选?

1⃣屏幕特性&#xff1a; 分辨率&#xff1a;高分辨率能保证图像和文字的清晰细腻 屏幕材质&#xff1a;OLED 屏幕通常具有更好的对比度、色彩表现和更广的色域 刷新率&#xff1a;支持自适应刷新率的屏幕可以根据不同的使用场景自动调整刷新率&#xff0c;在保证流畅度的同时优…...

将VMware上的虚拟机和当前电脑上的Wifi网卡处在同一个局域网下,实现同一个局域网下实现共享

什么是桥接模式&#xff1a;桥接模式&#xff08;Bridging Mode&#xff09;是一种网络连接模式&#xff0c;常用于虚拟机环境中&#xff0c;将虚拟机的虚拟网络适配器直接连接到主机的物理网络适配器上&#xff0c;使虚拟机能够像独立的物理设备一样直接与物理网络通信 1.打开…...

论文阅读:Auto-Encoding Variational Bayes

对图像生成论文自编码变分贝叶斯Auto-Encoding Variational Bayes原理理解和记录 Abstract 我们如何在有向概率模型中&#xff0c;在具有难以处理的后验分布的连续潜在变量z和大型数据集的存在下&#xff0c;执行有效的推理和学习&#xff1f; 我们介绍了一种随机变分推理和学…...

API面临哪些风险,如何做好API安全?

API面临的风险 API&#xff08;应用程序编程接口&#xff09;在现代软件开发和集成中扮演着至关重要的角色&#xff0c;但同时也面临着多种安全风险&#xff0c;主要包括以下几个方面&#xff1a; 数据泄露风险&#xff1a; API通常涉及敏感数据的传输和交换&#xff0c;如用…...

C# Prism框架详解:构建模块化WPF应用程序

1. Prism框架简介 Prism是一个用于构建松散耦合、可测试和可维护的WPF桌面应用程序的框架。它最初由微软模式与实践团队开发&#xff0c;现在由社区维护&#xff0c;是构建企业级WPF应用程序的首选框架之一。 Prism框架的核心优势&#xff1a; 模块化设计&#xff1a;将应用…...

【工具教程】图片识别内容改名,图片指定区域识别重命名,批量识别单据扫描件批量改名,基于WPF和腾讯OCR的实现方案

基于WPF和腾讯OCR的图片指定区域识别与批量重命名实现方案 一、应用场景 ​​电商商品管理​​ 电商平台每天需处理大量商品图片&#xff0c;原始文件名无规律&#xff08;如IMG_001.jpg&#xff09;。通过指定图片中商品名称、颜色、尺码等区域&#xff0c;OCR识别后自动重命名…...

数独求解器3.0 增加latex格式读取

首先说明两种读入格式 latex输入格式说明 \documentclass{article} \begin{document}This is some text before oku.\begin{array}{|l|l|l|l|l|l|l|l|l|} \hline & & & & 5 & & 2 & 9 \\ \hline& & 5 & 1 & & 7…...

WPF核心类继承树结构

WPF(Windows Presentation Foundation)的类继承结构非常庞大而复杂&#xff0c;以下是最核心的继承树结构&#xff0c;按照主要功能区域展示&#xff1a; 基础对象层级 Object └── DispatcherObject└── DependencyObject├── Freezable│ ├── Animatable│ │ …...

Mysql的binlog日志

环境准备 [rootmysql152 ~]# yum install -y mysql-server mysql [rootmysql152 ~]# systemctl enable mysqld --now1.查看正在使用的binlog日志文件 mysql> show master status; ---------------------------------------------------------------------------- | File …...

Java 安全SPEL 表达式SSTI 模版注入XXEJDBCMyBatis 注入

https://github.com/bewhale/JavaSec https://github.com/j3ers3/Hello-Java-Sec https://mp.weixin.qq.com/s/ZO4tpz9ys6kCIryNhA5nYw #Java 安全 -SQL 注入 -JDBC&MyBatis -JDBC 1 、采用 Statement 方法拼接 SQL 语句 2 、 PrepareStatement 会对 SQL 语…...

TypeScript 泛型讲解

如果说 TypeScript 是一门对类型进行编程的语言&#xff0c;那么泛型就是这门语言里的&#xff08;函数&#xff09;参数。本章&#xff0c;我将会从多角度讲解 TypeScript 中无处不在的泛型&#xff0c;以及它在类型别名、对象类型、函数与 Class 中的使用方式。 一、泛型的核…...

BERT、GPT-3与超越:NLP模型演进全解析

自然语言处理&#xff08;NLP&#xff09;领域近年来经历了前所未有的变革&#xff0c;从早期的统计方法到如今的深度学习大模型&#xff0c;技术的进步推动了机器理解、生成和交互能力的飞跃。其中&#xff0c;BERT和GPT-3作为两个里程碑式的模型&#xff0c;分别代表了不同的…...

RISC-V IDE MRS2 开发笔记一:volatile关键字的使用

RISC-V IDE MRS2 开发笔记一&#xff1a;volatile关键字的使用 一、volatile是什么 二、GCC 中 volatile 的行为 2.1禁止编译器优化 2.2 不等于内存屏障 2.3 GCC扩展行为 三、什么时候需要 volatile 3.1防止编译器优化掉“有效代码” 3.2 访问硬件寄存器 3.3 中断服务…...

25、工业防火墙 - 工控网络保护 (模拟) - /安全与维护组件/industrial-firewall-dcs-protection

76个工业组件库示例汇总 工业防火墙 - 工控网络保护 (模拟) 概述 这是一个交互式的 Web 组件,旨在模拟工业防火墙在保护关键工控网络(特别是 DCS - 分布式控制系统)免受网络攻击(如勒索软件传播)方面的核心功能。组件通过可视化简化的网络拓扑、模拟网络流量、应用防火…...

LAN(局域网)和WAN(广域网)

你的问题非常清晰&#xff01;我来用一个直观的比喻实际拓扑图帮你彻底理解LAN&#xff08;局域网&#xff09;和WAN&#xff08;广域网&#xff09;如何协同工作&#xff0c;以及路由器在其中的位置。你可以把整个网络想象成一座城市&#xff1a; 1. 比喻&#xff1a;城市交通…...

ArcGIS Pro 3.4 二次开发 - Arcade

环境&#xff1a;ArcGIS Pro SDK 3.4 .NET 8 文章目录 Arcade1 基本查询1.1 基本查询1.2 使用要素进行基本查询1.3 使用 FeatureSetByName 检索要素1.4 使用过滤器检索要素1.5 使用数学函数计算基本统计量1.6 使用 FeatureSet 函数的 Filter 和 Intersects 2 评估表达式2.1 评…...

PCB智能报价系统——————仙盟创梦IDE

软件署名 代码贡献&#xff1a; 紫金电子科技有限公司 文案正路&#xff1a;cybersnow 正文 对企业的竞争力有着深远影响。传统的 PCB 报价方式往往依赖人工核算&#xff0c;不仅耗时较长&#xff0c;还容易出现误差。随着科技的发展&#xff0c;PCB 自动报价系统应运而生&a…...

灾备认证助力构建数据资产安全防线‌

信息安全保障人员&#xff08;CISAW&#xff09;-灾难备份与恢复认证 1.权威认证体系&#xff1a;技术护城河‌ 在数字化进程加速的背景下&#xff0c;数据资产已成为政府与企业的核心资源&#xff0c;容灾备份能力成为保障业务连续性的关键。特别是近年来&#xff0c;因灾备缺…...

[特殊字符] 遇见Flask

一、初识Flask&#xff1a;像风一样自由 想象一下&#xff0c;你手里有一盒乐高积木——没有说明书&#xff0c;但每一块都精致小巧&#xff0c;任你组合成城堡、飞船&#xff0c;甚至整个宇宙。Flask就是这样一个存在。它不像Django那样“手把手教你搭房子”&#xff0c;而是…...

Axure高级交互设计:中继器嵌套动态面板实现超强体验感台账

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:中继器嵌套动态面板 主要内容:中继器内部嵌套动态面板,实现可移动式台账,增强数据表现…...

告别手动绘图!2分钟用 AI 生成波士顿矩阵

波士顿矩阵作为经典工具&#xff0c;始终是企业定位产品组合、制定竞争策略的核心方法论。然而&#xff0c;传统手动绘制矩阵的方式&#xff0c;往往面临数据处理繁琐、图表调整耗时、团队协作低效等痛点。 随着AI技术的发展&#xff0c;这一现状正在被彻底改变。boardmix博思白…...

iframe加载或者切换时候,短暂的白屏频闪问题解决

问题描述 iframe加载或者是切换iframe链接的时候&#xff0c;会有短暂的白屏&#xff0c;这个时候是在加载&#xff0c;目前没有想到避免的问题&#xff0c;应该是浏览器层面的&#xff0c;所以解决方法之一就是&#xff0c;用页面的主题背景色来遮盖一下&#xff0c;当他加载…...

Python数据可视化高级实战之一——绘制GE矩阵图

目录 一、课程概述 二、GE矩阵? 三、GE 矩阵图的适用范围 五、GE 矩阵的评估方法 (一)市场吸引力的评估要素 二、企业竞争实力的评估要素 三、评估方法与实践应用 1. 定量与定性结合法 2. 数据来源 六、GE矩阵的图形化实现 七、总结:GE 矩阵与 BCG 矩阵的对比分析 (一)GE…...

量子计算与云计算的融合:技术前沿与应用前景

目录 引言 量子计算基础 量子计算的基本原理 量子计算的优势与挑战 量子计算的发展阶段 云计算基础 云计算的基本概念 云计算的应用领域 云计算面临的挑战 量子计算与云计算的结合 量子云计算的概念与架构 量子云计算的服务模式 量子云计算的优势 量子云计算的发展…...

QMK固件RGB矩阵照明功能详解 - 打造你的专属炫彩键盘

QMK固件RGB矩阵照明功能详解 - 打造你的专属炫彩键盘 🌈 大家好!今天我要详细讲解QMK固件中的RGB矩阵照明功能,让你轻松打造一个真正炫彩的机械键盘!本文从基础原理到实战配置,手把手教你如何配置各种绚丽的灯光效果,即使你是小白也能轻松上手!文中所有代码都配有详细的…...

Rust 学习笔记:关于泛型的练习题

Rust 学习笔记&#xff1a;关于泛型的练习题 Rust 学习笔记&#xff1a;关于泛型的练习题问题 1下面代码能否通过编译&#xff1f;若能&#xff0c;输出是&#xff1f;下面代码能否通过编译&#xff1f;若能&#xff0c;输出是&#xff1f; Rust 学习笔记&#xff1a;关于泛型的…...

Panasonic松下焊接机器人节气

Panasonic松下焊接机器人节气装置 一、工作原理 松下焊接机器人节气装置的工作原理主要是通过智能控制技术&#xff0c;实现对焊接过程中气体流量的精确调节。例如&#xff0c;在焊接的不同阶段&#xff0c;根据焊接电流的大小自动调整气体的供给量。当焊接电流较强时&#x…...

2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家

前言 题解 2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)。 vp了下&#xff0c;题目挺好的&#xff0c;难度也适中&#xff0c;但是彻底红温了。 第二题&#xff0c;题意不是那么清晰&#xff0c; M i n ( K 1 , K 2 ) Min(K_1, K_2) Min(K1​,K2​)容易求&#x…...

LeetCode 3355.零数组变换 I:差分数组

【LetMeFly】3355.零数组变换 I&#xff1a;差分数组 力扣题目链接&#xff1a;https://leetcode.cn/problems/zero-array-transformation-i/ 给定一个长度为 n 的整数数组 nums 和一个二维数组 queries&#xff0c;其中 queries[i] [li, ri]。 对于每个查询 queries[i]&am…...

java21

1.数据结构之二叉树&#xff0c;二叉查找树&#xff0c;平衡二叉树 原理&#xff1a;和节点比较大小然后选左边还是右边 注意&#xff1a;中序遍历最常见&#xff0c;因为遍历的结果是从小到大 注意是任意节点&#xff0c;上面的二叉查找树的节点10的左子树高度是0&#xff0c;…...

ES的倒排索引和正排索引的区别及适用场景?为什么倒排索引适合全文搜索?

正排索引解析 1.存储机制 Elasticsearch 的文档存储机制比简单的固定字节分配更复杂&#xff0c;其核心原理如下&#xff1a; 1. 数值类型存储机制 对于 long/float/double 等数值类型&#xff1a; 文档ID2 → 偏移量 2 * sizeof(type) 例如&#xff1a;long 类型&#xf…...

ElasticSearch各种查询语法示例

1. 每种查询语法的区别与优缺点 Query DSL 区别: JSON 格式的结构化查询&#xff0c;功能强大&#xff0c;支持复杂查询逻辑&#xff0c;适用于 Elasticsearch 的核心查询场景。优点: 灵活&#xff0c;功能全面&#xff0c;支持全文搜索、精确匹配、聚合等&#xff1b;可组合…...

Ubuntu20.04部署KVM

文章目录 一. 环境准备关闭防火墙&#xff08;UFW&#xff09;禁用 SELinux更换镜像源检查 CPU 虚拟化支持 二. 安装KVM安装 KVM 及相关组件启动 libvirtd 服务验证安装创建虚拟机 一. 环境准备 4C8G&#xff0c;50G硬盘——VMware Workstation需要给虚拟机开启虚拟化引擎 roo…...

Android车载应用开发:Kotlin与Automotive OS深度实践

一、Android Automotive OS简介 Android Automotive OS&#xff08;AAOS&#xff09;是Google为车辆定制的操作系统&#xff0c;直接运行于车机硬件&#xff0c;提供完整的车载信息娱乐系统&#xff08;IVI&#xff09;。与Android Auto&#xff08;手机投影方案&#xff09;不…...

提示词工程(Prompt Engineering)是智能Agent交互中不可或缺的一环

Prompt Engineering 提示词&#xff0c;参考OpenAI提示词建议 2.5.1 概述 提示词工程(Prompt Engineering)是智能Agent交互中不可或缺的一环&#xff0c;它们指导智能体如何理解和回应用户的需求。这一节将探讨如何设计有效的提示词&#xff0c;以及如何通过精确的语言引导智能…...

九天画芯CEO张锦:AR 与 AI 融合重构智能终端生态,消费级市场迎来关键拐点

一、AR设备逆势突围&#xff1a;从技术验证到规模商用的跨越 根据洛图科技显示&#xff0c;2025 年 Q1 中国 XR&#xff08;ARVR&#xff09; 设备市场数据显示&#xff0c;AR 设备以 9.1 万台销量、116% 的同比增速远超 VR/MR 设备&#xff0c;这标志着消费级 AR 市场正式从 “…...

Python爬虫(32)Python爬虫高阶:动态页面处理与Scrapy+Selenium+BeautifulSoup分布式架构深度解析实战

目录 引言一、动态页面爬取的技术背景1.1 动态页面的核心特征1.2 传统爬虫的局限性 二、技术选型与架构设计2.1 核心组件分析2.2 架构设计思路1. 分层处理2. 数据流 三、代码实现与关键技术3.1 Selenium与Scrapy的中间件集成3.2 BeautifulSoup与Scrapy Item的整合3.3 分布式爬取…...

[案例七] NX二次开发标识特征的导入与布尔运算

本来做的是案例六NX二次开发减重块。但是当时在处理导入指定面时发现坐标转化存在很大问题,开了我很长时间,太难受了,决定放一放,昨天做了第六个案例采取了一种补救方法(实在不会的一种解决思路),个人认为NX这么优秀的软件应该有更好的方法,坐标转化真让人头大。刚开始…...