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 文件中添加如下信息到
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jpaartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
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的学生信息
* @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 "没有办法删除:找不到要删除的信息!";
}
}
至此,这个学生管理系统基础的功能就开发完毕了,关于Spring Boot 也应该入门了,后续会有关于SpringBoot 的其他讲解,敬请期待!