在SpringBoot应用中调用数据库操作进行数据查询与存储。
在完成Service层中的业务逻辑梳理后,下一个要考虑的问题是如何对数据库操作,完成相关数据的查询、插入等操作。
在SpringBoot应用中,Dao层负责进行一些数据库操作,例如INSERT、DELETE、UPDATE、SELECT等,完成相关数据表中的增删改查。而Entity层中包含一个个实体类,实体类中的属性便是由程序中需要的各种数据组合而成。在对数据库进行操作时,SQL语句内的参数通常由实体类中的属性替换,因而实体类的一个对象往往就是数据表中的一条记录。
以上篇文章中的场景为例,本文力争用易理解的方式着重讲解Dao层如何完成数据库操作,以及Entity层如何发挥作用。
环境准备 本机部署MySQL 8,在Deepin上折腾许久,利用Debian 10的apt源,终于安装好了。
在MySQL中新建数据库project,随后新建数据表project_information,记录项目信息:
1 2 3 4 5 6 7 8 9 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项目添加依赖与连接信息
1 2 3 implementation 'org.springframework.boot:spring-boot-starter-jdbc:3.1.4' implementation 'com.mysql:mysql-connector-j:8.0.33'
数据连接配置:在 application.properties 中添加如下信息:
1 2 3 4 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用于组织一次操作所包含的数据,类的定义如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import java.sql.Timestamp;public class ProjectInformationEntity { private String operation; private String code; private String name; private String category; private Timestamp operation_time; 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; } 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方法传递相关参数。这样做的好处是易于明确各数据项之间的关系,在实际使用时不会错乱。
在业务逻辑中,可以使用例如下面的函数初始化一个实体类对象:
1 2 3 4 5 6 7 8 9 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方法查询单个数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 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