banner
月落星河Tsukistar

月落星河Tsukistar

浩瀚中的伟大,孤独间的渺小
github
twitter
youtube
bilibili
email

SpringBoot應用中進行資料庫操作

封面圖片由Mohamed HassanPixabay上發布

在完成 Service 層中的業務邏輯梳理後,下個要考慮的問題是如何對資料庫操作,完成相關資料的查詢、插入等操作。

在 SpringBoot 應用中,Dao 層負責進行一些資料庫操作,例如 INSERT、DELETE、UPDATE、SELECT 等,完成相關資料表中的增刪改查。而 Entity 層中包含一個個實體類,實體類中的屬性便是由程式中需要的各種資料組合而成。在對資料庫進行操作時,SQL 語句內的參數通常由實體類中的屬性替換,因而實體類的一個物件往往就是資料表中的一條記錄。

以上篇文章中的場景為例,本文力爭用易理解的方式著重講解 Dao 層如何完成資料庫操作,以及 Entity 層如何發揮作用。


環境準備#

本機部署 MySQL 8,在 Deepin 上折騰許久,利用 Debian 10 的 apt 源,終於安裝好了。

在 MySQL 中新建資料庫 project,隨後新建資料表 project_information,記錄項目信息:

CREATE TABLE IF NOT EXISTS `project_information`(
   `id` INT UNSIGNED UNIQUE AUTO_INCREMENT COMMENT '操作流水碼',
   `operation` varchar(5) NOT NULL COMMENT '操作類型',
   `code` VARCHAR(5) NOT NULL COMMENT '項目編碼',
   `name` VARCHAR(200) NOT NULL COMMENT '項目名稱',
   `category` VARCHAR(2) NOT NULL COMMENT '項目分類',
   `time` DATETIME NOT NULL COMMENT '操作時間',
   PRIMARY KEY ( `code`,`time` )
)ENGINE=InnoDB;

其中 AUTO_INCREMENT 為自增,NOT NULL 為非空約束,PRIMARY KEY 為主鍵,COMMENT 為註釋


SpringBoot 專案添加依賴與連接信息#

// SpringBoot的MySQL連接器for 8.0.33版本
implementation 'org.springframework.boot:spring-boot-starter-jdbc:3.1.4'
implementation 'com.mysql:mysql-connector-j:8.0.33'
  • 資料連接配置:在 application.properties 中添加如下信息:
spring.datasource.url=jdbc:mysql://localhost:3306/{database name}
spring.datasource.username={user}
spring.datasource.password={password}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

其中 {} 包裹的內容都需要根據個人的實際設置進行替換,由於本人使用的是 MySQL 8.0 以上的版本,最後一行的驅動名需要更換為com.mysql.cj.jdbc.Driver


創建實體類用於存儲操作信息#

由上面創建的資料表可知,一條操作記錄包括操作流水碼、操作名稱、項目編碼、項目名稱、項目分類、操作時間,由於操作流水碼在每次插入資料時是自動自增的,所以實際的操作資料只包括操作名稱、項目編碼、項目名稱、項目分類、操作時間這五項屬性。

我們可以在 Entity 層新建一個項目信息的實體類 ProjectInformationEntity 用於組織一次操作所包含的資料,類的定義如下所示:

import java.sql.Timestamp;

public class ProjectInformationEntity {
    private String operation;
    private String code;
    private String name;
    private String category;
    private Timestamp operation_time;
    
    //get方法
    public String getOperation() {
        return operation;
    }
    public String getCode() {
        return this.code;
    }
    public String getName() {
        return this.name;
    }
    public String getCategory() {
        return this.category;
    }
    public Timestamp getTime() {
        return operation_time;
    }

    //set方法
    public void setOperation(String system_operation) {
        this.operation = system_operation;
    }

    public void setCode(String projectCode) {
        this.code = projectCode;
    }
    public void setName(String projectName) {
        this.name = projectName;
    }
    public void setCategory(String projectCategory) {
        this.category = projectCategory;
    }
    public void setTime(Timestamp operationTime) {
        this.operation_time = operationTime;
    }
}

該類的每個實例化的物件用於存儲操作資料,在實際執行資料庫操作或在業務邏輯中使用操作資料時,可以通過物件的 get 方法傳遞相關參數。這樣做的好處是易於明確各資料項之間的關係,在實際使用時不會錯亂。

在業務邏輯中,可以使用例如下面的函數初始化一個實體類物件:

public ProjectInformationEntity storeProjectInformation(String operation, String code, String name, String category) {
        ProjectInformationEntity entity = new ProjectInformationEntity();
        entity.setOperation(operation);
        entity.setCode(code);
        entity.setName(name);
        entity.setCategory(category);
        entity.setTime(getCurrentTime());
        return entity;
    }

創建資料庫操作#

在 Dao 層中,新建 ProjectInformationDao 類用於進行一些資料庫操作。這個類中主要使用 JdbcTemplate 進行相關操作的實現,通過 update 方法執行例如 INSERT 的 SQL 語句,使用 queryForObject 方法查詢單個資料。

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import studio.tsukistar.demo.Entity.ProjectInformationEntity;

@Repository
public class ProjectInformationDao {
    private final JdbcTemplate jdbcTemplate;

    public ProjectInformationDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void addOperationInformation(ProjectInformationEntity proInfo) { //新增操作記錄
        String sql = "insert into project_information (operation, code, name, category, operation_time) values (?,?,?,?,?)";
        jdbcTemplate.update(sql, proInfo.getOperation(), proInfo.getCode(), proInfo.getName(), proInfo.getCategory(), proInfo.getTime());
    }

    public String selectLatestProjectCode(String category) {
        String code;
        String sql = "select code from project_information where operation = '新建編碼' and category = ? order by id desc limit 1";
        code = jdbcTemplate.queryForObject(sql, new Object[]{category},String.class);
        return code;
    }
}

總結#

這次的階段性成果是在 SpringBoot 應用中調用資料庫操作進行資料查詢與存儲,不過可能使用 JdbcTemplate 確實有些過時,接下來會用更先進的方式進行操作。

在開發過程中,我向 ChatGPT 詢問了大量功能實現相關的問題,並得到了準確可運行的答覆,這某種意義上確實提高了我的效率。感覺 ChatGPT 幾乎成了我的百科全書哈哈哈哈。


參考文章#

mysql 中的 datetime 對應 java:https://juejin.cn/s/mysql%E4%B8%AD%E7%9A%84datetime%E5%AF%B9%E5%BA%94java

spring boot (三) 之 使用 JdbcTemplate 訪問 MySQL 資料庫:https://blog.csdn.net/weixin_45755816/article/details/118762188

Spring boot (四) 之保存資料到資料庫:https://blog.csdn.net/weixin_45755816/article/details/118770441

Java 中使用無符號整型(unsigned int)的使用方法:https://icejoywoo.github.io/2018/08/17/unsigned-number-in-java.html

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。