目录
一、项目搭建
二、项目实现
2.1 项目结构:
2.2 Controller层
2.3 model层
2.4 repository层
2.5 service层
Employee Service接口:
EmployeeServiceImpl类:
三、效果图展示(部分)
四、学习心得
1、因要打印文档,故仅展示部分代码,详细请看代码源 或者csdn博客网站
2、项目搭建用到的技术是:springbook、thymeleaf、mybatis、mysql等
3、gitee地址:IdeaProjects: Comparable接口作业 (gitee.com)
代码简要阐述:这是一个基于Spring Boot框架的员工管理系统的控制器类。控制器负责接收和处理来自前端的请求,并调用相应的服务类完成相应的业务逻辑。
@Controller 注解指示该类是一个控制器类,可以处理来自前端的请求
@Autowired 注解用于自动注入EmployeeService对象,这样就可以在控制器类中使用该对象的方法。
@GetMapping 注解将指定的方法映射到GET类型的HTTP请求。"/"路径指的是应用的根路径。
@ModelAttribute 注解用于将请求参数绑定到方法参数上。
@RequestMapping注释用于映射http请求的URI到某个具体的方法上。
代码中的各个方法分别处理不同的请求,包括显示员工列表、显示新建员工表单、保存员工、显示员工更新表单、删除员工等操作。
其中findPaginated()方法是一个辅助方法,用于实现分页功能。它接收当前页码、排序字段和排序方向作为参数,并调用employeeService的findPaginated()方法返回分页结果,然后将结果传递给前端视图。如下:
public class EmployeeController {
@Autowired
private EmployeeService employeeService; // 声明EmployeeService类型的变量employeeService,并进行自动装配
@GetMapping("/")
public String viewHomePage(Model model) { // 显示主页的方法
return findPaginated(1, "employeeName", "asc", model); // 调用findPaginated方法,并将返回结果返回
}
@GetMapping("/showNewEmployeeForm")
public String showNewEmployeeForm(Model model) { // 显示新员工表单的方法
// create model attribute to bind form data
Employee employee = new Employee(); // 创建Employee对象
model.addAttribute("employee", employee); // 将employee对象添加到model中,以便在表单中绑定数据
return "new_employee"; // 返回new_employee视图页面
}
@PostMapping("/saveEmployee")
public String saveEmployee(@ModelAttribute("employee") Employee employee) { // 保存员工信息的方法
// save employee to database
employeeService.saveEmployee(employee); // 调用employeeService的saveEmployee方法将员工保存到数据库
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); // 调用employeeService的getEmployeeById方法通过id获取员工信息
// set employee as a model attribute to pre-populate the form
model.addAttribute("employee", employee); // 将员工信息添加到model中,以便在表单中预先填充数据
return "update_employee"; // 返回update_employee视图页面
}
@GetMapping("/deleteEmployee/{id}")
public String deleteEmployee(@PathVariable(value = "id") long id) { // 删除员工的方法
// call delete employee method
this.employeeService.deleteEmployeeById(id); // 调用employeeService的deleteEmployeeById方法删除员工
return "redirect:/"; // 重定向到主页
}
// 添加查询功能
@GetMapping("/search")
public String searchEmployees(@RequestParam("keyword") String keyword, Model model) {
List listEmployees = employeeService.searchEmployees(keyword);
model.addAttribute("listEmployees", listEmployees);
return "index";
}
// 添加搜索功能
@PostMapping("/search")
public String searchEmployeesPost(@RequestParam("keyword") String keyword, Model model) {
return searchEmployees(keyword, model);
}
// 添加编辑功能
@PostMapping("/updateEmployee/{id}")
public String updateEmployee(@PathVariable(value = "id") long id, @ModelAttribute("employee") Employee employee) {
// 设置employee的id
employee.setId(id);
// 更新employee到数据库
employeeService.saveEmployee(employee);
return "redirect:/";
}
//获取分页数据
@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 page = employeeService.findPaginated(pageNo, pageSize, sortField, sortDir);
List 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";
}
代码简要概述:
这段代码定义了一个名为Employee的实体类,用于映射数据库中的"employees"表,并定义了一些属性和注解用于描述实体对象在数据库表中的映射关系。其中,id字段被指定为主键,并采用自增的方式生成唯一标识。
package en.edu.lzzy.s05mvcemployee.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 = "employeeName")//员工姓名
private String employeeName;
@Column(name = "position")//员工职位
private String position;
@Column(name = "department")//员工所在部门
private String department;
@Column(name = "email")//员工的电子邮件
private String email;
简要概述:定义了一个数据库仓库接口,用于对`Employee`实体类进行增删改查操作。
package en.edu.lzzy.s05mvcemployee.repository;
import en.edu.lzzy.s05mvcemployee.model.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository extends JpaRepository{
}
这个接口定义了一系列操作员工信息的方法,具体的实现可以在实现该接口的类中完成。
package en.edu.lzzy.s05mvcemployee.service;
import java.util.List;
import en.edu.lzzy.s05mvcemployee.model.Employee;
import org.springframework.data.domain.Page;
public interface EmployeeService {
//获取所有的员工
List < Employee > getAllEmployees();
//搜索员工
List searchEmployees();
//新增/更新一个员工
void saveEmployee(Employee employee);
//获取指定ID的员工
Employee getEmployeeById(long id);
//删除指定ID的员工
void deleteEmployeeById(long id);
//编辑员工
void editEmployee(Employee employee);
//分页
Page findPaginated(int pageNo, int pageSize, String sortField, String sortDirection);
List searchEmployees(String keyword);
}
EmployeeServiceImpl类是一个实现了EmployeeService接口的服务类,用于处理与员工相关的业务逻辑,并调用数据访问层的接口EmployeeRepository进行与数据库的交互。
package en.edu.lzzy.s05mvcemployee.service;
import java.util.List;
import java.util.Optional;
import en.edu.lzzy.s05mvcemployee.model.Employee;
import en.edu.lzzy.s05mvcemployee.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;
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private EmployeeRepository employeeRepository; // 自动装配EmployeeRepository对象
@Override
public List getAllEmployees() {
return employeeRepository.findAll(); // 调用EmployeeRepository的findAll()方法,返回所有员工列表
}
@Override
public List searchEmployees() {
return null; // 返回null,表示暂未实现搜索功能
}
@Override
public void saveEmployee(Employee employee) {
this.employeeRepository.save(employee); // 调用EmployeeRepository的save()方法保存员工对象
}
@Override
public Employee getEmployeeById(long id) {
Optional optional = employeeRepository.findById(id); // 调用EmployeeRepository的findById()方法,返回包含指定ID的Optional对象
Employee employee = null;
if (optional.isPresent()) { // 如果Optional对象中存在指定ID的员工
employee = optional.get(); // 从Optional对象中获取员工对象
} else {
throw new RuntimeException("找不到员工ID :: " + id); // 否则抛出运行时异常
}
return employee; // 返回员工对象
}
@Override
public void deleteEmployeeById(long id) {
this.employeeRepository.deleteById(id); // 调用EmployeeRepository的deleteById()方法删除指定ID的员工
}
@Override
public void editEmployee(Employee employee) {
// 暂未实现编辑员工功能
}
@Override
public Page 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 this.employeeRepository.findAll(pageable); // 调用EmployeeRepository的findAll()方法,返回某指定页面数据
}
@Override
public List searchEmployees(String keyword) {
return null; // 返回null,表示暂未实现搜索功能
}
在高级Java课程的学习中,我收获了许多新的知识和技能。以下是我在这门课程中的学习收获总结:
1. 深入理解Java语言特性:通过学习高级Java概念和语法,我对Java编程语言有了更深入的理解。我学会了如何使用高级特性,如泛型、多线程、反射等来提升代码的灵活性和效率。
2. 掌握设计模式:学习设计模式是这门课程中的一个重要部分。我学会了各种经典设计模式的原理和应用,如单例模式、工厂模式、观察者模式等。这些设计模式可以帮助我们编写可维护、可扩展的代码,并提高代码的复用性。
4. 面向对象编程原则:通过学习高级Java课程,我进一步理解了面向对象编程的核心概念和原则,如封装、继承、多态等。这些原则帮助我编写更加可维护和可复用的代码,提高了代码的可读性和灵活性。
总的来说,高级Java课程给了我一个更深入的Java编程知识框架,并帮助我提升了编程能力和解决问题的能力。通过学习这门课程,我对Java语言有了更深入的理解,我相信这些收获将对我的职业发展和未来的学习有很大的帮助。