?
引言
本文主要介紹如何在 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/