封面圖片由Mohamed Hassan在Pixabay上發布
在完成 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 專案添加依賴與連接信息#
- 依賴安裝:可以參照上一篇文章在https://mvnrepository.com/ 上尋找自己的包管理器的依賴安裝方法。對於 Gradle 專案,在 build.gradle 的
dependencies{}
中添加如下信息:
// 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