[JAVA MVC] Cree rápidamente un sistema simple de gestión de información de estudiantes

Directorio de artículos

importación de escena

1. Introducción técnica

1. Bota de primavera:

2.JPA (API de persistencia de Java)

3.Hoja de tomillo

4.MySQL

5. Arranque

2. Proceso de implementación

1. Crear un nuevo proyecto

2. Agregue el estilo Bootstrap

3. Agregar configuración de base de datos

4. Construcción del marco

5. Escriba las propiedades del modelo

6. Agregar información del estudiante

7. Modificar la información del estudiante

8. Eliminar información del estudiante

9. Encuentra

10. Paginación, clasificación

11. Expansión (base de datos uno a uno)

3. Visualización de código

1. Capa de modelo (estudiante, clase 1)

2. Capa de control (StudentController)

2. Capa de interfaz JPA (ClassRepository, StudentRepository)

2. Capa de interfaz empresarial (ClassService, ClassServiceLmpl, StudentService, StudentServiceLmpl)

Resumir


importación de escena

        En el desarrollo web moderno, elegir la pila de tecnología adecuada es crucial para crear aplicaciones sólidas y escalables. Este blog presentará una combinación muy popular y poderosa de tecnologías como Spring Boot, JPA, Thymeleaf, MySQL y la biblioteca Bootstrap adicional. Esta combinación no solo puede ayudar a los desarrolladores a crear aplicaciones web de manera eficiente, sino que también brinda una mejor experiencia de usuario y simplifica el proceso de desarrollo. Sigamos un cierto requisito para desarrollar un sistema de gestión de información de los estudiantes, como se muestra en la figura:

1. Introducción técnica

1. Bota de primavera:

        Spring Boot es una herramienta de desarrollo basada en Spring Framework que simplifica el desarrollo de aplicaciones Java proporcionando configuración automatizada y los principios de convención sobre configuración. Spring Boot puede mejorar en gran medida la eficiencia del desarrollo y también proporciona una gran cantidad de complementos y funciones, como servidores integrados, administración y configuración de dependencias automatizadas e integración de muchos componentes de desarrollo de uso común.

2.JPA (API de persistencia de Java)

        JPA es una especificación ORM (Mapeo relacional de objetos) en la plataforma Java, que proporciona una forma de mapear objetos Java en bases de datos relacionales. En comparación con la programación SQL tradicional, el uso de JPA puede operar la base de datos de manera más conveniente, proporciona consultas a nivel de objeto y operaciones persistentes, y reduce los problemas de los desarrolladores en el acceso a la base de datos.

3.Hoja de tomillo

        Thymeleaf es un moderno motor de plantillas Java del lado del servidor para crear plantillas Java del lado del servidor. Permite a los desarrolladores representar datos dinámicos en páginas HTML y es compatible con un potente lenguaje de expresión y un diseño de plantilla. La sintaxis de Thymeleaf es simple y fácil de usar, lo que facilita el desarrollo front-end.

4.MySQL

       MySQL es un sistema de gestión de bases de datos relacionales de código abierto que se utiliza ampliamente para el desarrollo de aplicaciones web. Tiene un excelente rendimiento, confiabilidad y escalabilidad, y proporciona un lenguaje de consulta enriquecido y compatibilidad con procedimientos almacenados. Al combinar con Spring Boot y JPA, podemos realizar fácilmente operaciones de base de datos y realizar consultas y persistencia de datos.

5. Arranque

        Bootstrap es un marco de desarrollo front-end popular, que proporciona componentes ricos en CSS y JavaScript, que pueden ayudarnos a construir rápidamente una interfaz de usuario moderna. Al integrar Bootstrap, podemos embellecer y mejorar la apariencia y la interacción del usuario de la aplicación web, haciendo que el efecto de visualización de la aplicación en diferentes dispositivos sea más uniforme y amigable.

2. Proceso de implementación

1. Crear un nuevo proyecto

Como se muestra en la figura, cuando IDEA crea un nuevo proyecto, seleccione Spring Initializr y seleccione Maven;

Se recomienda JDK 17; agregue las siguientes cinco dependencias

 

2. Agregue el estilo Bootstrap

Hay muchos estilos en el sitio web oficial, que se pueden modificar según la situación real.

3. Agregar configuración de base de datos

Agregue información de la base de datos local o remota en el archivo application.properties para su uso posterior

4. Construcción del marco

 

5. Escriba las propiedades del modelo

        La capa Modelo se usa para escribir nuestros atributos de composición empresarial. Ahora estamos escribiendo un sistema de gestión de estudiantes, así que escriba el nombre del estudiante, el género y otros atributos en la capa Modelo, y simultáneamente construya la tabla de información de estudiantes Estudiantes en la base de datos.

6. Agregar información del estudiante

        Si desea agregar información de la página web a la base de datos, primero debe escribir el método de adición en la interfaz comercial StudentService , luego inyectar la dependencia de la interfaz JPA en la clase StudentServiceLmpl , luego heredar la interfaz comercial e implementar el método, y luego establecer el mapeo en la capa de control StudentController , cuando la URL es Al especificar la URL, llame a la función Add para obtener los datos pasados ​​desde la página web y llame al método Add para almacenar los datos en la base de datos, y luego regrese a la página principal, el proceso se muestra en la figura:

 

 Cabe señalar que tanto la clase de implementación de la capa empresarial como la capa de control deben basarse primero en la inyección, como se muestra en la figura:

7. Modificar la información del estudiante

        Los pasos de implementación de la función de modificación son similares a los de la adición, pero en la capa de control, se debe crear un nuevo mapeo y la información del estudiante se busca a través de la información de identificación en la URL empalmada y saltada por la web. y la información se muestra en la nueva página web.Después de que el usuario cambie, saltará a la función de guardar, como se muestra en la figura:

 

 

 

8. Eliminar información del estudiante

       Los pasos de implementación de la función de modificación son similares a los de la adición, pero en la capa de control, se debe crear un nuevo mapeo, y la información del estudiante se puede encontrar a través de la información de identificación en la URL empalmada y saltada de la página web, y directamente eliminada y luego saltada a la función de guardar, como se muestra en la figura:

 

9. Encuentra

         La función de búsqueda es para especificar el nombre del estudiante para la consulta aproximada, por lo que necesitamos crear un método en la interfaz JPA y luego crear e implementar el método en la capa empresarial, y luego los pasos son los mismos que antes.

        Aquí hay un pequeño detalle, el mapeo se establece en la capa de control, se obtiene el nombre de la URL y se realiza la búsqueda, por lo que se debe configurar el enlace de salto en el archivo index.html, como se muestra en la figura:

10. Paginación, clasificación

        La paginación y la clasificación son métodos que vienen con MVC. Solo necesitamos entenderlos y llamarlos de acuerdo con la sintaxis. Primero, inyecte las dependencias de la interfaz JPA en la clase StudentServiceLmpl, luego herede la interfaz comercial e implemente los métodos, y luego configure el mapeo en la capa de control StudentController. La URL es, llamar a la función de agregar, obtener los datos pasados ​​desde la página web, llamar al método de agregar, almacenar los datos en la base de datos y luego volver a la página principal. El proceso se muestra en la figura: se estipula que cada página tiene más de cinco datos e ingresa a la página siguiente.Establecer El número de ellos aumenta en orden, y la configuración de la página web se puede ordenar de acuerdo con diferentes números de columnas según las diferentes necesidades.desc: es de orden descendente, asc: es de orden ascendente

11. Expansión (base de datos uno a uno)

       Para lograr el efecto uno a uno de la base de datos, agregué una tabla de clase con el nombre de la clase. Los datos primero establecieron dos clases y no se asignaron, luego agregué un enlace de clave externa a la tabla de clase en el estudiante. y finalmente agregó la interfaz JPA de la clase, la capa de negocios, puede obtener todos los nombres de clase en la tabla de clases en la capa de control y luego pasar los datos a la página principal del índice, puede agregar un cuadro desplegable para seleccionar la clase, y utilizarla para realizar la búsqueda. Y se agregaron operaciones como la página de administración de clases y agregar, modificar y verificar, y cuando cambia el nombre de la clase, también cambia el nombre de la clase de la información del estudiante.

 

 

 

 

 

 El efecto final de la página web.

añadir

Revisar

buscar

Paginación y clasificación

Ver todas las clases y buscar aquí

página de gestión de clases

Modificar la información de la clase

Agregar información de la clase


 

3. Visualización de código

1. Capa de modelo (estudiante, clase 1)

package com.example.studentproj.model;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString

/**
 * Class1实体类,对应数据库中的class表
 */
@Entity
@Table(name = "class")
public class Class1 {
    /**
     * 主键ID,自动生成且自增长
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    /**
     * 班级名称
     */
    @Column(name = "classname")
    private String name;
}
package com.example.studentproj.model;

import jakarta.persistence.*;
import lombok.Data;

@Data
@Entity
@Table(name = "students")
public class Student {
    /**
     * 学生ID,自动生成且自增长
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    /**
     * 学生姓名
     */
    @Column(name = "name")
    private String name;

    /**
     * 学生性别
     */
    @Column(name = "sex")
    private String sex;

    /**
     * 学生年龄
     */
    @Column(name = "age")
    private int age;

    /**
     * 学籍状态
     */
    @Column(name = "status")
    private String status;

    /**
     * 学生籍贯
     */
    @Column(name = "ticy")
    private String ticy;

    /**
     * 班级名称
     */
    @Column(name = "class_name")
    private String className;

    /**
     * 班级关联
     */
    @ManyToOne
    @JoinColumn(name = "class_id")
    private Class1 class1;
}

2. Capa de control (StudentController)

package com.example.studentproj.controller;

import com.example.studentproj.model.Class1;
import com.example.studentproj.model.Student;
import com.example.studentproj.repository.ClassRepository;
import com.example.studentproj.service.ClassService;
import com.example.studentproj.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
public class StudentController {

    //依赖注入StudentService接口
    @Autowired
    private StudentService studentService;

    //依赖注入ClassService接口
    @Autowired
    private ClassService classService;



    //将获取到的班级名称信息传入model,并且跳转分页函数
    @GetMapping("/")
    public String viewHomePage(Model model) {
        List<Class1> listclass = classService.getAllClass();
        model.addAttribute("listclass",listclass);
        return findPaginated(1, "name", "asc" ,model);
    }


    //跳转添加学生信息网页
    @GetMapping("/showNewStudentForm")
    public String showStudet(Model model){
        Student student = new Student();
        List<Class1> listclass = classService.getAllClass();
        model.addAttribute("listclass",listclass);
        model.addAttribute("student",student);
        return "new_student";
    }

    //跳转保存学生信息网页
    @PostMapping("/saveStudent")
    public String saveStudnt(@ModelAttribute("student") Student student){
        studentService.saveStudent(student);
        return "redirect:/";
    }

    //根据id读取数据库数据,并支持修改
    @GetMapping("/showNewStudentUpdate{id}")
    public String showFormForUpdate(@PathVariable(value = "id") long id,Model model){
        Student student = studentService.getStudentByid(id);
        List<Class1> listclass = classService.getAllClass();
        model.addAttribute("listclass",listclass);
        model.addAttribute("student",student);
        return "update_student";
    }


    //根据id读取数据库数据,并直接删除掉
    @GetMapping("/deleteStudent{id}")
    public String deleteStudent(@PathVariable(value = "id") long id){
        this.studentService.deleteStudentByid(id);
        return "redirect:/";
    }

    
    //获取分页数据
    @GetMapping("/page/{pageNo}")
    public String findPaginated(@PathVariable (value = "pageNo") int pageNo,
                                @RequestParam("sortField") String sortField,
                                @RequestParam("sortDir") String sortDir,
                                Model model) {
        //设置每4条数据分一页
        int pageSize = 4;

        Page<Student> page = studentService.findPaginated(pageNo, pageSize, sortField, sortDir);
        List<Student> ListStudent = page.getContent();

        model.addAttribute("currentPage", pageNo);
        model.addAttribute("totalPages", page.getTotalPages());
        model.addAttribute("totalItems", page.getTotalElements());

        model.addAttribute("sortField", sortField);
        model.addAttribute("sortDir", sortDir);
        model.addAttribute("reverseSortDir", sortDir.equals("asc") ? "desc" : "asc");

        model.addAttribute("listStudent", ListStudent);
        return "index";
    }

    //搜索名字
    @GetMapping("/query{inpname}")
    public String query(@PathVariable(value = "inpname") String inpame,Model model){
        List<Student> listStudent = studentService.findByNameContaining(inpame);
        List<Class1> listclass = classService.getAllClass();
        model.addAttribute("listclass",listclass);
        model.addAttribute("listStudent",listStudent);
        return "index";
    }


    //根据班级名称来查找数据
    @GetMapping("/classname{inpname}")
    public String classname(@PathVariable(value = "inpname") String inpame,Model model){
        List<Student> listStudent = studentService.findByClassName(inpame);
        List<Class1> listclass = classService.getAllClass();
        model.addAttribute("listclass",listclass);
        model.addAttribute("listStudent",listStudent);
        return "index";
    }

}

2. Capa de interfaz JPA (ClassRepository, StudentRepository)

package com.example.studentproj.repository;


import com.example.studentproj.model.Class1;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface ClassRepository extends JpaRepository<Class1, Long> {

    //获取class所有班级名字
    @Query("select c.name from Class1 c ")
    List<Class1> findByClassName();

}
package com.example.studentproj.repository;
import com.example.studentproj.model.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;


@Repository
public interface StudentRepository extends JpaRepository<Student, Long> {

    //通过学生名字来查找学生数据
    @Query("select s from Student s where s.name like %:name%")
    List<Student> findByName(@Param("name") String name);


    //通过班级名字来查找学生数据
    @Query("select s from Student s where s.className = :name")
    List<Student> findByClassName(@Param("name") String name);

}

2. Capa de interfaz empresarial (ClassService, ClassServiceLmpl, StudentService, StudentServiceLmpl)

package com.example.studentproj.service;


import com.example.studentproj.model.Class1;
import java.util.List;


public interface ClassService {
   //获取所有班级数据
    List<Class1> getAllClass();
    
}
package com.example.studentproj.service;

import com.example.studentproj.model.Class1;
import com.example.studentproj.repository.ClassRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ClassServiceImpl implements ClassService {

    @Autowired
    private ClassRepository classRepository;

    /**
     * 获取所有班级列表
     *
     * @return 所有班级列表
     */
    @Override
    public List<Class1> getAllClasses() {
        return classRepository.findAll();
    }
}
package com.example.studentproj.service;

import com.example.studentproj.model.Student;
import org.springframework.data.domain.Page;

import java.util.List;

public interface StudentService {

    /**
     * 获取所有学生列表
     *
     * @return 所有学生列表
     */
    List<Student> getAllStudents();

    /**
     * 存储学生信息
     *
     * @param student 学生对象
     */
    void saveStudent(Student student);

    /**
     * 通过姓名查询学生列表
     *
     * @param name 姓名
     * @return 符合条件的学生列表
     */
    List<Student> findByNameContaining(String name);

    /**
     * 通过班级查询学生列表
     *
     * @param name 班级名称
     * @return 符合条件的学生列表
     */
    List<Student> findByClassName(String name);

    /**
     * 根据学生ID获取学生信息
     *
     * @param id 学生ID
     * @return 学生对象
     */
    Student getStudentById(Long id);

    /**
     * 根据学生ID删除学生信息
     *
     * @param id 学生ID
     */
    void deleteStudentById(Long id);

    /**
     * 分页查询学生列表
     *
     * @param pageNo         当前页码
     * @param pageSize       每页记录数
     * @param sortField      排序字段
     * @param sortDirection  排序方向
     * @return 分页结果
     */
    Page<Student> findPaginated(int pageNo, int pageSize, String sortField, String sortDirection);
}
package com.example.studentproj.service;

import com.example.studentproj.model.Student;
import com.example.studentproj.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentRepository studentRepository;

    /**
     * 获取所有学生列表
     *
     * @return 所有学生列表
     */
    @Override
    public List<Student> getAllStudents() {
        return studentRepository.findAll();
    }

    /**
     * 存储学生信息
     *
     * @param student 学生对象
     */
    @Override
    public void saveStudent(Student student) {
        studentRepository.save(student);
    }

    /**
     * 通过姓名查询学生列表
     *
     * @param name 姓名
     * @return 符合条件的学生列表
     */
    @Override
    public List<Student> findByNameContaining(String name) {
        return studentRepository.findByNameContaining(name);
    }

    /**
     * 通过班级查询学生列表
     *
     * @param name 班级名称
     * @return 符合条件的学生列表
     */
    @Override
    public List<Student> findByClassName(String name) {
        return studentRepository.findByClassName(name);
    }

    /**
     * 根据学生ID获取学生信息
     *
     * @param id 学生ID
     * @return 学生对象
     */
    @Override
    public Student getStudentById(Long id) {
        Optional<Student> optional = studentRepository.findById(id);
        if (optional.isPresent()) {
            return optional.get();
        } else {
            throw new RuntimeException("查无此人,请重新输入,id: " + id);
        }
    }

    /**
     * 根据学生ID删除学生信息
     *
     * @param id 学生ID
     */
    @Override
    public void deleteStudentById(Long id) {
        studentRepository.deleteById(id);
    }

    /**
     * 分页查询学生列表
     * @param pageNo       当前页码
     * @param pageSize     每页记录数
     * @param sortField    排序字段
     * @param sortDirection  排序方向(ASC或DESC)
     * @return 分页结果
     */
    @Override
    public Page<Student> findPaginated(int pageNo, int pageSize, String sortField, String         sortDirection) {
    Sort sort = sortDirection.equalsIgnoreCase(Sort.Direction.ASC.name())
            ? Sort.by(sortField).ascending()
            : Sort.by(sortField).descending();

    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, sort);
    return studentRepository.findAll(pageable);
}    

        El código de estructura general se ha puesto aquí. El código fuente de html y el código de extensión de la clase no se incluirán aquí. Si está interesado, puede explorar por sí mismo o enviarme un mensaje privado.


Resumir

        Siga  a Bai Dao para aprender  a programar y, al combinar Spring Boot, JPA, Thymeleaf, MySQL y Bootstrap, podemos crear aplicaciones web potentes, eficientes y fáciles de mantener. Spring Boot proporciona el marco básico para el desarrollo, JPA simplifica las operaciones de la base de datos, Thymeleaf y Bootstrap brindan una mejor experiencia de usuario y diseño de interfaz. Creo que al aprender estas pilas de tecnología, todos pueden comenzar rápidamente y desarrollar excelentes aplicaciones web.

Supongo que te gusta

Origin blog.csdn.net/qq_51294997/article/details/131545399
Recomendado
Clasificación