Spring Boot 与 MyBatis Plus 整合 KWDB 实现 JDBC 数据访问

引言

本文主要介绍如何在 IDEA 中搭建一个使用 Maven 管理的 Spring Boot 应用项目工程,并结合在本地搭建的 KWDB 数据库(版本为:2.0.3)来演示 Spring Boot 与 MyBatis Plus 的集成,以及对 KWDB 数据库的数据操作访问等。

技术选型

本文示例工程所使用的 JDK、Maven、Spring Boot 与 MyBatis Plus 的版本如下:

Maven:Apache Maven 3.6.3
Spring Boot:2.7.18
MyBatis Plus:com.baomidou:mybatis-plus-boot-starter:3.5.5

本文选择 Spring Boot 作为应用框架、MyBatis Plus 作为 ORM 框架、KWDB 作为数据库的优点和适用场景如下:

标题Spring Boot 应用框架优点和适用场景

• 简化开发:通过自动化配置和约定优于配置的方式,极大地简化了 Spring 应用程序的开发和部署过程;

• 集成度高:提供了大量的开箱即用的功能模块(如:数据访问等),支持快速集成第三方库和服务;

• 微服务支持:提供了微服务架构支持,可以轻松集成 Spring Cloud 等微服务框架;

• 生态系统强大:拥有庞大且活跃的社区,提供了丰富的文档、教程和支持,可以快速解决开发中的问题;

• 适用场景:适合构建各种类型的 Java 应用程序,特别是 Web 应用和微服务架构。

使用 Maven 管理项目的优点

• 依赖管理:能够有效管理项目所需的依赖库(如 JAR 包),支持自动下载、更新和配置这些依赖项;

• 标准化项目结构:定义了标准的项目结构,包括源代码、资源文件、测试代码等目录结构;

• 构建自动化:支持自动化构建,通过简单的命令即可完成复杂的构建任务;

• 插件生态系统:拥有丰富的插件生态系统,可以扩展其功能,支持各种任务和需求。

MyBatis Plus 框架的优点和适用场景

• 简化操作:提供了更便捷的 API 和更丰富的功能,简化了与数据库的交互操作;

• 代码生成:支持代码生成器,可以根据数据库表自动生成实体类、Mapper 接口以及基本的 CRUD 方法;

• 强大的条件构造器:提供了灵活而强大的条件构造器(Wrapper),可以通过构建条件对象来生成复杂的 SQL 查询语句,提高了开发效率;

• 适用场景:适合需要灵活控制 SQL 的项目工程。

KWDB 数据库的优点

• 多模数据支持:支持时序型和关系型数据采、存、算、管功能和数据跨模计算与分析;

• 高性能写入:依托“就地计算”技术实现高性能读写,支持千万级数据秒级写入和毫秒级精度数据写入;

• 实时查询与分析:支持数据实时分析,千万级数据聚合查询毫秒级响应,提供丰富的函数支持;

• 低成本:支持 10 倍以上的数据压缩,数据降采样存储,按“时间热度”进行数据生命周期管理;

• 多重安全性保障:支持身份鉴权、权限管理、数据库审计,以及通信加密和数据加密;

• 高兼容性:支持 SQL 语言,兼容 PG,MySQL 语法,支持 Java/C++ 等多种开发语言,支持 RestfulAPI;

• 适用场景:面向工业物联网、数字能源、车联网、智慧产业等各大行业领域。

环境搭建

1. 应用项目初始化

首先使用 IDEA 初始化创建一个 Spring Boot 项目工程,语言选中 Java,类型是 Maven 项目,JDK 选择 JDK8(也叫 JDK1.8),由于官网提供的 JDK 最低版本是 JDK17,所以在第 4 步 Java 选项中找不到 Java8 选项,但是阿里云提供了 JDK8 版本资源,因此将构建项目的 Server URL 服务地址更换为阿里云服务:start.aliyun.com,具体步骤如下:

a. 新建 Spring Boot 应用项目;

在这里插入图片描述

b. 点击下一步,选择要加载的依赖项,并完成创建;

在这里插入图片描述

c. 找到项目路径 /src/main/resources 中的 application.properties,将其修改为更常用的 application.yml 文件。

在这里插入图片描述

2. 引入 MyBatis Plus 依赖

在 kaiwudb-app 项目的 pom.xml 文件中引入 MyBatis Plus 的依赖项;

<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version>
</dependency>

3. 引入 JDBC 依赖

JDBC 驱动尚未在 Maven 中央仓库中提供,用户需先获取 kaiwudb-jdbc-2.0.4.jar 文件,通过 Maven 管理工具,执行安装命令将 JDBC 驱动安装到本地 Maven 仓库中,安装命令如下:

#KaiwuDB JDBC 安装命令,其中 -Dfile 参数为安装包路径
$ mvn install:install-file "-Dfile=../kaiwudb-jdbc-2.0.4.jar" "-DgroupId=com.kaiwudb" "-DartifactId=kaiwudb-jdbc" "-Dversion=2.0.4" "-Dpackaging=jar"

在 kaiwudb-app 项目的 pom.xml 文件中引入 JDBC 驱动的依赖项;

XML
<!-- kaiwudb jdbc 2.0.4 -->
<dependency><groupId>com.kaiwudb</groupId><artifactId>kaiwudb-jdbc</artifactId><version>2.0.4</version>
</dependency>

pom.xml 文件在 IDEA 中引入 MyBatis Plus 依赖项显示如下:

在这里插入图片描述

应用配置

1. 数据源配置

数据源配置涉及到如何设置和管理数据库,包括数据库的连接信息、连接超时等参数。在 Spring Boot 中,通常通过配置文件(application.properties 或 application.yml)来配置数据源信息。

KWDB 支持关系和时序两种引擎,以下是连接操作 KWDB 数据库关系引擎时的数据源配置信息:

spring:datasource:url: jdbc:kaiwudb://127.0.0.1:26257/kwdb_app  # URL 链接地址username: test  # 用户名password: Password@2024  # 密码driver-class-name: com.kaiwudb.Driver  # 驱动名

2. MyBatis Plus 配置

配置 MyBatis Plus 包括但不限于设置 Mapper 扫描路径、配置全局参数、注入自定义 SQL 拦截器等。在 Spring Boot 中,可以通过配置文件(application.properties 或 application.yml)和配置类(如使用 @Configuration 注解的类)来配置 MyBatis Plus 的各项功能。

以下是在配置文件中对 MyBatis Plus 的相关配置信息:

mybatis-plus:configuration:map-underscore-to-camel-case: true  # 开启驼峰命名自动映射log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 开启日志打印type-aliases-package: com.kaiwudb.app.entity  # 对应实体类路径mapper-locations: classpath:mapper/*.xml   # 对应 mapper 映射 xml 文件

数据库配置

KWDB 支持使用其提供的客户端命令行工具和图形化工具 KaiwuDB Developer Center(KDC),对 KaiwuDB 进行操作,这里我们使用 KaiwuDB 客户端命令行工具,在 KaiwuDB 数据库中创建关系数据库和关系表,如下:

创建一个关系数据库

create database kwdb_app;

在这里插入图片描述

创建一个用于存储传感器数据的关系表

CREATE TABLE IF NOT EXISTS kwdb_app.sensor_data (id SERIAL PRIMARY KEY,sensor_id VARCHAR(20) NOT NULL,temperature DOUBLE,humidity DOUBLE,pressure DOUBLE,distance INT,description VARCHAR(255),is_active BOOLEAN DEFAULT true,raw_data BYTEA,record_time TIMESTAMP DEFAULT NOW(),del_flag CHAR(1)
);

应用示例

以物联网中常用传感器设备为例,本文以下示例将展示如何通过编写 SpringBoot+MyBatis Plus 应用程序,来实现对传感器设备数据进行增、删、改、查等,从而实现对 KaiwuDB 数据库中的数据进行 CRUD 访问操作。

1. 实体类

创建一个记录传感器数据的实体类 SensorData,需加入 @Data 和 @TableName 注解,使用 @Data 注解可以自动为实体类的字段生成 getter、setter、equals、canEqual、hashCode 和 toString 方法;使用 @TableName 注解用于指定实体类对应的数据表名称;

package com.kaiwudb.app.entity;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.time.LocalDateTime;@Data
@TableName("sensor_data")
public class SensorData {private Long id;                  // 主键,自动增长的唯一标识符@TableField("sensor_id")private String sensorId;          // 传感器的唯一标识符private Double temperature;       // 传感器读取的温度数据private Double humidity;          // 传感器读取的湿度数据private Double pressure;          // 传感器读取的压力数据private Integer distance;         // 传感器距离private String description;       // 传感器的详细描述信息@TableField("is_active")private Boolean active;           // 表示传感器是否处于活动状态@TableField("raw_data")private byte[] rawData;           // 存储传感器数据的原始字节@TableField("record_time")private LocalDateTime recordTime; // 记录数据插入的时间戳@TableField("del_flag")private String delFlag;           // 传感器是否删除标志位,0-未删除,1-已删除
}

结果如下:
在这里插入图片描述

2. Mapper 接口

在 mapper 文件夹下创建 Mapper 接口 SensorDataMapper,继承 BaseMapper 接口,并使用 @Mapper 和 @Repository 注解,无需再手动实现基本的 CRUD 方法,MyBatis Plus 会自动生成;BaseMapper 是 MyBatis Plus 提供的一个接口,用于快速实现常见的数据库操作,如插入、更新、删除和查询等。

package com.kaiwudb.app.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.kaiwudb.app.entity.SensorData;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;@Mapper
@Repository
public interface SensorDataMapper extends BaseMapper<SensorData> {// 自定义 SQL 方法
}

结果如下:
在这里插入图片描述

• 新增 mapper.xml(可选)

在 SensorDataMapper 接口类中支持用户自定义 SQL 方法,比如自定义按照 record_time 查询数据的接口;在 mapper 文件夹下的 SensorDataMapper 接口类新增内容如下:

List<SensorData> selectListBetweenTime(@Param("beginTime") LocalDateTime beginTime,@Param("endTime") LocalDateTime endTime);

结果如下:
在这里插入图片描述

然后在 resources 资源目录下新建 mapper 文件夹,并新建 SensorDataMapper.xml 文件,在其中添加以下 SQL 内容:

• 注:select 标签中 id 为 selectListBetweenTime 的 SQL 语法,对应 mapper 中 selectListBetweenTime 接口;

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kaiwudb.app.mapper.SensorDataMapper"><select id="selectListBetweenTime" resultType="com.kaiwudb.app.entity.SensorData">SELECT *FROM sensor_dataWHERE record_time BETWEEN #{beginTime} AND #{endTime}</select>
</mapper>

3. Service 服务

在 service 文件夹下创建 SensorDataService 接口服务类和其对应的实现类 SensorDataServiceImpl,并使用定义的 SensorDataMapper 数据访问接口类进行数据库操作;本文定义了如下示例接口,分别表示对传感器数据的增、改、删、查等,其中数据查询接口扩展了几种不同的查询方式,包括:按 ID 查询、按 sensorId 查询、按时间范围查询 和 查询全部数据 等;

(1)SensorDataService 接口服务类

package com.kaiwudb.app.service;import com.kaiwudb.app.entity.SensorData;import java.util.List;public interface SensorDataService {int insertSensorData(SensorData data);int updateSensorData(SensorData data);int deleteById(Long id);SensorData findById(Long id);List<SensorData> findBySensorId(String sensorId);List<SensorData> findByRecordTime(String beginTime, String endTime);List<SensorData> findAll();
}

结果展示:

在这里插入图片描述

(2)SensorDataServiceImpl 接口服务实现类,其通过加载并调用 SensorDataMapper 接口类的方法,对数据库数据进行操作访问;
package com.kaiwudb.app.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.kaiwudb.app.entity.SensorData;
import com.kaiwudb.app.mapper.SensorDataMapper;
import com.kaiwudb.app.service.SensorDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;@Service
public class SensorDataServiceImpl implements SensorDataService {@Autowiredprivate SensorDataMapper sensorDataMapper;@Overridepublic int insertSensorData(SensorData data) {return sensorDataMapper.insert(data);}@Overridepublic int updateSensorData(SensorData data) {return sensorDataMapper.updateById(data);}@Overridepublic int deleteById(Long id) {return sensorDataMapper.deleteById(id);}@Overridepublic SensorData findById(Long id) {return sensorDataMapper.selectById(id);}@Overridepublic List<SensorData> findBySensorId(String sensorId) {return sensorDataMapper.selectList(new QueryWrapper<SensorData>().eq("sensor_id", sensorId));}@Overridepublic List<SensorData> findByRecordTime(String beginTime, String endTime) {LocalDateTime beginDateTime = LocalDateTime.parse(beginTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));LocalDateTime endDateTime = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));return sensorDataMapper.selectListBetweenTime(beginDateTime, endDateTime);}@Overridepublic List<SensorData> findAll() {return sensorDataMapper.selectList(null);}
}

结果如下:

在这里插入图片描述

4.Controller 控制

在 controller 文件夹下创建一个 SensorDataController 控制器来处理 HTTP 请求,以下是操作请求传感器数据的示例实现,包括对传感器数据的增、改、删、查等操作;

package com.kaiwudb.app.controller;import com.kaiwudb.app.entity.SensorData;
import com.kaiwudb.app.service.SensorDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.DeleteMapping;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/sensor-data")
public class SensorDataController {@Autowiredprivate SensorDataService sensorDataService;@PostMapping("/add")public int addSensorData(@RequestBody SensorData data) {return sensorDataService.insertSensorData(data);}@PutMapping("/update")public int updateSensorData(@RequestBody SensorData data) {return sensorDataService.updateSensorData(data);}@DeleteMapping("/{id}")public int deleteSensorDataById(@PathVariable Long id) {return sensorDataService.deleteById(id);}@GetMapping("/{id}")public SensorData getSensorDataById(@PathVariable Long id) {return sensorDataService.findById(id);}@GetMapping("/by-sensor-id/{sensorId}")public List<SensorData> getSensorDataBySensorId(@PathVariable String sensorId) {return sensorDataService.findBySensorId(sensorId);}@GetMapping("/by-timestamp")public List<SensorData> getSensorDataByRecordTime(@RequestParam("beginTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS") String beginTime,@RequestParam("endTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS") String endTime) {return sensorDataService.findByRecordTime(beginTime, endTime);}@GetMapping("/all")public List<SensorData> getAllSensorData() {return sensorDataService.findAll();}
}

结果如下:
在这里插入图片描述

5. 主程序加注解

在新建 Spring Boot 应用项目的时,其会自动创建应用项目初始化运行的主类,通常放置在包的根目录下;本文中创建的主程序类文件名为 KaiwudbAppApplication,其会通过 public static void main(String[] args) 方法启动应用程序;本文需要在主程序中增加运行时需加载的配置类注解等,具体内容如下:

package com.kaiwudb.app;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = "com.kaiwudb.app")
public class KaiwudbAppApplication {public static void main(String[] args) {SpringApplication.run(KaiwudbAppApplication.class, args);}
}

结果如下:
在这里插入图片描述

• @SpringBootApplication 注解: Spring Boot 的核心注解,通常放在主类上,它整合了多个注解:@Configuration、@EnableAutoConfiguration 和 @ComponentScan。

a. @Configuration:用于定义配置类,可以包含@Bean方法来声明Bean;

b. @EnableAutoConfiguration:使得Spring Boot能够根据类路径下的jar包、类、和各种属性设置来自动配置 Spring 应用程序;

c. @ComponentScan:默认扫描该类所在包及其子包下的所有组件类(包括 @Component, @Service, @Repository 等注解标记的类),并注册为 Spring Bean。

• scanBasePackages 参数: 指定了 Spring Boot 应该扫描的基础包路径,确保 Spring Boot 能够扫描到应用程序的所有组件类非常重要,包括控制器、服务、存储库等。

6. 启动应用程序

在 IDEA 中启动应用程序时,先找到类名为 KaiwudbAppApplication 的主程序,然后点击右键,在其中找到 Run ‘KaiwudbAppApplication’ 选项并选中来启动应用程序如下图所示:

在这里插入图片描述

启动成功后,在 IDEA 控制台中显示结果如下:
在这里插入图片描述

7. 访问操作示例

以下内容是在启动上述应用程序后,通过 Postman 工具以 Http 请求的方式来访问调用接口,从而通过每个接口实现的功能,来对 KaiwuDB 数据库中的数据进行操作使用等,示例如下:

• 增加数据(显示成功插入 1 条数据)
在这里插入图片描述

• 修改数据(显示成功修改 1 条数据)
在这里插入图片描述

• 删除数据(显示成功删除 1 条数据)

在这里插入图片描述

• 按 sensorId 查询数据(显示全部 sensorId 为 sensor002 的数据)
在这里插入图片描述

• 按时间范围查询(显示全部在查询时间范围内的数据)
在这里插入图片描述

总结

本文详细介绍了如何在 IDEA 中使用 Maven 管理的 Spring Boot 项目整合 KaiwuDB 数据库,并结合 MyBatis Plus 实现 JDBC 数据访问的过程。以下是关键点和总结:

• 技术选型和环境搭建:使用 OpenJDK 1.8、Apache Maven 3.6.3、Spring Boot 2.7.18 和 MyBatis Plus 3.5.5 版本;通过 IDEA 创建基于 Maven 的 Spring Boot 项目,并配置 Java 8 作为开发环境。

• MyBatis Plus 和 KaiwuDB 的集成:引入 MyBatis Plus 依赖,配置 Mapper 扫描路径和全局参数;KaiwuDB 的 JDBC 驱动需要手动安装到本地 Maven 仓库中,以便项目能够操作使用 KaiwuDB 数据库。

• 应用配置:数据源配置和 MyBatis Plus 配置是整合过程中的关键步骤,需要在 Spring Boot 的配置文件 application.yml 中进行配置,包括数据源的连接信息和 MyBatis Plus 的特定配置项。

• 数据库操作示例:创建 SensorData 实体类和 SensorDataMapper 接口,利用 MyBatis Plus 的 BaseMapper 接口快速实现常见的数据库操作;编写 SensorDataService 服务类来实现业务逻辑,通过 SensorDataMapper 进行数据库操作,例如增、删、改、查等。

• Controller 层和应用启动:编写 SensorDataController 来处理 HTTP 请求,定义接口访问路径,并通过 Service 层实现对数据库的操作;主程序类 KaiwudbAppApplication 通过 Spring Boot 的注解来配置和启动应用程序。

• 访问操作示例:使用 Postman 等工具通过 HTTP 请求访问 SensorDataController 定义的接口,从而操作和验证对 KaiwuDB 数据库中数据的增、删、改、查功能。

综上所述,本文通过详细的步骤和示例,展示了如何利用 Spring Boot、MyBatis Plus 和 KWDB 进行应用项目的开发,提供了整合过程中的关键点和可能的扩展方向。读者可以通过本文学习到如何搭建和配置环境、实现数据访问层的开发,以及如何利用 Spring Boot 快速开发和集成 KaiwuDB 数据库。

参考资料

本文 MyBatis Plus 插件的使用,参考了官网提供的使用说明文档,如有其他需要请参考官网文档>>https://baomidou.com/getting-started/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java锁等待唤醒机制

在 Java 并发编程中&#xff0c;锁的等待和唤醒机制至关重要&#xff0c;通常使用 wait()、notify() 和 notifyAll() 来实现线程间的协调。本文将详细介绍这些方法的用法&#xff0c;并通过示例代码加以说明。 1. wait()、notify() 与 notifyAll() 在 Java 中&#xff0c;Obj…

 UNIX网络编程笔记:TCP客户/服务器程序示例

服务器实例 有个著名的项目&#xff0c;tiny web&#xff0c;本项目将其改到windows下&#xff0c;并使用RAII重构&#xff0c;编写过程中对于内存泄漏确实很头疼&#xff0c;还没写完&#xff0c;后面会继续更&#xff1a; #include <iostream> #include <vector&g…

AI Agent开发大全第四课-提示语工程:从简单命令到AI对话的“魔法”公式

什么是提示语工程&#xff1f;一个让AI“听话”的秘密 如果你曾经尝试过用ChatGPT或者其他大语言模型完成任务&#xff0c;那么你一定遇到过这样的情况&#xff1a;明明你的问题是清晰的&#xff0c;但答案却离题万里&#xff1b;或者你认为自己提供的信息足够详尽&#xff0c…

系统架构设计知识体系总结

1.技术选型 1.什么是技术选型&#xff1f; 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…

基于3DMax与Vray引擎的轻量级室内场景渲染实践

欢迎踏入3DMAX室内渲染的沉浸式学习之旅!在这个精心设计的实战教程中,我们将携手揭开3DMAX与Vray这对黄金搭档在打造现实室内场景时的核心奥秘。无论您是渴望入门的3D新手,还是追求极致效果的专业设计师,这里都将为您呈现从场景蓝图构建到光影魔法施加的完整技术图谱。我们…

逻辑卷,vdo,(阿里加速器)

一、逻辑卷 10 20 30 1.逻辑卷的2个特点 &#xff08;1&#xff09;逻辑卷可以将多个分区或者磁盘整合成一个更大的逻辑磁盘&#xff0c;然后可以从逻辑磁盘上划分出分区&#xff08;逻辑磁盘的大小等于整合的物理磁盘大小之和。&#xff09; &#xff08;2&#xff09;能…

检索增强生成(2)本地PDF 本地嵌入模型

from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在&#xff01;")loader PyPDFLoader(file_path)try:do…

安全守护:反光衣检测技术的革新之路

视觉分析助力船上工人反光衣检测 在现代工业生产与作业环境中&#xff0c;安全始终是首要考虑的因素。对于水上作业&#xff0c;如船舶维护、海上施工等场景&#xff0c;工人穿戴反光衣是预防事故、提高可见性的重要措施。然而&#xff0c;传统的人工检查方式不仅效率低下&…

【Scrapy】Scrapy教程8——处理子链接

通过前面几篇文章,已经了解了如何去爬取网页内容并存储到数据库,但是目前只是存储了一个页面的内容,现在想要获取每篇文章链接内的文章内容,我们来看看怎么获取。 生成新请求 首先我们肯定要先拿到链接,所以第一步都获取文章标题和链接肯定少不了,然后再爬取获取到到子…

Centos6配置yum源

Centos6配置yum源 为Centos6配置CentOS Vault源—防止yum源过期为Centos6配置epel源为Centos6配置ELRepo源---已ELRepo被官方清空Centos6安装dockerdocker配置国内镜像加速 为Centos6配置CentOS Vault源—防止yum源过期 参考&#xff1a;https://mirrors.ustc.edu.cn/help/cen…

“智改数转”新风口,物联网如何重构制造业竞争力?

一、政策背景 为深化制造业智能化改造、数字化转型、网络化联接&#xff0c;江苏省制定了《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划&#xff08;2025&#xff0d;2027年&#xff09;》&#xff0c;提出到2027年&#xff0c;全省制造业企业设备更新、工艺…

制作Oracle11g Docker 镜像

基于Linux系统&#xff0c;宿主主机要设置如下环境变量&#xff0c;oracle为64位版本 dockerfile中需要的数据库安装包可从csdn下载内找到 #!/bin/bash # 在宿主机上运行以设置Oracle所需的内核参数 # 这些命令需要root权限cat > /etc/sysctl.d/99-oracle.conf << EO…

从GTC2025首次量子日看英伟达量子AI融合算力网络前景与趋势

GTC2025 Quantum Day 最新内容全部汇总: 技术名称描述合作伙伴/开发者应用场景/目标量子模拟器优化方案NVIDIA与IonQ、D-Wave合作,针对量子模拟器进行性能优化,提升量子计算任务效率。IonQ、D-Wave量子算法开发、复杂系统模拟混合量子-经典计算架构结合量子计算与经典GPU加速…

UE4学习笔记 FPS游戏制作12 添加第二把枪,制作枪的父类,动态生成物体,切换武器

我们添加一个发射器类型的枪 我们目前有了一个Rifle的枪械蓝图&#xff0c;我们在添加Launcher时&#xff0c;需要为他们添加一个父类&#xff0c;将公共方法放到父类里&#xff0c;方法体由子类实现 添加父类 方法1 新建一个Gun的蓝图&#xff0c;Gun继承Actor&#xff0c;…

【原创首发】开源基于AT32 SIP/VOIP电话

前言 本次为了反馈各位粉丝的关注&#xff0c;特此分享 AT32_VOIP 工程&#xff0c;此功能其实跟我之前发过的《STM32F429的VOIP功能》是一样的&#xff0c;只是用了AT32F437。 其实那个工程是一个比较Demo中的Demo&#xff0c;很多功能和硬件依赖性太大了。后面项目中发现AT…

通俗易懂搞懂@RequestParam 和 @RequestBody

&#x1f4cc; 博主简介: &#x1f4bb; 努力学习的 23 级科班生一枚 &#x1f680;&#x1f3e0; 博主主页 &#xff1a; &#x1f4ce; 灰阳阳&#x1f4da; 往期回顾 &#xff1a;Session和Cookie我不允许你不懂&#x1f4ac; 每日一言&#xff1a; 「流水不争先&#xff0c…

dubbo版本与分组

Dubbo服务中&#xff0c;接口并不能唯一确定一个服务&#xff0c;只有 接口分组版本号 的三元组才能唯一确定一个服务。 当同一个接口针对不同的业务场景、不同的使用需求或者不同的功能模块等场景&#xff0c;可使用服务分组来区分不同的实现方式。同时&#xff0c;这些不同实…

RAG现有技术方案

RAG现有技术方案 一、现有技术方案的核心问题 检索质量不足 挑战:传统RAG系统依赖单轮检索,难以应对智能电网的海量异构数据(如传感器读数、控制参数),导致检索结果相关性低、覆盖不全。案例:BM25稀疏检索在处理长文本或专业术语时,易遗漏语义关联;BGE等稠密检索模型对…

redis MISCONF Redis is configured to save RDB snapshots报错解决

直接上解决方案 修改redis配置文件 stop-writes-on-bgsave-error no 重启redis

个人学习编程(3-22) leetcode刷题

连续子数组&#xff1a;&#xff08;难&#xff09; 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 需要理解的知识&a…