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/
相关文章:
Spring Boot 与 MyBatis Plus 整合 KWDB 实现 JDBC 数据访问
引言 本文主要介绍如何在 IDEA 中搭建一个使用 Maven 管理的 Spring Boot 应用项目工程,并结合在本地搭建的 KWDB 数据库(版本为:2.0.3)来演示 Spring Boot 与 MyBatis Plus 的集成,以及对 KWDB 数据库的数据操作…...
VSCode+arm-none-eabi-gcc交叉编译+CMake构建+OpenOCD(基于STM32的标准库/HAL库)
前言:什么是CMake? Answer:简而言之,CMake是Make的maker。 一、CMake的安装 进入CMake官网的下载地址Get the Software,根据系统安装对应的Binary distributions。 或者在CMake——国内镜像获取二进制镜像安装包。 …...
MarsCode AI实战:利用DeepSeek 快速搭建你的口语学习搭子
资料来源:火山引擎-开发者社区 成品抢先看! 自从MarsCode AI Chat模型全新升级,接入 Deepseek-R1、Deepseek-V3和豆包大模型1.5 三大模型,越来越多朋友注意到了AI编程能给我们带来的无限可能,也开始跃跃欲试想要尝试从…...
导出的使用
一.导出的具体使用步骤 1.在web开发中,导出是很常见的一个功能,当我进行个人项目练习的时候,导出的时候无法控制列宽以及居中样式,后续发现导出插件无法进行修改,整个插件较为简便易懂的同时,对于EX的控制…...
【OCR】总结github上开源 OCR 工具:让文字识别更简单
前言 在数字化的时代,光学字符识别(OCR)技术成为了我们处理文档、图像文字信息的得力助手。它能够将图像中的文字信息转换为可编辑和可处理的文本数据,极大地提高了信息处理的效率。今天,我要给大家介绍一些优秀的开源…...
struts1+struts2项目兼容升级到了spring boot 2.7
原项目比较复杂,集成了各种框架(struts1 struts2 spring3等),趁工作之余练练手,学习一下springboot。大概花了一周时间才调通。 一、调整jar版本,寻找合适的版本。 第一步、首先原项目JDK6,要…...
Odoo 18 中的列表(list) 、表单(Form)、数据透视表、图表视图、看板视图、活动视图、日历视图等综合应用实例
Odoo 18 中的 视图应用实例 在 Odoo 中,视图是用户界面中表示业务对象的重要组成部分。无论您是扩展现有功能还是创建全新的功能,业务对象都至关重要。这些对象通过不同类型的视图向用户展示,而 Odoo 会根据 XML 描述动态生成这些视图。 列…...
单元测试mock
一、背景 现在有A类,B类,C类,A类依赖B类,依赖C类,如果想要测试A类中的某个方法的业务逻辑。A类依赖其他类,则把其他类给mock,然后A类需要真实对象。这样就可以测试A类中的方法。 举例:Ticket类需要调用Flight类和Pas…...
PDF文件转Markdown,基于开源项目marker
首先我们来问下deepseek 为啥要选marker呢 基于深度学习,一看就逼格拉满。搞科研必备,效果应该不会太差。跟其他的阿猫阿狗工具没法比。 看下官网 https://github.com/VikParuchuri/marker 一看头像是个印度佬,自吹——又快又好。…...
mysql中find_in_set()函数用法详解及增强函数
MySQL的 FIND_IN_SET()函数是一种特殊的函数,它主要用于搜索一个字符串在一个逗号分隔的字符串列表中的位置。 函数的基本语法 FIND_IN_SET(str, strlist) 其中,str是你想要查找的字符串,而 strlist是一个包含多个以逗号分隔的字符串的列表…...
深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 ✨
🕹️ 深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 在 JavaScript/TypeScript 开发中,if (!value) 是最常见的条件判断之一。它看似简单,却隐藏着语言的核心设计逻辑,也是许多开发者…...
批量合并 PPT 文件,支持合并成单个文件也支持按文件夹合并
合并多个 PPT 为一个 PPT 文档是我们经常会碰到的需求,合并后不仅更容易管理,在某些场景(比如批量打印)下也非常的有用,那当我们需要批量合并多个 PPT 文档地时候,我们有没有比较高效的方法呢?今…...
Java复习
在开篇前首先申明一下,本文虽不够系统,但复习够用,尤其是快速回忆( •̀ ω •́ )✧与提问。 主打一个速度。 本文将会从Java的基础语法、面向对象、API、字符串、集合、进阶...等六方面讲起。 一、Java的基础语法: 1、Java入门…...
keepalived+nginx+tomcat高可用
1.要求 角色主机名软件IP地址用户client192.168.72.90keepalivedvip192.168.72.100mastermasterkeepalived, nginx192.168.72.30backupbackupkeepalived, nginx192.168.72.32webtomcat1tomcat192.168.72.41webtomcat2tomcat192.168.72.42 1.搭建Tomcat 1.1下载jdk wget http…...
RK3568 Android11 sh366006驱动
sh366006.c /* 谁愿压抑心中怒愤冲动咒骂这虚与伪与假从没信要屈膝面对生命纵没有别人帮一生只靠我双手让我放声疯狂叫囔今天的他 呼风可改雨不可一世太嚣张 --《不可一世》Beyond */ #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h…...
实现分布式锁需要考虑哪些问题?
🔒 什么是分布式锁? 分布式锁是在分布式系统中控制共享资源访问的机制,用于解决高并发场景下数据不一致、操作冲突等问题。核心目标是保证跨进程 / 跨节点的互斥性,常见实现方案包括:数据库锁、Redis 锁、ZooKeeper 锁…...
【UI设计】一些好用的免费图标素材网站
阿里巴巴矢量图标库https://www.iconfont.cn/国内最大的矢量图标库之一,拥有 800 万 图标资源。特色功能包括团队协作、多端适配、定制化编辑等,适合企业级项目、电商设计、中文产品开发等场景。IconParkhttps://iconpark.oceanengine.com/home字节跳动…...
mysql-大批量插入数据的三种方式和使用场景
1.批量插入三种方式 INSERT INTO … SELECTINSERT INTO … VALUES (…)LOAD DATA INFILE ‘/path/to/datafile.csv’ INTO TABLE table_name 2.批量插入 2.1 INSERT INTO … SELECT 用途:从另一个表中选择数据并插入到目标表中。 语法示例: INSERT …...
创建自己的github.io
1、创建GitHub账号 GitHub地址:https://github.com/ 点击Sign up创建账号 如果已创建,点击Sign in登录 2、创建仓库 假设Owner为username,则Repository name为username.github.io说明: 1、Owner为用户名 2、Repository name为仓…...
Oracle 常用语法汇总
系列文章目录 本文对Oracle 常用的语法进行汇总 文章目录 系列文章目录一、Oracle 表&表字段操作:1.1 DDL语句(数据定义语言)Create、Alter、Drop、Truncate:1.1.1 建表:建表:注释COMMENT :表中字段的约束:表中字…...
java小白日记38(集合-List)
List接口基本介绍 List接口是collection接口的子接口 (1)List集合类中元素有序(即添加顺序和取出顺序一致)、且可以重复 (2)List集合中的每个元素都有其对应的顺序索引,即支持索引 …...
高能ISP模块功能说明
先看一些常见缩写: BPS:Bayer processing segment CPP:Camera post processor DE:Detailed enhancement EIS:Electronic image stabilization IFE:Image front-end engine IPE:Image-proc…...
单臂路由实验
单臂路由实验 文章目录 单臂路由实验单臂路由简介工作原理优点与缺点应用场景 实验拓扑实验需求:实验步骤:1.PC 配置 IP 地址2.PC3 属于 Vlan10,PC4 属于 Vlan20,配置单臂路由实现 Vlan10 和 Vlan20 三层互通2.1.在 SW2 上创建 Vl…...
SpringMVC全局异常处理机制
异常处理机制 异常处理的两种方式: 编程式异常处理:是指在代码中显式地编写处理异常的逻辑。它通常涉及到对异常类型的检测及其处理,例如使用 try-catch 块来捕获异常,然后在 catch 块中编写特定的处理代码,或者在 f…...
UDS诊断、ECU刷写、自动化测试、车联网测试、DTC故障注入测试、坏境测试、可靠性测试、压力测试、性能测试等
每日直播时间:(直播方式:腾讯会议) 周一到周五:20:00-23:00 周六与周日:9:00-17:00 向进腾讯会议学习的,可以关注我并后台留言 直播内容ÿ…...
C++的常用容器嵌套
在 C 中,数据结构之间的嵌套是非常常见的,尤其是在处理复杂数据时。以下是几种最常用的数据结构嵌套方式及其典型应用场景的总结: 1. std::vector 嵌套 std::vector 定义:std::vector<std::vector<T>>。用途…...
Mac - Cursor 配置 + GPT 4.0/4.5/o1/o3/Deepseek Api 使用
前言 新换了电脑,所以需要新配置一些环境。已经安装好了Goland,但近期可能有GoJava前端的需求,所以使用Cursor。 除去学校各种奇奇怪怪,这已经是一年多来配置的第4台Windows和第四台Mac的Golang环境了。。。且是自己工作外买的第…...
【数据挖掘】Python基础环境安装配置
【数据挖掘】Python基础环境安装配置 一、摘要二、安装Python3.13.2三、安装Jupyter Notebook四、安装Numpy和Pandas以及matplotlib五、安装scikit-learn库和seaborn库 一、摘要 本文主要介绍如何在Windows上安装Python3.13.2,然后基于该Python版本安装Jupyter not…...
详解string类+迭代器
迭代器 概念:在 C 中,迭代器是访问容器(如数组、列表、向量、字符串等)元素的一种方式。迭代器提供了一种统一的接口,使得你可以使用相同的代码来遍历不同类型的容器。迭代器本质上是一个指针或者指针的封装࿰…...
OpenCV DNN 模块使用指南
OpenCV DNN 模块使用指南 一、模块概述 OpenCV 的 DNN(深度神经网络)模块为开发者提供了强大的深度学习功能,能够加载并运行多种格式的预训练深度学习模型。此模块广泛应用于图像分类、目标检测、语义分割等众多计算机视觉任务。接下来&…...
温度(Temperature)在大模型输出中的作用与底层原理
温度(Temperature)在大模型输出中的作用与底层原理 在深度学习领域,尤其是自然语言处理(NLP)中,大型语言模型(LLM)的输出生成通常依赖于概率分布的采样。温度(temperatu…...
智能汽车图像及视频处理方案,支持视频智能拍摄能力
美摄科技,作为智能汽车图像及视频处理领域的先行者,凭借其卓越的技术实力和前瞻性的设计理念,为全球智能汽车制造商带来了一场视觉盛宴的革新。我们自豪地推出——美摄科技智能汽车图像及视频处理方案,一个集高效性、智能化、画质…...
一文讲清 C++ CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)
CRTP是 C 中的一种模板元编程技术,其核心原理是通过模板继承和静态多态,在编译期实现基类对派生类成员的访问,从而避免运行时虚函数调用的开销。 1. CRTP 的基本结构 CRTP 的核心思想是:基类是一个模板类,其模板参数…...
如何用Function Calling解锁OpenAI的「真实世界」交互能力?(附Node.js 实战)
一、Function Calling:大模型的「手脚延伸器」 1.1 核心定义 Function Calling是OpenAI在2023年6月13日推出的革命性功能(对应模型版本gpt-3.5-turbo-0613和gpt-4-0613),允许开发者通过自然语言指令触发预定义函数,实…...
MySQL:float,decimal(1)
会四舍五入 无符号浮点数 更改321zyy1下的salary 为float类型 decimal:...
基于DrissionPage的DY无水印视频采集
基于DrissionPage的Dy无水印视频采集技术解析 目录 一、项目背景与痛点分析 1.1 典型应用场景1.2 传统方案痛点对比1.3 需求分析流程图二、系统架构设计 2.1 核心架构图2.2 执行流程图解三、开发环境配置 3.1 版本要求3.2 环境搭建指南四、实现流程详解 4.1 主要处理阶段4.2 关…...
yt-dlp工具下载视频使用方法
使用 yt-dlp 下载有土播视频时,可以很容易地同时下载字幕文件。 下面是详细操作说明: 一、下载视频并同时下载字幕: 基础命令: yt-dlp --write-subs 视频链接示例: yt-dlp --write-subs https://www.youdubo.com/wa…...
canvas数据标注功能简单实现:矩形、圆形
背景说明 基于UI同学的设计,在市面上找不到刚刚好的数据标注工具,遂决定自行开发。目前需求是实现图片的矩形、圆形标注,并获取标注的坐标信息,使用canvas可以比较方便的实现该功能。 主要功能 选中图形,进行拖动 使…...
Linux与HTTP报头属性和请求方式
HTTP报头属性、请求方式 本篇介绍 在上一节深入HTTP序列化和反序列化已经详细讲解了HTTP是如何进行序列化和反序列化的,但是上一节对请求报头和响应报头的具体内容并没有做出具体的说明,本节就会基于这个问题继续探讨HttpServer;另外在介绍…...
WordPress漏洞
一,后台修改模板拿WebShell 1,安装好靶场后访问 2,在如图所示的位置选择一个php文件写入一句话木马,我们这里选择在404.php中写入 3,访问404.php 二,上传主题拿WebShell 1,找到如图所示的页面…...
go命令使用
查看配置信息 go env配置go国内源 export GO111MODULEon export GOPROXYhttps://goproxy.cn测试 go install github.com/jesseduffield/lazydockerlatesthttps://github.com/jesseduffield/lazydocker...
uniapp vue3使用uniapp的生命周期
使用uniapp的onLoad等生命周期 // 需要引入 import { onLoad , onShow } from dcloudio/uni-app; // 箭头函数 onLoad(()>{//内容 })使用vue生命周期 vue官方文档:https://cn.vuejs.org/api/options-lifecycle.html import { ref,onMounted } from vue; onMou…...
nginx vue history模式 try_files
server {listen 80;server_name localhost chat.test.com;#配置根目录location / {root /temp/test;#index index.html index.htm;try_files $uri $uri/ /index.html;add_header Content-Security-Policy upgrade-insecure-requests;}} https://blog.csdn.net/xutongbao/…...
【css酷炫效果】纯CSS实现悬浮弹性按钮
【css酷炫效果】纯CSS实现悬浮弹性按钮 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492020 缘 创作随缘,不定时更新。 创作背景 刚看到csdn出活动了&…...
MySQL自动化配置工具开发:探索如何用脚本实现MySQL一键安装与配置,提升运维效率
引言 MySQL作为最流行的开源关系型数据库之一,广泛应用于各类业务场景。然而,手动安装和配置MySQL不仅耗时,还容易出错。为了提高运维效率,开发一款MySQL自动化配置工具显得尤为重要。本文将探索如何通过脚本实现MySQL的一键安装与配置,并提供具体的配置脚本文档和关键参…...
如何查看安卓版本号的方法(例如查看是13、12、11、10...)
开发过程中需要了解到安卓版本号是多少,那么以下有三种方法可以知晓安卓手机的Android版本号。 方法1:手机设置直接查看 1.打开【设置】 --> 滑动到手机最底部 --> 点击【关于手机】或 【系统】--> 选择【Android版本】 2.直接查看版本号&am…...
ubuntu 解挂载时提示 “umount: /home/xx/Applications/yy: target is busy.”
问题如题所示,我挂载一个squanfs文件系统到指定目录,当我使用完后,准备解挂载时,提示umount: /home/xx/Applications/yy: target is busy.,具体的如图所示, 这种提示通常是表明这个路径的内容正在被某些进…...
Java XML与JSON相互转换详解
目录 一、为什么需要XML与JSON转换二、使用Jackson库进行转换1. 添加依赖2. XML转JSON3. JSON转XML三、注意事项在现代软件开发中,数据格式的转换是一项常见的任务,特别是在处理不同系统或服务之间的数据交换时。XML(可扩展标记语言)和JSON(JavaScript对象表示法)是两种广…...
[AI速读]用持续集成(CI)优化芯片验证环境:Jenkins与EDA工具的实战指南
在芯片验证中,回归测试(Regression Test)是确保设计稳定性的关键步骤。但随着设计复杂度增加,手动管理海量测试用例、分析日志和覆盖率数据变得异常耗时。本文将介绍如何利用持续集成(CI)工具Jenkins,结合EDA验证环境(如Cadence vManager),实现自动化测试与结果分析,…...
Java-SpringBootWeb入门、Spring官方脚手架连接不上解决方法
一. Spring 官网:Spring | Home Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能(Spring全家桶) Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率 。 二. Spring Boot入…...