系统简介
该项目是一个基于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层来设置超连接,通过点击超链接来实现页面的跳转。
总结
大功告成,偶像练习生查询系统构筑完毕!用户可以通过该系统进行查询了!!