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

Hbase-技术文档-spring-boot整合使用hbase--简单操作增删改查--提供封装高可用的模版类

使用spring-boot项目来整合使用hbase。

引入依赖

<dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.4.3</version>
</dependency>

依赖声明表示将把Apache HBase客户端库的2.4.3版本添加到项目中。HBase是一个分布式、可扩展的大数据存储系统,它基于Google的Bigtable模型,并使用了Hadoop分布式文件系统作为底层存储。HBase客户端库是用于与HBase数据库进行交互的工具库,提供了一组API用于执行CRUD(创建、读取、更新、删除)操作以及其他与HBase相关的功能。

通过在项目中添加这个依赖,您将能够使用HBase客户端库的API来与HBase数据库进行通信,执行数据的增删改查操作等。这样,您就可以在Java应用程序中方便地使用HBase的功能了。

封装程度0.5,在下面有一个高可用的封装模版类!需要的向下直接看封装程度max!!!

书写配置文件

application.properties

hbase.config.hbase.zookeeper.quorum=ip地址
hbase.config.hbase.zookeeper.property.clientPort=2181

application.yml

hbase:config:hbase:zookeeper:quorum: ip地址property:clientPort: 2181

配置文件对应java类,书写配置类HbaseProperties.java

import java.util.Map;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "hbase")
public class HbaseProperties {private Map<String,String> config;public void setConfig(Map<String, String> config) {this.config = config;}public Map<String, String> getConfig() {return config;}
}

配置文件HbaseConfig.java

import java.io.IOException;
import java.util.Map;import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableConfigurationProperties(HbaseProperties.class)
public class HbaseConfig {private final HbaseProperties props;public HbaseConfig(HbaseProperties props) {this.props = props;}@Beanpublic org.apache.hadoop.conf.Configuration configuration(){org.apache.hadoop.conf.Configuration conf = HBaseConfiguration.create();Map<String, String> config = props.getConfig();config.forEach(conf::set);return conf;}@Beanpublic Connection getConnection() throws IOException{return ConnectionFactory.createConnection(configuration());}@Beanpublic HBaseAdmin hBaseAdmin() throws IOException {return (HBaseAdmin) getConnection().getAdmin();}
}

创建一个Hbase的模版类,用于执行与Hbase的交互操作

@Service
public class HBaseTemplate {@Autowiredprivate Configuration configuration;private Connection connection;@PostConstructpublic void init() {connection = ConnectionFactory.createConnection(configuration);}public void putData(Put put) throws IOException {Table table = connection.getTable(TableName.valueOf("table_name"));table.put(put);table.close();}
}

请将table_name替换为您要操作的HBase表的实际名称。 

使用封装好的模版类来使用进行操作

@Autowired
private HBaseTemplate hBaseTemplate;public void doSomethingWithHBase() {// 创建Put对象,包含要插入的数据...Put put = new Put(Bytes.toBytes("row_key"));// 设置要插入的列和值...hBaseTemplate.putData(put);
}

这是一个基本的整合示例,可以根据您的具体需求进行调整和扩展。注意,这只是一个基本的示例,您可能还需要处理异常、关闭连接等其他操作。

高度封装!!!max!!!

注意:!!

此方式不需要配置文件,如果需要可以自己去写一个配置类即可,配置类的写法在上面!!!

1、导入依赖

<!--        hbase--><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.4.3</version></dependency>

2、封装模版类

模版类中有很详细的注解和说明

package com.adn.common.util;import lombok.extern.log4j.Log4j2;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.SubstringComparator;
import org.apache.hadoop.hbase.util.Bytes;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Filter;@Component
@Log4j2
public class HBaseTemplate {private Configuration configuration; // Hadoop配置对象,用于创建HBase配置private Connection connection; // HBase连接对象,用于与HBase建立连接/*** 如果需要就可以去写一个时加载的配置类读取配置中的数据* */@PostConstructpublic void init() throws IOException {configuration = HBaseConfiguration.create();configuration.set("hbase.zookeeper.quorum", "部署hbase的ip地址");configuration.setInt("hbase.zookeeper.property.clientPort", 2181);// 等等其他HBase的配置设置connection = ConnectionFactory.createConnection(configuration);}/*** 插入数据* 注意:如果向一个不存在的表中添加数据的时候会直接新建这个表* 所以在向有的表中进行添加数据的时候要确定表名是否存在* */
//    public void put(String tableName, String rowKey, String columnFamily, String column, String value) throws IOException {
//        // 对指定表执行插入数据操作
//        Table table = connection.getTable(TableName.valueOf(tableName)); // 获取指定表的Table对象
//        Put put = new Put(Bytes.toBytes(rowKey)); // 创建Put对象,设置行键
//        put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value)); // 设置列族、列和值
//        table.put(put); // 执行插入操作
//        table.close(); // 关闭表连接
//    }public void put(String tableName, String rowKey, String columnFamily, String column, String value)  {// 对指定表执行插入数据操作Table table = null; // 获取指定表的Table对象try {table = connection.getTable(TableName.valueOf(tableName));} catch (IOException e) {throw new RuntimeException("连接"+tableName+"表出现异常"+e);}Put put = new Put(Bytes.toBytes(rowKey)); // 创建Put对象,设置行键put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value)); // 设置列族、列和值try {table.put(put); // 执行插入操作} catch (IOException e) {try {log.info("新建表操作"+tableName);createTableIfNotExists(tableName, columnFamily);this.put(tableName,rowKey,columnFamily,column,value);//使用递归调用方法return;} catch (IOException ex) {throw new RuntimeException(ex);}}try {table.close(); // 关闭表连接} catch (IOException e) {throw new RuntimeException("关闭表连接出现错误"+e);}}/*** 新建表操作* */private void createTableIfNotExists(String tableName, String columnFamily) throws IOException {try (Admin admin = connection.getAdmin()) {TableName hbaseTable = TableName.valueOf(tableName);if (!admin.tableExists(hbaseTable)) {HTableDescriptor tableDescriptor = new HTableDescriptor(hbaseTable);tableDescriptor.addFamily(new HColumnDescriptor(Bytes.toBytes(columnFamily)));admin.createTable(tableDescriptor);}}}/*** 查找获取* */public String get(String tableName, String rowKey, String columnFamily, String column) {// 对指定表执行查找数据操作Table table = null; // 获取指定表的Table对象try {table = connection.getTable(TableName.valueOf(tableName));} catch (IOException e) {throw new RuntimeException("连接表出现异常"+e);}Get get = new Get(Bytes.toBytes(rowKey)); // 创建Get对象,设置行键Result result = null; // 执行查找操作,获取Result对象try {result = table.get(get);} catch (IOException e) {throw new RuntimeException("获取返回值出现异常"+e);}byte[] valueBytes = result.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(column)); // 获取指定列的值try {table.close(); // 关闭表连接} catch (IOException e) {throw new RuntimeException("关闭连接出现问题"+e);}return Bytes.toString(valueBytes); // 将值转换为字符串并返回}/*** 删除一条数据* */public void delete(String tableName, String rowKey) throws IOException {// 对指定表执行删除数据操作Table table = connection.getTable(TableName.valueOf(tableName)); // 获取指定表的Table对象Delete delete = new Delete(Bytes.toBytes(rowKey)); // 创建Delete对象,设置行键table.delete(delete); // 执行删除操作table.close(); // 关闭表连接}/*** 删除表* */public void deleteTable(String tableName) throws IOException {Admin admin = connection.getAdmin(); // 获取 Admin 对象TableName table = TableName.valueOf(tableName); // 获取表名if (admin.tableExists(table)) { // 检查表是否存在admin.disableTable(table); // 禁用表admin.deleteTable(table); // 删除表System.out.println("成功删除表: " + tableName);} else {System.out.println("表 " + tableName + " 不存在!");}admin.close(); // 关闭 Admin 连接}// 其他操作,如 scan 方法等// 关闭连接的方法public void close() throws IOException {connection.close(); // 关闭HBase连接}/*** 条件查询方法,根据指定的列族、列和值执行查询操作** @param tableName    表名* @param columnFamily 列族名* @param column       列名* @param value        值* @return 匹配的行数据列表* @throws IOException 发生 IO 错误时抛出异常*/public List<String> findbyConditions(String tableName, String columnFamily, String column, String value) throws IOException {List<String> results = new ArrayList<>(); // 创建结果列表Table table = connection.getTable(TableName.valueOf(tableName)); // 获取指定表的 Table 对象Filter filter = (Filter) new SingleColumnValueFilter(Bytes.toBytes(columnFamily), // 创建单列值过滤器Bytes.toBytes(column), CompareFilter.CompareOp.EQUAL, new SubstringComparator(value));Scan scan = new Scan(); // 创建扫描对象scan.setFilter((org.apache.hadoop.hbase.filter.Filter) filter); // 设置扫描过滤器ResultScanner scanner = table.getScanner(scan); // 获取结果扫描器for (Result result : scanner) {StringBuilder row = new StringBuilder(); // 创建字符串构建器row.append(Bytes.toString(result.getRow())).append(": "); // 拼接行键for (Cell cell : result.listCells()) {String family = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()); // 获取列族String qualifier = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(),cell.getQualifierLength()); // 获取列名String cellValue = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); // 获取值row.append(family).append(":").append(qualifier).append("=").append(cellValue).append(", "); // 拼接行数据}results.add(row.toString()); // 将行数据添加到结果列表}table.close(); // 关闭表连接return results; // 返回结果列表}/*** 全表查询方法,返回表中所有行的数据列表** @param tableName 表名* @return 所有行的数据列表* @throws IOException 发生 IO 错误时抛出异常*/public List<String> allTheTable(String tableName) throws IOException {List<String> rows = new ArrayList<>(); // 创建行列表Table table = connection.getTable(TableName.valueOf(tableName)); // 获取指定表的 Table 对象Scan scan = new Scan(); // 创建扫描对象ResultScanner scanner = table.getScanner(scan); // 获取结果扫描器for (Result result : scanner) {StringBuilder row = new StringBuilder(); // 创建字符串构建器row.append(Bytes.toString(result.getRow())).append(": "); // 拼接行键for (Cell cell : result.listCells()) {String family = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()); // 获取列族String qualifier = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); // 获取列名String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()); // 获取值row.append(family).append(":").append(qualifier).append("=").append(value).append(", "); // 拼接行数据}rows.add(row.toString()); // 将行数据添加到行列表}table.close(); // 关闭表连接return rows; // 返回行列表}}

示例service,不知道如何调用的课参考使用

package com.adn.service;import com.adn.common.User;
import com.adn.common.util.HBaseTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.io.IOException;
/*** 示例使用* */
@Component
public class UserHBaseRepository {@Autowiredprivate HBaseTemplate  hbaseTemplate;/*** 表名* */private final String TABLE_NAME = "users";/***列族* */private final String COLUMN_FAMILY = "info";public void createUser(String userId, String name, int age, String email) throws IOException {hbaseTemplate.put(TABLE_NAME, userId, COLUMN_FAMILY, "name", name);hbaseTemplate.put(TABLE_NAME, userId, COLUMN_FAMILY, "age", String.valueOf(age));hbaseTemplate.put(TABLE_NAME, userId, COLUMN_FAMILY, "email", email);}public User getUser(String userId) throws IOException {String name = hbaseTemplate.get(TABLE_NAME, userId, COLUMN_FAMILY, "name");String ageStr = hbaseTemplate.get(TABLE_NAME, userId, COLUMN_FAMILY, "age");int age = Integer.parseInt(ageStr);String email = hbaseTemplate.get(TABLE_NAME, userId, COLUMN_FAMILY, "email");// 构造User对象并返回return new User(userId, name, age, email);}public void updateUser(String userId, String name, int age, String email) throws IOException {hbaseTemplate.put(TABLE_NAME, userId, COLUMN_FAMILY, "name", name);hbaseTemplate.put(TABLE_NAME, userId, COLUMN_FAMILY, "age", String.valueOf(age));hbaseTemplate.put(TABLE_NAME, userId, COLUMN_FAMILY, "email", email);}public void deleteUser(String userId) throws IOException {hbaseTemplate.delete(TABLE_NAME, userId);}
}

实例controller

package com.adn.controller;import com.adn.common.User;
import com.adn.service.UserHBaseRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;@RestController
public class UserController {@AutowiredUserHBaseRepository service;/*** 新增数据*String userId, String name, int age, String email*/@GetMapping("new/{userId}/{name}/{age}/{email}")public void newuser(@PathVariable String userId,@PathVariable String name,@PathVariable int age,@PathVariable String email){try {service.createUser(userId,name,age,email);} catch (IOException e) {System.out.println("新增出现异常");throw new RuntimeException(e);}}/*** 查询数据根据id查看数据* */@GetMapping("findById/{userId}")public User findById(@PathVariable String userId){try {return service.getUser(userId);} catch (IOException e) {System.out.println("查询出现异常");throw new RuntimeException(e);}}}

快去尝试一下8!!!!

相关文章:

Hbase-技术文档-spring-boot整合使用hbase--简单操作增删改查--提供封装高可用的模版类

使用spring-boot项目来整合使用hbase。 引入依赖 <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.4.3</version> </dependency> 依赖声明表示将把Apache HBase客户端库…...

基于Pytorch的神经网络部分自定义设计

一、基础概念&#xff08;学习笔记&#xff09; &#xff08;1&#xff09;训练误差和泛化误差[1] 本质上&#xff0c;优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标&#xff0c;后者则关注在给定有限数据量的情况下寻找合适的模型。训练误差和泛化误差通常不…...

持续更新串联记忆English words

&#xff08;一&#xff09;这是一组关于“服装搭配”的单词。通过在记忆中检索&#xff0c;回忆起隐藏的信息吧~ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>今日单词>>&…...

postgresql 内核源码分析 btree索引的增删查代码基本原理流程分析,索引膨胀的原因在这里

B-Tree索引代码流程分析 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&…...

详细了解G1、了解G1、G1垃圾收集器详解、G1垃圾回收器简单调优

4.详细了解G1&#xff1a; 4.1.一&#xff1a;什么是垃圾回收 4.2.了解G1 4.3.G1 Yong GC 4.4.G1 Mix GC 4.5.三色标记算法 4.6.调优实践 5.G1垃圾收集器详解 5.1.G1垃圾收集器 5.2.G1的堆内存划分 5.3.G1的运行过程 5.4.三色标记 5.4.1.漏标问题 5.5.记忆集与卡表 5.6.安全点与…...

vue项目中 package.json 详解

在 Vue 项目中&#xff0c;package.json 是一个重要的配置文件&#xff0c;它包含了项目的名称、版本、作者、依赖等信息。下面是一份详细的 Vue 项目 package.json 配置说明&#xff1a; 1.name&#xff1a;项目的名称&#xff0c;用于标识项目&#xff0c;例如&#xff1a;&q…...

为什么要进行管网水位监测,管网水位监测的作用是什么

管网水位监测是城市排水系统管理的重要手段&#xff0c;对于保障城市排水设施安全运行和提升城市管理水平具有重要意义。通过对排水管网的水位进行实时监测和分析&#xff0c;能够及时发现问题并采取措施&#xff0c;提高排水系统的运行效率和管理水平。本文将详细介绍为什么要…...

webpack学习笔记

1. webpack基本概念 webpack&#xff1a; JavaScript 应用程序的静态模块打包器&#xff0c;是目前最为流行的JavaScript打包工具之一。webpack会以一个或多个js文件为入口&#xff0c;递归检查每个js模块的依赖&#xff0c;从而构建一个依赖关系图&#xff0c;然后依据该关系…...

解析代理IP在跨境电商和社媒营销中的关键作用

跨境电商和社媒营销领域的从业者深知&#xff0c;代理IP的价值愈发凸显。在推广营销的过程中&#xff0c;频繁遇到因IP关联而封禁账号的情况&#xff0c;或因使用不安全IP而导致异常问题。 这些问题促使人们开始高度重视代理IP的作用。但实际上&#xff0c;代理IP究竟是何物&a…...

Unity 之 Start 与Update 方法的区别

文章目录 当谈论Unity中的 Start和 Update方法时&#xff0c;我们实际上是在讨论MonoBehaviour类中的两个常用方法&#xff0c;用于编写游戏逻辑。这两个方法在不同的时机被调用&#xff0c;因此您可以根据需要选择在哪个方法中编写特定的代码。 Start 方法&#xff1a; Start…...

Spring Boot中如何编写优雅的单元测试

单元测试是指对软件中的最小可测试单元进行检查和验证。在Java中&#xff0c;单元测试的最小单元是类。通过编写针对类或方法的小段代码&#xff0c;来检验被测代码是否符合预期结果或行为。执行单元测试可以帮助开发者验证代码是否正确实现了功能需求&#xff0c;以及是否能够…...

三星Galaxy S23与iPhone 15的对比分析:谁会胜出?

三星Galaxy S23与iPhone 15的对决将于下个月进入高潮,这将是今年智能手机中最大的一场较量。毕竟,这是两家领先的移动设备制造商的旗舰手机。他们的手机的比较将在很大程度上决定谁能获得最佳手机的称号。 我们已经知道有利于三星Galaxy S23的情况,该产品自春季以来一直在推…...

MySQL索引 事物 存储引擎

一 索引 索引的概念 索引就是一种帮助系统能够更快速的查找信息的结构 索引的作用 索引的副作用 创建索引的规则 MySQL的优化 哪些字段/场景适合创建索引 哪些不适合 小字段唯一性强的字段更新不频繁&#xff0c;但查询率比较高的字段表记录超过 300行主键&#xff0c;外键…...

【谷粒学院】报错记录

无法从Nacos获取动态配置 原先gulimall-common中SpringCloud Alibaba的版本是2.1.0.RELEASE&#xff0c;无法从Nacos中获取配置文件信息 <dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId&…...

微积分基本概念

微分 函数的微分是指对函数的局部变化的一种线性描述。微分可以近似地描述当函数自变量的取值作足够小的改变时&#xff0c;函数的值是怎样改变的。。对于函数 y f ( x ) y f(x) yf(x) 的微分记作&#xff1a; d y f ′ ( x ) d x d_y f^{}(x)d_x dy​f′(x)dx​ 微分和…...

【业务功能篇78】微服务-前端后端校验- 统一异常处理-JSR-303-validation注解

5. 前端校验 我们在前端提交的表单数据&#xff0c;我们也是需要对提交的数据做相关的校验的 Form 组件提供了表单验证的功能&#xff0c;只需要通过 rules 属性传入约定的验证规则&#xff0c;并将 Form-Item 的 prop 属性设置为需校验的字段名即可 校验的页面效果 前端数据…...

pytorch的用法

...

Qt 设置窗口背景

窗口背景无非两种&#xff1a;背景色、背景图片。Qt中窗口背景如何设置&#xff1f; 一、QPalette设置背景 二、实现paintEvent&#xff0c;使用QPainter来绘制背景 三、使用QSS来设置背景 关于QSS的使用不想多说&#xff0c;一般我不用QSS设置窗口背景&#xff0c;也不建议…...

大模型是什么?泰迪大模型能够解决企业哪些痛点?

什么是大模型&#xff1f; 大模型是指模型具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域&#xff0c;大模型通常是指具有数百万到数十亿参数的神经网络模型。这些模型需要大量的计算资源和存储空间来训练和存储&#xff0c;并且往往需要进行分布式计算和特殊…...

YOLOv7-tracker 目标追踪 输入视频帧

目录 1 项目安装1.1 环境搭建1.2 项目下载1.3 权重下载1.4 环境安装1.5 上传待检测的视频帧 2 视频帧检测与追踪2.1 检测与追踪2.3 结果 参考项目&#xff1a;https://github.com/JackWoo0831/Yolov7-tracker/tree/master github链接&#xff1a;https://github.com/Whiffe/Yo…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...