开发环境
-
JDK:Java 1.8
-
技术栈:SpringBoot 2.13
-
数据库: MySQL 8
-
IDE:JetBrains Intelij IDEA
实现功能
完成对学生信息的管理功能:增加,删除,修改,查找(本演示项目目的是为了入门SpringBoot,所以不会花费时间在前端界面上,所以开发出程序为api接口,使用 postman 可以很方便的发送各种请求到一些接口来验证程序的正确性)
建立工程
图文教程请移步:Spring Boot入门项目一:使用Intelij Idea创建一个Spring Boot工程
开发过程
-
确定系统功能
-
完善开发环境
本项目使用了Hibernate,需要添加依赖到pom文件中,打开按照上面链接创建的工程,在pom.xml 文件中添加如下信息到 <dependencies></dependencies>中:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
-
数据库环境初始化
初始化一个数据库,用来存储学生的信息,这里使用的是MySQL 8 的版本,建立的过程如下所示:(我使用的是Navicat连接工具,其他的也可以)
-
在连接的数据库上右键选择新建数据库:
-
填入以下信息来创建一个空的数据库:
-
创建数据表 student
这里使用Spring Boot 中的数据库实体来创建。
打开项目 resources 文件夹下的 application.properties 文件,写入如下信息
#这里是项目的配置文件 # 设置项目运行的端口: server.port=8080 # 这里是数据库连接驱动的设置,设置了一些连接参数来使连接有效。 # 数据库的连接驱动 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 连接数据库的地址,注意,我这里数据库的端口是3308,我自己配置的,默认情况下是3306端口,请根据自己的情况修改 spring.datasource.url=jdbc:mysql://127.0.0.1:3308/dbgirl?serverTimezone=UTC&useSSL=false # 连接的账号和密码,也要根据自己情况去修改。 spring.datasource.username=root spring.datasource.password=root # 这里配置的是hibernate 框架的信息,数据库的访问使用了 hibernate 框架。 # 这里是数据库的连接类型信息,选择的是mysql 数据库。 spring.jpa.database=mysql # 这里的参数有五种,常用的就是 create 和 update ,区别在于create 在每一次启动应用的时候都会重新创建数据库,并把之前的数据全部删掉,而update 则是采用增量的方式来进行创建,只更新修改的了部分,保留未修改部分的数据 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
为了进一步的专注于Spring Boot 的入门知识,这里不采用 规范的分层模型,只实现所有的功能,至于分层 ,后面有机会会进行讲解。
首先创建一个类,名称为 StudentForm,作为一个数据库中数据表的映射,描述数据表的信息
StudentForm 代码如下:
package com.example.demo; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.validation.constraints.NotEmpty; @Entity public class StudentForm { @Id @GeneratedValue private Integer id; @NotEmpty private String account; private String password; private String name; private Integer age; public StudentForm() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "StudentForm{" + "id=" + id + ", account='" + account + '\'' + ", password='" + password + '\'' + ", name='" + name + '\'' + ", age=" + age + '}'; } }
保存之后启动程序,启动成功的话会发现在数据库中已经创建好了一个数据表 student_form 表:
至此数据库环境初始化的工作就完成了。
-
-
数据库接口定义
数据库接口的编写是为了为应用程序提供一系列查询,修改,增加,删除的功能,其他类可以调用方法来操作数据库。由于使用了 Hibernate 框架,所以这一工作变得非常简单:新建一个数据库接口类:DBUtils,代码如下:
package com.example.demo; import org.springframework.data.jpa.repository.JpaRepository; public interface DBUtils extends JpaRepository { public StudentForm findByAccount(String account); }
-
业务逻辑编写
初始化了数据库环境,定义了数据库访问接口,下面就是业务逻辑的编写了,还记得任务么:实现增删查改,接下来就编写这些业务功能代码:
首先创建一个类专门用于这些业务逻辑的实现,创建一个 StudentController 类。代码如下:(这段代码只定义了格式,没有实现功能,后面后实现,实际上具体的项目中也是先定义好这些然后再进行开发的,按照这个流程来开发比较清楚。)package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; @RestController public class StudentController { @Autowired private DBUtils dbUtils; /** * 获得所有的学生的api 接口: * @return 返回结果列表 */ @GetMapping(value = "/students") public List getStudentForms(){ return null; } /** * 根据 account 来获得 一个学生的信息: * @param account 学号信息 * @return 返回查询的结果; */ @GetMapping(value = "/students/{account}") public StudentForm getStudentFormById(@PathVariable("account") Integer account){ return null; } /** * 增加一个新的学生信息到数据库: * @param studentForm 前端传过来的参数 * @param bindingResult 可以理解为异常捕获类 * @return */ @PostMapping(value = "/students/add") public Object addStudentForm(@Valid StudentForm studentForm, BindingResult bindingResult){ } @PostMapping(value = "/students/update") public StudentForm updateStudentFormById(){ return null; } /** * 删除指定ID的学生信息 * @param id * @return */ @PostMapping(value ="/students/delete") public String deleteById(@RequestParam(value = "id") Integer id){ return null; } }
到了这里大家可能会有疑问,因为出现了很多之前没见过的东西,那就是 @+[一个名称] ,这个就是一个注解,关于注解是什么,其实就是类似于spring 项目中的XML配置文件,只不过使用注解的方式更加的简单,不用配置一大堆XML文件,很方便,在这里简单的说一下之前代码中出现的注解的意思,更多注解的信息我后续会出文章继续讲解:
注解 使用方法 @Entity 一个数据库实体注解,有这个注解的类代表和数据库中的某一个表相对应,这个类中的所有属性就是数据表中的所有字段,都是一一对应的,此外这个注解经常和@Table(name=“数据表名称”) 来一起使用,如果数据表名称和这个类的名称一致的话,那就可以省略@Table(name=“数据表名称”) 的注解 @Id 表示该属性为主键,数据表的主键就是可以唯一标识数据表中一行书库的一个属性组。 @GeneratedValue 表示该属性是一个自增属性,在插入的时候自动怎家,通常是 Integer 类型 @NotEmpty 表示这个属性不可以为空,这是数据库字段的约束,此外还有很多约束,后面会出文章讲解 @RestController @RestController 是一个结合了 @ResponseBody 和 @Controller 的注解,@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上@Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。 @Autowired 注解在类上,表示这是一个控制层bean @GetMapping GetMapping(value=“url地址”) 指定url 地址,添加一个get请求方法,这样就可以用注解的方法来实现get请求的监听了 @PostMapping 和GetMapping 类似,就是监听的是一个Post 请求 @RequestParam 请求的参数,从前端传过来的参数,可以通过这个来获取 @PathVariable 类似于RequestParam,只不过请求的URL稍有不同,可以看例子使用 @Valid 这是一个校验的注解,在数据库实体类上定义的约束会会进行校验,不合格会返回一定的提示信息,保证数据库的完整性。 -
具体功能实现
-
添加一个学生的信息到数据库
代码实现:
/** * 增加一个新的学生信息到数据库: * @param studentForm 前端传过来的参数 * @param bindingResult 可以理解为异常捕获类 * @return */ @PostMapping(value = "/students/add") public Object addStudentForm(@Valid StudentForm studentForm, BindingResult bindingResult){ if(bindingResult.hasErrors()){ System.out.println(bindingResult.getFieldError().getDefaultMessage()); return "不符合条件,插入失败,请检查是不是有正确的请求参数"; } dbUtils.save(studentForm); return studentForm; }
-
查询所有学生的信息
/** * 获得所有的学生的api 接口: * @return 返回结果列表 */ @GetMapping(value = "/students") public List getStudentForms(){ return dbUtils.findAll(); }
-
根据学号查询一个学生的信息
/** * 根据 account 来获得 一个学生的信息: * @param account 学号信息 * @return 返回查询的结果; */ @GetMapping(value = "/students/{account}") public Object getStudentFormById(@PathVariable("account") String account){ StudentForm student=dbUtils.findByAccount(account); if(student!=null) return student; else{ return "查找失败:当前学号的学生没有!"; } }
-
根据更新一个学生信息
/** * 根据Id 来更新一个学生的信息 * @param id 学生id 号码(必选) * @param age 年龄(可选) * @param name 姓名(可选) * @param password 密码(可选) * @param account 账号(可选) * @return */ @PostMapping(value = "/students/update") public Object updateStudentFormById(@RequestParam("id") Integer id, @RequestParam(value = "age",required = false,defaultValue = "-1") Integer age, @RequestParam(value = "name",required = false,defaultValue = "null") String name, @RequestParam(value = "password",required = false,defaultValue = "null") String password, @RequestParam(value = "account",required = false,defaultValue = "null") String account){ Optional studentC=dbUtils.findById(id); if(studentC.isPresent()){ StudentForm student=studentC.get(); if(age!=-1){ student.setAge(age); } if(!name.equals("null")){ student.setName(name); } if(!account.equals("null")){ student.setAccount(account); } if(!password.equals("null")){ student.setPassword(password); } dbUtils.save(student); return student; } return "修改失败,没有找到学生信息!"; }
-
根据ID删除一个学生的信息
/** * 删除指定ID的学生信息 * @param id * @return */ @PostMapping(value ="/students/delete") public String deleteById(@RequestParam(value = "id") Integer id){ Optional studentC=dbUtils.findById(id); if(studentC.isPresent()){ StudentForm student=studentC.get(); dbUtils.deleteById(id); return "{'msg':'删除成功','object':'"+student.toString()+"'}"; } return "没有办法删除:找不到要删除的信息!"; }
-
-
完整业务逻辑代码
package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; import java.util.Optional; @RestController public class StudentController { @Autowired private DBUtils dbUtils; /** * 获得所有的学生的api 接口: * @return 返回结果列表 */ @GetMapping(value = "/students") public List getStudentForms(){ return dbUtils.findAll(); } /** * 根据 account 来获得 一个学生的信息: * @param account 学号信息 * @return 返回查询的结果; */ @GetMapping(value = "/students/{account}") public Object getStudentFormById(@PathVariable("account") String account){ StudentForm student=dbUtils.findByAccount(account); if(student!=null) return student; else{ return "查找失败:当前学号的学生没有!"; } } /** * 增加一个新的学生信息到数据库: * @param studentForm 前端传过来的参数 * @param bindingResult 可以理解为异常捕获类 * @return */ @PostMapping(value = "/students/add") public Object addStudentForm(@Valid StudentForm studentForm, BindingResult bindingResult){ if(bindingResult.hasErrors()){ System.out.println(bindingResult.getFieldError().getDefaultMessage()); return "不符合条件,插入失败,请检查是不是有正确的请求参数"; } dbUtils.save(studentForm); return studentForm; } /** * 根据Id 来更新一个学生的信息 * @param id 学生id 号码(必选) * @param age 年龄(可选) * @param name 姓名(可选) * @param password 密码(可选) * @param account 账号(可选) * @return */ @PostMapping(value = "/students/update") public Object updateStudentFormById(@RequestParam("id") Integer id, @RequestParam(value = "age",required = false,defaultValue = "-1") Integer age, @RequestParam(value = "name",required = false,defaultValue = "null") String name, @RequestParam(value = "password",required = false,defaultValue = "null") String password, @RequestParam(value = "account",required = false,defaultValue = "null") String account){ Optional studentC=dbUtils.findById(id); if(studentC.isPresent()){ StudentForm student=studentC.get(); if(age!=-1){ student.setAge(age); } if(!name.equals("null")){ student.setName(name); } if(!account.equals("null")){ student.setAccount(account); } if(!password.equals("null")){ student.setPassword(password); } dbUtils.save(student); return student; } return "修改失败,没有找到学生信息!"; } /** * 删除指定ID的学生信息 * @param id * @return */ @PostMapping(value ="/students/delete") public String deleteById(@RequestParam(value = "id") Integer id){ Optional studentC=dbUtils.findById(id); if(studentC.isPresent()){ StudentForm student=studentC.get(); dbUtils.deleteById(id); return "{'msg':'删除成功','object':'"+student.toString()+"'}"; } return "没有办法删除:找不到要删除的信息!"; } }
-
使用postman 来进行程序接口检查
至此,这个学生管理系统基础的功能就开发完毕了,关于Spring Boot 也应该入门了,后续会有关于SpringBoot 的其他讲解,敬请期待!