SpringBoot应用中进行数据库操作

封面图片由Mohamed Hassan在Pixabay上发布

在完成 Service 层中的业务逻辑梳理后，下一个要考虑的问题是如何对数据库操作，完成相关数据的查询、插入等操作。

在 SpringBoot 应用中，Dao 层负责进行一些数据库操作，例如 INSERT、DELETE、UPDATE、SELECT 等，完成相关数据表中的增删改查。而 Entity 层中包含一个个实体类，实体类中的属性便是由程序中需要的各种数据组合而成。在对数据库进行操作时，SQL 语句内的参数通常由实体类中的属性替换，因而实体类的一个对象往往就是数据表中的一条记录。

以上篇文章中的场景为例，本文力争用易理解的方式着重讲解 Dao 层如何完成数据库操作，以及 Entity 层如何发挥作用。

环境准备

本机部署 MySQL 8，在 Deepin 上折腾许久，利用 Debian 10 的 apt 源，终于安装好了。

在 MySQL 中新建数据库 project，随后新建数据表 project_information，记录项目信息：

Copy
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{} 中添加如下信息：

Copy
// 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 中添加如下信息：

Copy
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 用于组织一次操作所包含的数据，类的定义如下所示：

Copy
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 方法传递相关参数。这样做的好处是易于明确各数据项之间的关系，在实际使用时不会错乱。

在业务逻辑中，可以使用例如下面的函数初始化一个实体类对象：

Copy
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 方法查询单个数据。

Copy
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