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

SpringBoot整合easy-es

一、easy-es简介

EasyES是一款基于Elasticsearch官方提供的RestHighLevelClient开发的ORM框架,旨在简化开发流程并提高效率。 EasyES在保持RestHighLevelClient原有功能的基础上进行增强,而不做任何改变。它采用与Mybatis-Plus相似的语法,使得开发者可以无缝迁移至EasyES,无需额外学习成本。EasyES的核心理念是将简单、易用性留给用户,将复杂性留给框架,致力于成为全球最受欢迎的ElasticSearch搜索引擎开发框架。

EasyES的主要特点包括:

  • 全自动索引托管:全球开源首创的索引托管模式,无需关心索引的创建、更新及数据迁移等繁琐步骤,彻底解放开发者。
  • 屏蔽语言差异:开发者只需要会MySQL语法即可使用ES,无需学习复杂的ES语法。
  • 减少代码量:与直接使用RestHighLevelClient相比,相同的查询可以节省3-5倍的代码量。
  • 零魔法值:字段名称直接从实体中获取,无需输入字段名称字符串,提高代码可读性。
  • 降低门槛:通过EasyES,即便是只了解ES基础的初学者也可以轻松驾驭ES完成绝大多数需求的开发。
  • 无侵入:引入EasyES不会对现有工程产生影响,启动即会自动注入基本的CURD操作,性能基本无损耗。

easy-es官网 https://www.easy-es.cn/

二、实现基于Spring Boot框架的应用程序代码

1.添加相关依赖

<!-- 引入 Easy-ES 最新版本的依赖 -->
<dependency><groupId>org.dromara.easy-es</groupId><artifactId>easy-es-boot-starter</artifactId><!-- 指定 Easy-ES 的版本号,确保使用的是最新稳定版本 --><version>2.0.0-beta3</version>
</dependency><!-- 引入 Spring Boot Web 启动器,并排除内置的 Elasticsearch 依赖以避免冲突 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 注释掉了版本号,这意味着 Maven 将使用项目中定义的 Spring Boot 版本 --><!-- 如果没有定义,则会使用最新的可用版本 --><!-- 这种方式可以在 Spring Boot 升级时自动更新依赖,但可能导致不兼容问题 --><!--<version>2.7.18</version>--><exclusions><!-- 排除 Elasticsearch REST 高级客户端 --><exclusion><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></exclusion><!-- 排除 Elasticsearch REST 客户端 --><exclusion><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId></exclusion><!-- 排除 Elasticsearch 核心库 --><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion></exclusions>
</dependency><!-- 手动引入指定版本的 Elasticsearch REST 高级客户端 -->
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><!-- 指定该客户端的版本号,以确保与其他依赖的兼容性 --><version>7.14.0</version>
</dependency><!-- 手动引入指定版本的 Elasticsearch REST 客户端 -->
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><!-- 指定该客户端的版本号,以确保与其他依赖的兼容性 --><version>7.14.0</version>
</dependency><!-- 手动引入指定版本的 Elasticsearch 核心库 -->
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><!-- 指定核心库的版本号,以确保与其他依赖的兼容性 --><version>7.14.0</version>
</dependency>

一些解释:

dependency: 定义一个项目的依赖项。每个依赖项都包含一个或多个子元素,描述该依赖的详细信息。

groupId: 指定依赖项的组织或公司名称,通常与其 Maven 仓库中的路径相对应。

artifactId: 指定依赖项的唯一标识符,通常是库或模块的名称。

version: 指定依赖项的版本号。可以是具体的版本字符串,也可以使用范围或特殊版本标识。

exclusions: 用于排除某些传递性依赖项。这样可以避免因不必要的依赖导致版本冲突。

exclusion: 在 exclusions 中定义单个被排除的依赖项。包含两个子元素:groupId 和 artifactId,用于指定要排除的依赖项。

2.添加相关配置

考虑到有的用户偏好使用YML格式进行配置,而有的用户则更喜欢使用PROPERTIES格式,为了提供便利,我同时列出了这两种类型的配置选项,以便您可以根据自己的需求和喜好进行选择。

(1)yml配置
a.基础配置
easy-es:enable: true # 默认为true,若为false则认为不启用本框架address: 你的ip地址:9200 # 指定Elasticsearch服务的IP地址和端口,格式为IP:9200logging:level:tracer: trace # 设置日志级别为trace,开发时可开启以打印ES全部请求信息及DSL语句# 注意:开启此配置后,可以将EE的print-dsl设置为false,以避免日志重复打印
b.拓展配置(可选)

不加不影响项目启动,但是为了实现性能优化,建议您根据实际需求和场景进行相应的配置调整,进行细致的配置优化

easy-es:keep-alive-millis: 30000 # 心跳保持时间(毫秒)。用于确保连接在无数据传输时仍然保持活动状态,防止因长时间空闲而关闭连接。connect-timeout: 5000 # 连接超时设置(毫秒)。定义建立连接的最大等待时间,超过该时间则认为连接失败。socket-timeout: 600000 # 数据读取超时设置(毫秒)。规定读取数据时的最大等待时间,超出此时间将中断读取操作。request-timeout: 5000 # 请求超时设置(毫秒)。指定发送请求的最大等待时间,超过此时间则视为请求失败。connection-request-timeout: 5000 # 连接请求超时设置(毫秒)。定义从连接池获取连接的最大等待时间。max-conn-total: 100 # 最大总连接数。设置连接池中允许的最大连接数量。max-conn-per-route: 100 # 每个路由的最大连接数。规定针对每个目标主机可同时建立的最大连接数量。
c.全局配置(可选)

在项目启动过程中,若未明确指定相关配置,系统将自动采用预设的默认值以确保顺利运行。

easy-es:schema: http # 默认为 http,可选值为 https(不使用 SSL)。配置为 https 时,使用 HTTPS 协议。banner: true # 默认为 true,是否打印启动横幅。若不需要打印,设置为 false。global-config:i-kun-mode: false # 是否开启小黑子模式,默认为关闭。开启后日志会更加有趣,仅供娱乐用途。process-index-mode: manual # 索引处理模式。可选值:smoothly(平滑模式)、not_smoothly(非平滑模式)和 manual(手动模式),默认开启手动模式。print-dsl: true # 是否在控制台打印通过该框架生成的 DSL 语句。默认为 true,建议在测试稳定后生产环境中关闭以提高性能。distributed: false # 当前项目是否为分布式项目。默认为 true。在非手动托管索引模式下,分布式项目会获取分布式锁,非分布式项目使用 synchronized 锁。reindexTimeOutHours: 72 # 重建索引的超时时间,单位为小时。默认值为 72 小时,根据 ES 中存储的数据量可调整。async-process-index-blocking: true # 异步处理索引是否阻塞主线程。默认阻塞。当数据量过大时,可调整为非阻塞,以加快项目启动速度。active-release-index-max-retry: 4320 # 在分布式环境下,平滑模式下当前客户端激活最新索引的最大重试次数。若数据量过大,重建索引数据迁移时间超过 72 小时,可增大此参数。active-release-index-fixed-delay: 60 # 在分布式环境下,平滑模式下当前客户端激活最新索引的重试时间间隔。若希望最终一致性时效性更高,可减小此值,但会牺牲一些性能。db-config:map-underscore-to-camel-case: false # 是否开启下划线转驼峰命名,默认为 false。index-prefix: daily_ # 索引前缀,用于区分环境。默认为空,作用与 MP 的 tablePrefix 相同。id-type: customize # ID 生成策略。可选值为 customize(自定义),用户可以自行生成 ID(例如取自 MySQL 的数据 ID)。默认使用 ES 自动生成 ID。field-strategy: not_empty # 字段更新策略,默认为 not_null(不为空)。enable-track-total-hits: true # 是否开启总数据匹配追踪,默认为开启。若不开启,将无法获取数据总条数。查询数量突破 1 万条时,需要同步调整 @IndexName 注解中的 maxResultWindow。refresh-policy: immediate # 数据刷新策略。默认为不刷新。若对数据时效性要求较高,可调整为 immediate,但会有性能损耗,也可选择 wait_until 作为折中方案。batch-update-threshold: 10000 # 批量更新接口的阈值,默认值为 1 万。突破此值时需同步调整 enable-track-total-hits=true 和 @IndexName.maxResultWindow > 1w,并重建索引。smartAddKeywordSuffix: true # 是否智能为字段添加 .keyword 后缀。默认开启,会根据当前字段的索引类型及查询类型自动判断是否需要拼接 .keyword 后缀。
多数据源(可选)
easy-es:dynamic:datasource:ds1:address: 你的ip地址:9200 # 数据源1的连接地址# username: '可省略,如果没有用户名'# password: '可省略,如果没有密码'ds2:address: 你的ip地址:9200 # 数据源2的连接地址# username: '可省略,如果没有用户名'# password: '可省略,如果没有密码'# 其他数据源配置...
(2)properties配置
a.基础配置
# Easy-ES 配置
easy-es.enable=true # 启用框架,默认为true,设置为false则禁用此框架
easy-es.address=你的ip地址:9200 # 设置Elasticsearch的连接地址# 日志配置
logging.level.tracer=trace # 设置日志级别为trace,开发时可开启,以打印所有Elasticsearch请求信息及DSL语句
# 注意:开启此配置后,可将EE的print-dsl设置为false以避免重复打印
b.拓展配置(可选)

不加不影响项目启动,但是为了实现性能优化,建议您根据实际需求和场景进行相应的配置调整,进行细致的配置优化

# Easy-ES 配置easy-es.keep-alive-millis=30000 # 心跳策略时间,单位:毫秒(ms)。设置保持连接活动的时间,以防长时间无数据传输导致连接关闭。easy-es.connect-timeout=5000 # 连接超时时间,单位:毫秒(ms)。设置建立连接时的超时时间。easy-es.socket-timeout=600000 # 通信超时时间,单位:毫秒(ms)。设置读取数据的超时时间,超过此时间将中断读取。easy-es.request-timeout=5000 # 请求超时时间,单位:毫秒(ms)。设置发送请求的超时时间,超出该时间将认为请求失败。easy-es.connection-request-timeout=5000 # 连接请求超时时间,单位:毫秒(ms)。设置从连接池中获取连接的超时时间。easy-es.max-conn-total=100 # 最大连接数,单位:个。设置连接池中最大允许的连接总数。easy-es.max-conn-per-route=100 # 最大连接路由数,单位:个。设置每个路由(目标主机)的最大连接数。
c.全局配置(可选)

在项目启动过程中,若未明确指定相关配置,系统将自动采用预设的默认值以确保顺利运行。

# ES连接协议,默认为http,可省略;支持https免SSL方式,配置为https即可
easy.es.schema=http# 是否打印banner,默认为true;不想打印时可设置为false
easy.es.banner=true# 是否开启小黑子模式,默认为关闭;开启后日志将更有趣,仅供娱乐用途
easy.es.global-config.i-kun-mode=false# 索引处理模式:
# smoothly: 平滑模式
# not_smoothly: 非平滑模式
# manual: 手动模式(默认)
easy.es.global-config.process-index-mode=manual# 是否在控制台打印框架生成的DSL语句,默认开启;生产环境建议关闭以提升性能
easy.es.global-config.print-dsl=true# 当前项目是否为分布式项目,默认为true;非分布式项目只需使用synchronized锁
easy.es.global-config.distributed=false# 重建索引超时时间,单位为小时,默认为72小时;可根据ES中存储的数据量调整
easy.es.global-config.reindexTimeOutHours=72# 异步处理索引是否阻塞主线程,默认阻塞;数据量过大时可设置为非阻塞,加快项目启动
easy.es.global-config.async-process-index-blocking=true# 分布式环境下,平滑模式下当前客户端激活最新索引的最大重试次数
# 数据量过大时,重建索引数据迁移时间超过72小时可调大此参数
easy.es.global-config.active-release-index-max-retry=4320# 分布式环境下,平滑模式下当前客户端激活最新索引的重试时间间隔
# 若需要更高的一致性时效性可调小此值,但会影响性能
easy.es.global-config.active-release-index-fixed-delay=60# 是否开启下划线转驼峰命名,默认为false;如果需要可设置为true
easy.es.global-config.db-config.map-underscore-to-camel-case=false# 索引前缀,用于区分不同环境,默认为空;用法与MP的tablePrefix相同
easy.es.global-config.db-config.index-prefix=daily_# ID生成策略:
# customize: 自定义,由用户生成ID(例如:取MySQL中的数据ID)
# 默认情况下,ID由ES自动生成
easy.es.global-config.db-config.id-type=customize# 字段更新策略,默认为not_null;表示只更新非空字段
easy.es.global-config.db-config.field-strategy=not_empty# 是否开启总数追踪,默认开启;若不开启,则无法获取数据总条数,但其他功能不受影响
# 查询数量超过1万时,需要调整@IndexName注解中的maxResultWindow大于1万,并重建索引
easy.es.global-config.db-config.enable-track-total-hits=true# 数据刷新策略,默认为不刷新;对数据时效性要求高时可设置为immediate,但性能损耗较高,也可选择折中的wait_until
easy.es.global-config.db-config.refresh-policy=immediate# 批量更新接口的阈值,默认值为1万;突破此值需同步调整enable-track-total-hits=true,@IndexName.maxResultWindow > 1w,并重建索引
easy.es.global-config.db-config.batch-update-threshold=10000# 是否智能为字段添加.keyword后缀,默认开启;根据字段的索引类型及查询类型自动判断是否需要拼接.keyword后缀
easy.es.global-config.db-config.smartAddKeywordSuffix=true
多数据源(可选)
# 动态数据源配置# 数据源1的连接地址,请替换为实际的IP地址和端口
easy.es.dynamic.datasource.ds1.address=你的ip地址:9200
# 若数据源1需要用户名,可以在此填写;若无用户名可去掉此行
# easy.es.dynamic.datasource.ds1.username=
# 若数据源1需要密码,可以在此填写;若无密码可去掉此行
# easy.es.dynamic.datasource.ds1.password=# 可以继续添加更多的数据源,示例如下:
# 数据源2的连接地址,请替换为实际的IP地址和端口
easy.es.dynamic.datasource.ds2.address=你的ip地址:9200
# 若数据源2需要用户名,可以在此填写;若无用户名可去掉此行
# easy.es.dynamic.datasource.ds2.username=
# 若数据源2需要密码,可以在此填写;若无密码可去掉此行
# easy.es.dynamic.datasource.ds2.password=

三、实现基于Spring Boot框架的应用程序代码(测试)

1.创建一个实体

import lombok.Data;
import org.dromara.easyes.annotation.HighLight;
import org.dromara.easyes.annotation.IndexField;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.annotation.rely.Analyzer;
import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType;import java.math.BigDecimal;
import java.util.Date;@Data
// 指定 Elasticsearch 索引名称及其分片数
@IndexName(value = "user_es", shardsNum = 3)
public class User {/*** 用户唯一标识符* 使用自定义 ID 类型*/@IndexId(type = IdType.CUSTOMIZE)private Integer id;/*** 用户姓名* 字段类型为 TEXT,采用 IK 最大词元分词器进行索引与搜索* 在搜索结果中匹配的内容将被高亮显示*/@IndexField(value = "userName", fieldType = FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD, searchAnalyzer = Analyzer.IK_MAX_WORD)@HighLight(preTag = "<span style="color:red">", postTag = "</span>")private String name;/*** 用户年龄* 字段类型为 INTEGER*/@IndexField(fieldType = FieldType.INTEGER)private Integer age;/*** 用户薪资* 字段类型为 DOUBLE*/@IndexField(fieldType = FieldType.DOUBLE)private BigDecimal salary;/*** 用户出生日期* 字段类型为 DATE*/@IndexField(fieldType = FieldType.DATE)private Date birthday;
}

注释详解:

@IndexName:

value = “user_es”: 指定索引名称为 user_es。

shardsNum = 3: 设置分片数量为 3。

replicasNum = 1: 设置副本数量为 1。

@IndexId:

type = IdType.CUSTOMIZE: 指定 ID 类型为自定义。

@IndexField:

value = “userName”: 指定字段在 Elasticsearch 中的名称为 userName。

fieldType = FieldType.TEXT: 指定字段类型为 TEXT。

analyzer = Analyzer.IK_MAX_WORD: 指定索引时使用的分词器为 IK_MAX_WORD。

searchAnalyzer = Analyzer.IK_MAX_WORD: 指定搜索时使用的分词器为 IK_MAX_WORD。

@HighLight:

preTag = “”: 高亮部分前缀标签。

postTag = “”: 高亮部分后缀标签。

2.相关方法

<1>.基本 CRUD 操作方法
(1)insert(T entity)
a.描述:

插入一条记录。

b.参数:

T entity - 要插入的实体对象。

c.返回值:

boolean - 插入是否成功。

(2)insertBatch(List entities)
a.描述:

批量插入记录。

b.参数:

List entities - 要插入的实体对象列表。

c.返回值:

boolean - 插入是否成功。

(3)deleteById(Object id)
a.描述:

根据 ID 删除记录。

b.参数:

Object id - 要删除的记录的 ID。

c.返回值:

boolean - 删除是否成功。

(4)deleteBatchIds(Listids)
a.描述:

批量删除记录。

b.参数:

Listids - 要删除的记录的 ID 列表。

c.返回值:

boolean - 删除是否成功。

(5)updateById(T entity)
a.描述:

根据 ID 更新记录。

b.参数:

T entity - 要更新的实体对象。

c.返回值:

boolean - 更新是否成功。

(6)update(T entity, Wrapper wrapper)
a.描述:

根据条件更新记录。

b.参数:

T entity - 要更新的实体对象。

Wrapper wrapper - 更新条件。

c.返回值:

boolean - 更新是否成功。

(7)selectById(Object id)
a.描述:

根据 ID 查询记录。

b.参数:

Object id - 要查询的记录的 ID。

c.返回值:

T - 查询到的实体对象。

(8)selectList(Wrapper queryWrapper)
a.描述:

根据条件查询记录列表。

b.参数:

Wrapper queryWrapper - 查询条件。

c.返回值:

List - 查询到的实体对象列表。

<2>. 批量操作
(1)insertOrUpdate(T entity)
a.描述:

插入或更新记录。如果记录存在则更新,否则插入。

b.参数:

T entity - 要插入或更新的实体对象。

c.返回值:

boolean - 操作是否成功。

(2)insertOrUpdateBatch(List entities)
a.描述:

批量插入或更新记录。如果记录存在则更新,否则插入。

b.参数:

List entities - 要插入或更新的实体对象列表。

c.返回值:

boolean - 操作是否成功。

<3>. 查询操作
(1)selectOne(Wrapper queryWrapper)
a.描述:

根据条件查询单条记录。

b.参数:

Wrapper queryWrapper - 查询条件。

c.返回值:

T - 查询到的实体对象。

(2)selectCount(Wrapper queryWrapper)
a.描述:

根据条件查询记录总数。

b.参数:

Wrapper queryWrapper - 查询条件。

c.返回值:

long - 记录总数。

(3)selectPage(Page page, Wrapper queryWrapper)
a.描述:

分页查询记录。

b.参数:

Page page - 分页对象。

Wrapper queryWrapper - 查询条件。

c.返回值:

IPage - 分页结果。

(4)selectMaps(Wrapper queryWrapper)
a.描述:

根据条件查询记录列表,返回 Map 形式的列表。

b.参数:

Wrapper queryWrapper - 查询条件。

c.返回值:

List> - 查询到的记录列表。

(5)selectObjs(Wrapper queryWrapper)
a.描述:

根据条件查询记录列表,返回单个字段的值列表。

b.参数:

Wrapper queryWrapper - 查询条件。

c.返回值:

List - 查询到的记录列表。

<4>. 其他方法
(1)exists(Wrapper queryWrapper)
a.描述:

根据条件判断记录是否存在。

b.参数:

Wrapper queryWrapper - 查询条件。

c.返回值:

boolean - 记录是否存在。

(2)getSource(Wrapper queryWrapper)
a.描述:

获取查询条件对应的 DSL 语句。

b.参数:

Wrapper queryWrapper - 查询条件。

c.返回值:

String - DSL 语句。

3.代码示例

(1)mapper层(持久层)

建议:Easy-Es的Mapper和MyBatis-Plus分开存放 一个是查数据库的,一个是查es的

import org.dromara.easyes.core.core.BaseEsMapper;/*** 用户 Elasticsearch 数据访问接口* * 该接口继承自 BaseEsMapper,专门用于处理 User 实体类的 Elasticsearch 操作。* 通过此接口,可以实现对用户数据的增删改查等操作。* * @see BaseEsMapper* @see User*/
public interface UserESMapper extends BaseEsMapper<User> {// 此接口可以在未来添加自定义的用户相关查询方法
}

注意:本接口仅用于执行ES(Elasticsearch)相关操作,不涉及数据库操作,请避免功能冲突。

(2)业务逻辑层(Service)
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;import java.util.List;/*** 用户服务接口** 提供用户相关的操作,包括插入、查询、更新和删除用户信息。* 本接口定义了一系列方法,用于与用户数据进行交互。* 具体实现应支持ElasticSearch存储和查询。** @author [您的名字]* @version 1.0* @since [日期]*/
public interface UserEsService {/*** 插入用户信息** @param user 用户对象,包含要插入的用户信息* @return 操作影响的行数,通常为1表示成功,0表示失败*/Integer insertUser(User user);/*** 根据用户ID查询用户信息** @param id 用户ID,唯一标识一个用户* @return 用户对象,查询成功时返回用户信息,未找到则返回null*/User getUserById(Integer id);/*** 查询满足条件的用户列表** @param queryWrapper 查询条件封装,包含查询所需的所有条件* @return 用户列表,符合条件的用户集合,可能为空*/List<User> getUserList(LambdaEsQueryWrapper<User> queryWrapper);/*** 更新指定ID的用户信息** @param user 用户对象,需包含ID和更新后的用户信息* @return 操作影响的行数,通常为1表示成功,0表示失败*/Integer updateUserById(User user);/*** 删除指定ID的用户信息** @param id 用户ID,唯一标识要删除的用户* @return 操作影响的行数,通常为1表示成功,0表示失败*/Integer deleteUserById(Integer id);/*** 分页查询用户信息** @param queryWrapper 查询条件封装,包含分页信息和其他查询条件* @return 用户列表,符合条件的用户集合,可能为空*/List<User> getUserListWithPage(LambdaEsQueryWrapper<User> queryWrapper);
}
(3)实现层(ServiceImpl)
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** 用户服务实现类** 实现了 UserEsService 接口,提供与用户相关的操作,包括插入、查询、更新和删除用户信息。* 通过 UserESMapper 与 ElasticSearch 进行交互。** @author [您的名字]* @version 1.0* @since [日期]*/
@Service
public class UserEsServiceImpl implements UserEsService {@Autowiredprivate UserESMapper userEsMapper;/*** 插入用户信息到数据库** @param user 用户对象,包含要插入的用户信息* @return 操作影响的行数,通常为1表示成功,0表示失败*/@Overridepublic Integer insertUser(User user) {// 插入用户信息到数据库return userEsMapper.insert(user);}/*** 根据用户ID查询用户信息** @param id 用户ID,唯一标识一个用户* @return 用户对象,查询成功时返回用户信息,未找到则返回null*/@Overridepublic User getUserById(Integer id) {// 根据用户ID查询用户信息return userEsMapper.selectById(id);}/*** 查询满足条件的用户列表** @param queryWrapper 查询条件封装,包含查询所需的所有条件* @return 用户列表,符合条件的用户集合,可能为空*/@Overridepublic List<User> getUserList(LambdaEsQueryWrapper<User> queryWrapper) {// 查询满足条件的用户列表return userEsMapper.selectList(queryWrapper);}/*** 更新指定ID的用户信息** @param user 用户对象,需包含ID和更新后的用户信息* @return 操作影响的行数,通常为1表示成功,0表示失败*/@Overridepublic Integer updateUserById(User user) {// 更新指定ID的用户信息return userEsMapper.updateById(user);}/*** 删除指定ID的用户信息** @param id 用户ID,唯一标识要删除的用户* @return 操作影响的行数,通常为1表示成功,0表示失败*/@Overridepublic Integer deleteUserById(Integer id) {// 删除指定ID的用户信息return userEsMapper.deleteById(id);}/*** 分页查询用户信息** @param queryWrapper 查询条件封装,包含分页信息和其他查询条件* @return 用户列表,符合条件的用户集合,可能为空*/@Overridepublic List<User> getUserListWithPage(LambdaEsQueryWrapper<User> queryWrapper) {// 分页查询用户信息return userEsMapper.selectList(queryWrapper);}
}
(4)表现层(Controller)
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** 用户控制器** 提供与用户相关的 RESTful API 接口,包括插入、查询、更新和删除用户信息。* 所有请求均以 /user-es 为前缀。** @author [您的名字]* @version 1.0* @since [日期]*/
@RestController
@RequestMapping("/user-es")
public class UserEsController {@Autowiredprivate UserEsService userService;/*** 插入用户信息** @param user 用户对象,包含要插入的用户信息* @return 插入操作影响的行数,通常为1表示成功,0表示失败*/@PostMappingpublic Integer insertUser(@RequestBody User user) {// 插入用户信息return userService.insertUser(user);}/*** 根据用户ID查询用户信息** @param id 用户ID,唯一标识一个用户* @return 用户对象,查询成功时返回用户信息,未找到则返回null*/@GetMapping("/{id}")public User getUserById(@PathVariable Integer id) {// 根据用户ID查询用户信息return userService.getUserById(id);}/*** 查询满足条件的用户列表** @param age 可选参数,查询指定年龄的用户* @return 用户列表,符合条件的用户集合,可能为空*/@GetMappingpublic List<User> getUserList(@RequestParam(required = false) Integer age) {// 查询满足条件的用户列表LambdaEsQueryWrapper<User> queryWrapper = new LambdaEsQueryWrapper<>();if (age != null) {queryWrapper.eq(User::getAge, age); // 添加等于年龄的查询条件}return userService.getUserList(queryWrapper);}/*** 更新指定ID的用户信息** @param user 用户对象,需包含ID和更新后的用户信息* @return 更新操作影响的行数,通常为1表示成功,0表示失败*/@PutMappingpublic Integer updateUserById(@RequestBody User user) {// 更新指定ID的用户信息return userService.updateUserById(user);}/*** 删除指定ID的用户信息** @param id 用户ID,唯一标识要删除的用户* @return 删除操作影响的行数,通常为1表示成功,0表示失败*/@DeleteMapping("/{id}")public Integer deleteUserById(@PathVariable Integer id) {// 删除指定ID的用户信息return userService.deleteUserById(id);}/*** 分页查询用户信息** @param from 分页起始位置* @param size 每页大小* @return 用户列表,符合条件的用户集合,可能为空*/@GetMapping("/page")public List<User> getUserListWithPage(@RequestParam(defaultValue = "0") int from,@RequestParam(defaultValue = "10") int size) {// 分页查询用户信息LambdaEsQueryWrapper<User> queryWrapper = new LambdaEsQueryWrapper<>();queryWrapper.from(from).size(size); // 设置分页起始位置和大小return userService.getUserListWithPage(queryWrapper);}
}

4.遭遇的技术难题与挑战

(1)缺少一些jackson的相关依赖

如果发生以下报错可能是因为缺少一些jackson的相关依赖

报错信息

org.springfranework.beans. factory.BeanCreationException Ceae brekpont : Error creating bean with nane ‘reguestHappingHandlerAdapter’ defined in class path resource org/springfranework/boot/autoconfigure/neb/servlet/NebHvckutoConfigurationsEnablelebHvcConfiguration.

翻译

org.springfranework.beans。工厂。在类路径资源org/springfranework/boot/autoconfigure/neb/servlet/NebHvckutoConfigurationsEnablelebHvcConfiguration中定义名称为‘reguestHappingHandlerAdapter’的bean创建错误。

报错全部信息
org.springfranework.beans. factory.BeanCreationException Ceae brekpont : Error creating bean with nane 'reguestHappingHandlerAdapter' defined in class path resource [org/springfranework/boot/autoconfigure/neb/servlet/NebHvckutoConfigurationsEnablelebHvcConfiguration.
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) [spring-beans-5.3.31.jar:5.3.31)lat org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:633) [spring-beans-5.3.31.jar:5.3.31at org.
springframework beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) [spring-beans-5.3.31.jar:5.3.31]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) [spring-beans-5.3.31.jar:5.3.31]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) 
[spring-beans-5.3.31.jar:5.3.31 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) [spring-beans-5.3.31.jar:5.3.31 at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$e(AbstractBeanFactory.java:335) [spring-beans-5.3.31.jar:5.3.31]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) 
[spring-beans-5.3.31.jar:5.3.31]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.lava:333) -[spring-beans-5.3.31.jar:5.3.31] lat org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) [spring-beans-5.3.31.jar:5.3.31]at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultlistableBeanFactory.java:955) [spring-beans-5.3.31.jar:5.3.31]at 
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:929) [spring-context-5.3.31.jar:5.3.31)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:591) [spring-context-5.3.31.jar:5.3.31]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) [spring-boot-2.7.18.jar:2.7.18)at 
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) [spring-boot-2.7.18.jar:2.7.18]lat org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409) [spring-boot-2.7.18.jar:2.7.18]at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) [spring-boot-2.7.18.jar:2.7.18]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) [spring-boot-2.7.18.jar:2.7.18]at 
org.springframework.boot.SpringApplication.run(SpringApplication.java:1289) [spring-boot-2.7.18.jar:2.7.18]lat com.gjc.EasyEsApplication.main(EasyEsApplication.java:13) [classes/:na]CSDN @Love-Sto
解决方法:根据要加入相关依赖
<dependencies><!-- Jackson 数据绑定核心库,用于将 Java 对象与 JSON 数据进行转换 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version> <!-- 请使用最新版本 --></dependency><!-- Jackson 核心库,提供基本的 JSON 处理功能 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.13.3</version> <!-- 请使用最新版本 --></dependency><!-- Jackson 注解库,提供用于序列化和反序列化的注解 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.13.3</version> <!-- 请使用最新版本 --></dependency>
</dependencies>

注: 会报错的原因在于Spring Boot的自动配置机制依赖于这些库来处理JSON数据的序列化和反序列化。具体来说,jackson-databind、jackson-core 和 jackson-annotations 是Jackson库的核心组件,Spring Boot使用它们来处理HTTP请求和响应中的JSON数据。

以下是对每个依赖项的详细解释:
a. jackson-databind
作用:

提供数据绑定功能,即将JSON数据转换为Java对象(反序列化)和将Java对象转换为JSON数据(序列化)。

重要性:

这是Jackson库的核心部分,Spring Boot的MappingJackson2HttpMessageConverter依赖于它来处理HTTP请求和响应中的JSON数据。

b. jackson-core
作用:

提供底层的流式API,用于高效地读取和写入JSON数据。

重要性:

jackson-databind依赖于jackson-core来实现其数据绑定功能。没有jackson-core,jackson-databind无法正常工作。

c. jackson-annotations
作用:

提供注解支持,用于控制JSON数据的序列化和反序列化行为。

重要性:

虽然不是必需的,但这些注解(如@JsonProperty、@JsonDeserialize等)在处理复杂的JSON数据结构时非常有用。Spring Boot的一些自动配置功能也依赖于这些注解。

为什么缺少这些依赖会报错?
a.MappingJackson2HttpMessageConverter 依赖:

Spring Boot的WebMvcAutoConfiguration会自动配置一个RequestMappingHandlerAdapter,该适配器需要MappingJackson2HttpMessageConverter来处理JSON数据。

MappingJackson2HttpMessageConverter依赖于jackson-databind来实现JSON的序列化和反序列化。

b.jackson-databind 依赖:

如果没有jackson-databind,MappingJackson2HttpMessageConverter无法实例化,从而导致RequestMappingHandlerAdapter的初始化失败。

c.jackson-core 依赖:

jackson-databind依赖于jackson-core来实现底层的JSON读写操作。如果没有jackson-core,jackson-databind也无法正常工作。

d.jackson-annotations 依赖:

虽然jackson-annotations不是必须的,但在某些情况下,Spring Boot的自动配置可能会使用这些注解来优化JSON处理。缺少这些注解可能会导致一些高级功能无法正常使用。

(2)easy-es当前支持的SpringBoot版本

easy-es 是一个基于Elasticsearch的Java EE开发框架,它不直接支持Spring Boot 3.0及以上版本,因为它可能依赖于Spring Boot 2.x系列的特定API或者功能。

如果你需要在Spring Boot 3.0以上版本使用类似easy-es的功能,你可以寻找是否有支持Spring Boot 3.x的版本,或者等待easy-es更新以支持新版本。

如果你不得不在Spring Boot 3.0以上版本使用类似easy-es的功能,你可以考虑以下两种方案:

  1. 查看easy-es的最新版本是否支持Spring Boot 3.x,如果有,则升级到支持的版本。
  2. 如果easy-es没有发布支持Spring Boot 3.x的新版本,你可以尝试自己对现有版本进行修改,使其兼容Spring Boot 3.x,但这可能需要较多的工作和测试。

在进行任何升级或修改之前,请确保检查easy-es的官方文档和发布说明,以获取有关兼容性和任何重大更改的信息。

注:本文开头提供了easy-es的官网

目前的错误信息就是这些,未来遇到新的问题将会逐步记录和补充。

相关文章:

SpringBoot整合easy-es

一、easy-es简介 EasyES是一款基于Elasticsearch官方提供的RestHighLevelClient开发的ORM框架&#xff0c;旨在简化开发流程并提高效率。 EasyES在保持RestHighLevelClient原有功能的基础上进行增强&#xff0c;而不做任何改变。它采用与Mybatis-Plus相似的语法&#xff0c;使得…...

2025年2月15日(ipython 换行-deepseek)

好的&#xff0c;用户现在想知道在IPython中如何换行而不运行代码。之前他们问过关于树莓派安装matplotlib的问题&#xff0c;现在转向IPython的使用&#xff0c;可能他们正在学习Python&#xff0c;并且可能在使用树莓派进行项目开发。需要确定用户的使用场景&#xff0c;可能…...

MyBatis:动态SQL高级标签使用方法指南

一、引言 目前互联网大厂在搭建后端Java服务时&#xff0c;常使用Springboot搭配Mybatis/Mybatis-plus的框架。Mybatis/Mybatis-plus之所以能成为当前国内主流的持久层框架&#xff0c;与其本身的优点有关&#xff1a;支持定制动态 SQL、存储过程及高级映射&#xff0c;简化数…...

Python常见面试题的详解5

1. re 模块中 search () 和 match () 的区别 要点&#xff1a;在 Python 的 re 模块中&#xff0c;re.match() 和 re.search() 是用于正则表达式匹配的两个重要函数&#xff0c;它们的主要区别在于匹配的起始位置&#xff1a;re.match()&#xff1a;从字符串的开头开始匹配正则…...

python包的管理

管理python包 python能跻身最欢迎编程语言前列的一个主要原因是python有着活跃的社区提供丰富的包&#xff0c;诸如numpy&#xff0c;pandas&#xff0c;scikit-learn等等。 python的包都存放PyPI中&#xff0c;PyPI即Python Package Index&#xff0c;是python的软件仓库。所…...

性能测试流程、主流性能工具

性能测试流程 性能测试流程 测试测试需求分析 性能测试计划和方案 测什么&#xff1a; 测试背景 测试目的 测试范围 谁来测&#xff1a; 进度和分工 交付清单 怎么测&#xff1a; 测试策略 性能测试用例设计 性能测试测试执行 性能分析和调优 性能测试报告 测试报告是…...

Lua闭包的使用以及需要注意的问题

1. 闭包的基本概念 在 Lua 中&#xff0c;闭包是一个函数值&#xff0c;它包含了函数本身以及该函数所创建时的环境。闭包允许函数访问其外部函数作用域中的变量&#xff0c;即使外部函数已经执行完毕。 2.闭包的简单使用 代码&#xff1a;在下面的代码中&#xff0c;create…...

【个人开发】deepseed+Llama-factory 本地数据多卡Lora微调

文章目录 1.背景2.微调方式2.1 关键环境版本信息2.2 步骤2.2.1 下载llama-factory2.2.2 准备数据集2.2.3 微调模式2.2.4 微调脚本 2.3 踩坑经验2.3.1 问题一&#xff1a;ValueError: Undefined dataset xxxx in dataset_info.json.2.3.2 问题二&#xff1a; ValueError: Target…...

LabVIEW 天然气水合物电声联合探测

天然气水合物被认为是潜在的清洁能源&#xff0c;其储量丰富&#xff0c;预计将在未来能源格局中扮演重要角色。由于其独特的物理化学特性&#xff0c;天然气水合物的探测面临诸多挑战&#xff0c;涉及温度、压力、电学信号、声学信号等多个参数。传统的人工操作方式不仅效率低…...

VisualStudio 2012 fatal error C1083: 无法打开包括文件:“stdio.h 找不到 sdkddkver.h

今天安装了一个VC 2012 Express 学习版,提示找不不到stdio.h, 提示找不到sdkddkver.h 发现是没有安装windows8.0 SDK ,还有一个些VC头文件没有安装. 真是太奇怪了,可能版本太多,安装出问题. 我这里放一个备份文件,省得以后,不能安装的时候,没地方找这些头文件. 无法打开包…...

什么是access token和refresh token?

access token 验证身份有效时间相对refresh token 时间短一点 refresh token 用于辅助access token 过期,避免用户反复登录的问题当accesstoken过期直接拿refreshtoken去获取最新的token...

盛铂科技 SCP4006/4018/4040:国产袖珍式功率计 射频微波功率探头 平均功率计

在通信、电子测量等领域&#xff0c;功率计是确保信号稳定、系统高效运行的关键设备。盛铂科技自主研发的 SCP4000 系列自带 USB 接口的袖珍式 CW 信号平均功率计&#xff0c;以其卓越的性能、高性价比和便捷的操作&#xff0c;在众多同类产品中脱颖而出&#xff0c;成为行业内…...

Unity 获取独立显卡数量

获取独立显卡数量 导入插件包打开Demo 运行看控制台日志 public class GetGraphicCountDemo : MonoBehaviour{public int count;// Start is called before the first frame updatevoid Start(){count this.GetIndependentGraphicsDeviceCount();}}...

wx061基于ssm+vue+uniapp的疫情期间学生请假与销假系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…...

硕成C语言22【一些算法和数组的概念】

1.求水仙花数 #include <stdio.h>int main() {//求水仙花数&#xff1a;1.三位数 2.个位的立方十位的立方百位的立方该数int unit, tens, hundreds;for (int i 100; i < 1000; i)//i表示该水仙花数{unit i / 1 % 10;tens i / 10 % 10;hundreds i / 100 % 10;if (…...

最新国内 ChatGPT Plus/Pro 获取教程

最后更新版本&#xff1a;20250202 教程介绍&#xff1a; 本文将详细介绍如何快速获取一张虚拟信用卡&#xff0c;并通过该卡来获取ChatGPT Plus和ChatGPT Pro。 # 教程全程约15分钟开通ChatGPT Plus会员帐号前准备工作 一个尚未升级的ChatGPT帐号&#xff01;一张虚拟信用卡…...

Django中实现简单易用的分页工具

如何在Django中实现简单易用的分页工具&#xff1f;&#x1f4da; 嗨&#xff0c;小伙伴们&#xff01;今天我们来看看如何在 Django 中实现一个超简单的分页工具。无论你是在处理博客文章、产品列表&#xff0c;还是用户评论&#xff0c;当数据量一大时&#xff0c;分页显得尤…...

个人下载中国生物医学文献服务系统SinoMed文献的途径及操作方法

中国生物医学文献服务系统——SinoMed数据库介绍&#xff1a; 中国生物医学文献服务系统——SinoMed&#xff0c;由中国医学科学院医学信息研究所/图书馆研制&#xff0c;整合了中国生物医学文献数据库&#xff08;CBM&#xff09;、中国医学科普文献数据库&#xff08;CPM&am…...

软件开发 | GitHub企业版常见问题解读

什么是GitHub企业版&#xff1f; GitHub企业版是一个企业级软件开发平台&#xff0c;专为现代化开发的复杂工作流程而设计。 作为可扩展的平台解决方案&#xff0c;GitHub企业版使组织能够无缝集成其他工具和功能&#xff0c;并根据特定需求定制开发环境&#xff0c;提高整体…...

【Bluedroid】BLE连接过程详解

在BLE通信中,广播(Advertising)和扫描(Scanning)是设备发现和建立连接的基本过程。根据蓝牙SPEC,当一个设备(称为Advertiser)在广播模式下发送广播包时,它遵循一定的时序和规则,以便其他设备(称为Observer或Scanner)可以检测到它,并在适当的时机发送连接请求。 B…...

清影2.0(AI视频生成)技术浅析(二):自然语言处理

清影2.0(AI视频生成)中的自然语言处理(NLP)技术是其核心组件之一,负责将用户输入的自然语言文本转化为机器可以理解的语义表示,从而指导后续的视频生成过程。 一、基本原理 1. 目标 清影2.0的NLP技术旨在将用户输入的自然语言文本转化为机器可以理解的语义表示,从而指…...

Bob the Canadian

1&#xff1a;around the house Hi! Bob the Canadian here! Let’s learn English around the house. Come on in! Hi, Bob the Canadian here. Welcome to this video. If this is your first time here, don’t forget to click the subscribe button below, and give…...

DeepSeek、Kimi、文心一言、通义千问:AI 大语言模型的对比分析

在人工智能领域&#xff0c;DeepSeek、Kimi、文心一言和通义千问作为国内领先的 AI 大语言模型&#xff0c;各自展现出了独特的特点和优势。本文将从技术基础、应用场景、用户体验和价格与性价比等方面对这四个模型进行对比分析&#xff0c;帮助您更好地了解它们的特点和优势。…...

算法思考:非0整数除法

这是一道很简单的问题&#xff0c;但是我们可以有更多的思考 1.如何提升效率&#xff1f; 除法&#xff0c;很明显就是循环嘛&#xff0c;那么如何进一步提升效率&#xff1f;就是跳过多余的循环步骤比如15/2&#xff0c;原先是1111111再余1&#xff0c;现在尽量每次除2的最大…...

服务器租用:虚拟化技术都包含哪些内容?

服务器作为常见的网络设备&#xff0c;有着物理服务器、云服务器和虚拟服务器等多种类型&#xff0c;其中虚拟服务器主要是依靠虚拟化技术将物理服务器划分成多个虚拟机&#xff0c;以此来充分利用服务器资源&#xff0c;那虚拟化技术都包含了哪些内容呢&#xff1f; 硬件虚拟化…...

[免费]SpringBoot公益众筹爱心捐赠系统【论文+源码+SQL脚本】

大家好&#xff0c;我是老师&#xff0c;看到一个不错的SpringBoot公益众筹爱心捐赠系统&#xff0c;分享下哈。 项目介绍 公益捐助平台的发展背景可以追溯到几十年前&#xff0c;当时人们已经开始通过各种渠道进行公益捐助。随着互联网的普及&#xff0c;本文旨在探讨公益事业…...

uniapp商城之首页模块

文章目录 前言一、自定义导航栏1.静态结构2.修改页面配置3.组件安全区适配二、通用轮播组件1. 静态结构组件2.自动导入全局组件3.首页轮播图数据获取三、首页分类1.静态结构2.首页获取分类数据并渲染四、热门推荐1.静态结构2.首页获取推荐数据并渲染3.首页跳转详细推荐页五、猜…...

类与对象C++详解(上)

目录 1.类的定义 1.1 类定义格式 补充: struct与class的区别&#xff08;c语言与c&#xff09; 1.2 访问限定符 1.3 类域 2.实例化 3.对象大小 4.this指针 1.类的定义 1.1 类定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&…...

AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐

AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐 目录 AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐比特币AI Agents稳定币扩容区块链AI基础设施AI驱动的软件应用AI赋能的行业应用AI医疗影像、智能客服、个性化推荐AI药物研发比特币 市场与机构化:2024…...

SpringBoot:使用spring-boot-test对web应用做单元测试时如何测试Filter?

对SpringBoot的Web应用做单元测试时&#xff0c;一般会使用spring-boot-test&#xff0c;pom.xml中会添加如下内容&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><…...

【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。

文章目录 Scaramuzza相机模型标定效果2、原理和代码代码1、 2D映射到3D&#xff0c;函数输入为2D点坐标OCAM参数代码功能详解2、3D --> 2D 3、总结Scaramuzza 模型的核心思想Scaramuzza 模型的核心思想与 Kannala-Brandt 模型的对比Scaramuzza 模型的独特之处Scaramuzza 的意…...

WPF创建自定义类和控件及打包成dll引用

WPF创建自定义类和控件及打包成dll引用 一、前言二、创建自定义类和控件并生成dll文件2.1创建类库项目2.2创建自定义类和控件2.3生成dll文件 三、在其他项目中引用3.1添加dll文件引用3.2cs文件中引用命名空间3.3XAML文件中引用命名空间 一、前言 出于一些代码复用的需求&#…...

家里WiFi信号穿墙后信号太差怎么处理?

一、首先在调制解调器&#xff08;俗称&#xff1a;猫&#xff09;测试网速&#xff0c;网速达不到联系运营商&#xff1b; 二、网线影响不大&#xff0c;5类网线跑500M完全没问题&#xff1b; 三、可以在卧室增加辅助路由器&#xff08;例如小米AX系列&#xff09;90~200元区…...

C++初阶——简单实现string

简单实现std::string类及一些常用的成员函数。 迭代器&#xff0c;使用指针简单代替。 目录 1、String.h 2、String.cpp 3、Test.cpp 1、String.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1#include <iostream> #include <assert.h>using namespace s…...

浏览器支持的通讯协议

浏览器支持的通讯协议 1. HTTP&#xff08;HyperText Transfer Protocol&#xff09; 版本 HTTP/1.0&#xff1a;每次请求都需要重新建立连接。HTTP/1.1&#xff1a;支持持久连接&#xff08;Keep-Alive&#xff09;&#xff0c;减少连接开销。HTTP/2&#xff1a;多路复用&am…...

18.Python实战:实现年会抽奖系统

目录结构 python/ ├── sql/ │ └── table.sql # 创建数据库及数据表 ├── config/ │ └── __init__.py # 数据库和Flask配置 ├── static/ │ ├── style.css # 样式文件 │ └── script.js # JavaScript脚本…...

微信小程序地图标记点,安卓手机一次性渲染不出来的问题

问题描述&#xff1a; 如果微信小程序端&#xff0c;渲染的标记物太多&#xff0c;安卓手机存在标记物不显示的问题&#xff0c;原因初步判断是地图还没有渲染完&#xff0c;标记物数据已经加载完了&#xff0c;导致没有在地图上显示。 解决办法&#xff1a; 使用map组件的b…...

机器翻译同样的文本,是从英语翻译成日语更准确还是中文翻译成日语更准确

在大多数情况下&#xff0c;从英语翻译成日语会比从中文翻译成日语更准确&#xff0c;原因如下&#xff1a; 1. 语言结构的相似性 英语和日语的句子结构更接近&#xff0c;特别是在语法、从句使用、定语位置等方面。例如&#xff0c;日语和英语都使用 SVO 结构&#xff08;主…...

ROS基本功能

1.Topic话题与Message消息&#xff08;主要通讯方式&#xff09; 基本规则 发布消息的步骤 常用工具 话题的订阅 使用launch启动多个节点...

C++字符串处理指南:从基础操作到性能优化——基于std::string的全面解析

博主将从C标准库中的 std::string 出发&#xff0c;详细探讨字符串的处理方法&#xff0c;涵盖常见操作、性能优化和实际应用场景。以下内容将围绕std::string 的使用展开&#xff0c;结合代码示例进行说明。 一、std::string 的基本操作 1.1 创建与初始化 std::string 提供了…...

语言大模型基础概念 一(先了解听说过的名词都是什么)

SFT&#xff08;监督微调&#xff09;和RLHF&#xff08;基于人类反馈的强化学习&#xff09;的区别 STF&#xff08;Supervised Fine-Tuning&#xff09;和RLHF&#xff08;Reinforcement Learning from Human Feedback&#xff09;是两种不同的模型训练方法&#xff0c;分别…...

sql语句的执行顺序

完整的sql语句执行顺序 SELECT DISTINCT column1, column2, aggregate_function(column3) FROM table1JOIN table2 ON table1.column table2.column WHERE condition GROUP BY column1, column2 HAVING group_condition ORDER BY column1, column2 LIMIT offset, count;FROM子…...

更高效实用 vscode 的常用设置

VSCode 可以说是文本编辑神器, 不止程序员使用, 普通人用其作为文本编辑工具, 更是效率翻倍. 这里分享博主对于 VSCode 的好用设置, 让 VSCode 如虎添翼 进入设置 首先进入设置界面, 后续都在这里进行配置修改 具体设置 每项配置通过搜索关键字, 来快速定位配置项 自动保存…...

Next.js【详解】CSS 样式方案

全局样式 Global CSS 默认已创建&#xff0c;即 src\app\globals.css&#xff0c;可根据需要修改 默认在全局布局中导入 src\app\layout.tsx import "./globals.css";组件样式 CSS Modules 新建文件 src\app\test\styles.module.css .red {color: red;}导入目标页面…...

铁塔电单车协议对接电单车TCP json协议对接成熟充电桩系统搭建低速充电桩TCP 接口规范

低速充电桩 TCP 接口规范 2019 年 9 月 10 日 目录 低速充电桩 1 2) 概述 2 • 协议服务器(IOT_Server) 6 • 通讯报文原则 6 • 报文协议说明 6 报文中所有数值类型为十进制&#xff1b; 6报文中不允许使用转义字符&#xff0c;如\n、\t、\r、\s&#xff1b; 6 • 报文类型…...

CTF-web:java-h2 堆叠注入rce -- N1ctf Junior EasyDB

代码存在sql注入 // 处理登录表单的POST请求PostMapping({"/login"})public String handleLogin(RequestParam String username, RequestParam String password, HttpSession session, Model model) throws SQLException {// 验证用户凭据if (this.userService.valid…...

【异或数列——博弈论】

题目 思路 异或和为0&#xff08;即每一位都有偶数个1&#xff09;&#xff1a;平局最高有效位只有唯一的1&#xff1a;先手必胜最高有效位有奇数个1&#xff0c;偶数个0&#xff1a;先手必胜 若先选1产生优势&#xff0c;则剩下偶数个1&#xff0c;偶数个0&#xff1a;对手选…...

2024 年 9 月青少年软编等考 C 语言三级真题解析

目录 T1. 爆气球思路分析T2. 乘法小宇宙思路分析T3. 有多少坑思路分析T4. 势均力敌思路分析T5. 买地攻略思路分析T1. 爆气球 爆气球对孩子们来说是很好玩的游戏。假设有 n n n 只气球被布置在一条直线上,游戏的目标很简单,就是爆掉尽可能多的气球。但是这里我们加一条特殊的…...

JavaScript设计模式 -- 外观模式

在实际开发中&#xff0c;往往会遇到多个子系统协同工作时&#xff0c;直接操作各个子系统不仅接口繁琐&#xff0c;还容易导致客户端与内部实现紧密耦合。**外观模式&#xff08;Facade Pattern&#xff09;**通过为多个子系统提供一个统一的高层接口&#xff0c;将复杂性隐藏…...

在 Vue 项目中使用 SQLite 数据库的基础应用

目录 一、环境准备二、数据库连接与操作1. 创建数据库连接2. 创建表3. 插入数据4. 查询数据5. 更新数据6. 删除数据 三、在 Vue 组件中使用 SQLite 一、环境准备 安装 Node.js 和 npm&#xff1a;确保已安装 Node.js 和 npm。 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个…...