Spring Boot入门项目二:编写一个简单的学生管理系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38863413/article/details/88377576

开发环境

  • JDK:Java 1.8

  • 技术栈:SpringBoot 2.13

  • 数据库: MySQL 8

  • IDE:JetBrains Intelij IDEA

实现功能

完成对学生信息的管理功能:增加,删除,修改,查找(本演示项目目的是为了入门SpringBoot,所以不会花费时间在前端界面上,所以开发出程序为api接口,使用 postman 可以很方便的发送各种请求到一些接口来验证程序的正确性)

建立工程

图文教程请移步:Spring Boot入门项目一:使用Intelij Idea创建一个Spring Boot工程

开发过程

  • 确定系统功能

    1. 学生数据的增加,添加一条学生的数据到数据库

    2. 全部学生数据浏览(无条件查看所有学生的数据信息)

    3. 根据学号来查找学生信息

    4. 更新学生信息:根据学号查找到学生,然后更新学生的信息

    5. 删除学生的信息:根据学号来进行删除

  • 完善开发环境

    本项目使用了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 来进行程序接口检查

    • 增加一个学生到数据库

    • 查看所有同学信息

    • 通过学号查看信息

    • 通过 ID更新信息

    • 通过ID删除信息

至此,这个学生管理系统基础的功能就开发完毕了,关于Spring Boot 也应该入门了,后续会有关于SpringBoot 的其他讲解,敬请期待!

猜你喜欢

转载自blog.csdn.net/qq_38863413/article/details/88377576