偶像练习生信息查询系统

本文介绍了一个基于Spring Boot、JPA、Thymeleaf和MySQL构建的偶像练习生查询系统。系统提供了偶像信息的增删改查及分页功能,详细讲述了项目创建、数据库连接、模型层、Service层、Controller层的实现过程,以及各项功能的详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统简介

        该项目是一个基于Spring Boot、JPA、Thymeleaf和MySQL的数据驱动的图书管理系统。它提供了对图书的增加、删除、更新、查询和分页等功能,并支持自定义查询和排序。

        通过这个查询系统,用户可以很轻松的查询到自己idol的信息,为自己家的idol打call。

一、新建项目

        在使用IDEA创建项目时,建议选择Spring Initializr,并选择Maven作为构建工具。为了满足项目需求,推荐使用JDK 17作为项目的Java开发环境。在依赖管理中,需要添加以下五个依赖:Lombok、Spring Web、Thymeleaf、Spring Data JPA和MySQL Driver。这些依赖将为项目提供必要的功能和库,包括简化Java开发、实现Web应用、使用模板引擎、实现数据持久化以及与MySQL数据库进行交互。选择这些依赖将为项目提供稳定、高效的开发基础,使开发过程更加顺利和便捷

 二、系统设计步骤

1.连接数据库

源代码:

spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.username= root
spring.datasource.password= 123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto= update
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE

2.搭建项目结构

 二、实现过程

2-1 model层

        Model层:Model层是应用程序的核心部分,负责处理业务逻辑和数据操作,主要职责包括封装业务逻辑、数据持久化、数据验证和转换以及业务逻辑处理等。

 

package com.example.demo10.model;

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

@Data
@Entity
@Table(name = "employees")

public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "name")
    private String name;

    @Column(name = "gender")
    private String gender;

    @Column(name = "elementtype")
    private String elementtype;

    @Column(name = "home")
    private String home;

    @Column(name = "weapon")
    private String weapon;
}

2-2 Service层

Service层的主要职责是处理业务逻辑,组织数据操作和协调各个组件的工作。

2-3 EmployeeServiceImpl

 EmployeeServiceImpl主要用来用来存放接口的实现类对接口函数进行实现。

package com.example.demo10.service;

import com.example.demo10.model.Employee;
import com.example.demo10.repository.EmployeeRepository;
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 EmployeeServiceImpl implements EmployeeService {
//    @Autowired
//    public Employee findByName(String firstName) {
//        return EmployeeRepository.findByName();
//    }


    @Autowired
    private EmployeeRepository employeeRepository;

    @Override
    public List <Employee> getAllEmployees() {
        return employeeRepository.findAll();
    }

    @Override
    public void saveEmployee(Employee employee) {
        this.employeeRepository.save(employee);
    }

    @Override
    public Employee getEmployeeById(long id) {
        //调用数据访问层查找指定ID的员工,返回Optional对象
        Optional < Employee > optional = employeeRepository.findById(id);

        Employee employee = null;
        //如果存在指定id的员工
        if (optional.isPresent()) {
            //从Optional对象中获取员工对象
            employee = optional.get();
        } else {
            //否则抛出运行时异常
//            throw new RuntimeException(" 找不到员工ID :: " + id)
            System.out.println("对不起,您要查找的用户不存在!");
        }
        return employee;
    }

    @Override
    public void deleteEmployeeById(long id) {
        this.employeeRepository.deleteById(id);
    }

    @Override
    public Page<Employee> findPaginated(int pageNo, int pageSize, String sortField, String sortDirection) {
        //设置排序参数,升序ASC/降序DESC?
        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 this.employeeRepository.findAll(pageable);
    }
}

2-4 Controller层

        Controller层的功能为请求和响应控制,主要职责是解析请求参数、调用业务逻辑处理和返回响应结果给用户,它起到了用户与应用程序之间的桥梁作用。

package com.example.demo10.controller;

import com.example.demo10.model.Employee;
import com.example.demo10.service.EmployeeService;
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 EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    //     display list of employees
//    @GetMapping("/")
//    public String viewHomePage(Model model) {
//        model.addAttribute("listEmployees", employeeService.getAllEmployees());
//        return "index";
//    }
    @GetMapping("/")
    public String viewHomePage(Model model) {
        return findPaginated(1, "id", "asc", model);
    }

    @GetMapping("/showNewEmployeeForm")
    public String showNewEmployeeForm(Model model) {
        // create model attribute to bind form data
        Employee employee = new Employee();
        model.addAttribute("employee", employee);
        return "new_employee";
    }

    @PostMapping("/saveEmployee")
    public String saveEmployee(@ModelAttribute("employee") Employee employee) {
        // save employee to database
        employeeService.saveEmployee(employee);
        return "redirect:/";
    }

    @GetMapping("/showFormForUpdate/{id}")
    public String showFormForUpdate(@PathVariable(value = "id") long id, Model model) {

        // get employee from the service
        Employee employee = employeeService.getEmployeeById(id);

        // set employee as a model attribute to pre-populate the form
            model.addAttribute("employee", employee);
        return "update_employee";
    }

    @GetMapping("/deleteEmployee/{id}")
    public String deleteEmployee(@PathVariable(value = "id") long id) {

        // call delete employee method
        this.employeeService.deleteEmployeeById(id);
        return "redirect:/";
    }

    @RequestMapping(value = "/index1")
    public String index(Model model) {
        //这样的话,${user}才可在index.html中被取出
        Employee employee = new Employee();
        model.addAttribute("employee", employee);
        return "seek";
    }

    //访问show页面
    @PostMapping(value = "/show")
    //@ModelAttribute接受表单提交过来的user对象
    public String show(@ModelAttribute Employee employee, Model model) {
        Long id = employee.getId();
        Employee u=employeeService.getEmployeeById(id);
        model.addAttribute("employee", u);
        return "show";
    }

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

        Page<Employee> page = employeeService.findPaginated(pageNo, pageSize, sortField, sortDir);
        List<Employee> listEmployees = 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("listEmployees", listEmployees);
        return "index";
    }
}

三、功能

3-1 新增idol

在表格中新建一个idol,可以在html文件中新增页面的样式

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="ISO-8859-1">
    <title>Employee Management System</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
</head>

<body>
<div class="container">
    <h1>添加人物页面</h1>
    <hr>
    <h2>添加人物</h2>

    <form action="#" th:action="@{/saveEmployee}" th:object="${employee}" method="POST">
        <input type="hidden" th:field="*{id}" />
        <input type="text" th:field="*{name}" placeholder="名字" class="form-control mb-4 col-4">

        <input type="text" th:field="*{gender}" placeholder="特长" class="form-control mb-4 col-4">

        <input type="text" th:field="*{elementtype}" placeholder="年龄" class="form-control mb-4 col-4">
        <input type="text" th:field="*{home}" placeholder="练习时长" class="form-control mb-4 col-4">
        <input type="text" th:field="*{weapon}" placeholder="男团" class="form-control mb-4 col-4">
        <button type="submit" class="btn btn-info col-2"> 添加</button>
    </form>

    <hr>

    <a th:href="@{/}"> 返回首页</a>
</div>
</body>

</html>

 3-2 更新与删除信息

        由于更新和删除信息主要都是要如何实现点击按钮能获取到指定的id,并将此id的数据进行修

改和删除,所以两者就放在一起展示。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="ISO-8859-1">
    <title>Employee Management System</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">

</head>

<body>
<div class="container">
    <h1>更新页面</h1>
    <hr>
    <h2>更新idol信息</h2>

    <form action="#" th:action="@{/saveEmployee}" th:object="${employee}" method="POST">
        <input type="hidden" th:field="*{id}" />
        <input type="text" th:field="*{name}" placeholder="名字" class="form-control mb-4 col-4">

        <input type="text" th:field="*{gender}" placeholder="特长" class="form-control mb-4 col-4">

        <input type="text" th:field="*{elementtype}" placeholder="年龄" class="form-control mb-4 col-4">
        <input type="text" th:field="*{home}" placeholder="练习时长" class="form-control mb-4 col-4">
        <input type="text" th:field="*{weapon}" placeholder="男团" class="form-control mb-4 col-4">
        <button type="submit" class="btn btn-info col-2"> 更新</button>
    </form>

    <hr>

    <a th:href="@{/}"> 返回首页</a>
</div>
</body>

</html>

 

更新页面

 删除idol信息

 

 3-3 查询人物信息

        以下方法是通过输入指定的id来查询人物信息,通过两个html文件来设置查询页面和查询结果页面。

 

 

查询页面

 3-4 分页

当数据量超过5条时,会自动生成新的页面

 四、主页面

        主页面主要通过html来设置其样式,再通过Controller层来设置超连接,通过点击超链接来实现页面的跳转。 

 

 


总结

        大功告成,偶像练习生查询系统构筑完毕!用户可以通过该系统进行查询了!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值