📜  Spring MVC CRUD 与示例(1)

📅  最后修改于: 2023-12-03 15:05:16.211000             🧑  作者: Mango

Spring MVC CRUD与示例

Spring MVC是一个基于MVC(Model-View-Controller)的Web应用程序框架,它使用Spring框架作为应用程序的后端。它提供了一种模块化方法开发Web应用程序。本文将介绍如何使用Spring MVC来实现CRUD(增删改查)操作,以及给出一个示例程序。

Spring MVC CRUD

CRUD是一种重要的数据库操作,其中包含四个基本操作:创建、读取、更新和删除。在Spring MVC中,CRUD操作通常通过HTTP请求来执行。每个请求都由控制器所处理,将数据传递到指定的处理器方法中。

  1. 创建

通过HTTP请求,我们可以向数据库添加新的记录。在Spring MVC中,我们可以通过使用@PostMapping注解来实现创建操作。以下是一个示例:

@PostMapping(value = "/add")
public ModelAndView addEmployee(@ModelAttribute("employee") Employee employee) {
  EmployeeService.addEmployee(employee);
  return new ModelAndView("redirect:/");
}

在以上示例中,我们通过@ModelAttribute来传递员工对象,然后将其添加到数据库中。该操作将返回一个重定向到主页的模型视图。

  1. 读取

读取操作是从数据库中检索数据。在Spring MVC中,我们通常使用@GetMapping注解来实现读取操作。以下是一个示例:

@GetMapping(value = "/edit/{id}")
public ModelAndView editEmployee(@PathVariable("id") int id) {
  Employee employee = EmployeeService.getEmployeeById(id);
  ModelAndView model = new ModelAndView("employee_form");
  model.addObject("employee", employee);
  return model;
}

在以上示例中,我们使用@PathVariable来检索特定的员工记录,并将其传递到employee_form模板中。该操作将返回一个模型视图,其中包含将要编辑的员工数据。

  1. 更新

更新操作是对数据库中现有记录的修改。在Spring MVC中,我们通常使用@PostMapping注解来实现更新操作。以下是一个示例:

@PostMapping(value = "/edit")
public ModelAndView updateEmployee(@ModelAttribute("employee") Employee employee) {
  EmployeeService.updateEmployee(employee);
  return new ModelAndView("redirect:/");
}

在以上示例中,我们通过@ModelAttribute来传递待更新的员工对象。该操作将更新员工记录并返回主页的重定向模型视图。

  1. 删除

删除操作是从数据库中删除现有记录。在Spring MVC中,我们通常使用@GetMapping注解来实现删除操作。以下是一个示例:

@GetMapping(value = "/delete/{id}")
public ModelAndView deleteEmployee(@PathVariable("id") int id) {
  EmployeeService.deleteEmployee(id);
  return new ModelAndView("redirect:/");
}

在以上示例中,我们使用@PathVariable来检索特定的员工记录,并将其从数据库中删除。该操作将返回主页的重定向模型视图。

Spring MVC CRUD示例

接下来,我们将给出一个基于Spring MVC实现的示例程序。该程序将实现一个简单的员工管理系统,用于演示CRUD操作的实现。以下是该示例的要求:

  • 添加新的员工
  • 查看、编辑、删除现有的员工记录

该示例程序使用以下技术:

  • Spring MVC
  • MySQL数据库
  • Bootstrap框架

示例程序的源代码可在GitHub上进行查看和下载

配置

首先,在Spring MVC中,我们需要先配置一个扫描器来扫描所有的控制器和服务层类。以下是ApplicationContextConfig类的实现:

@Configuration
@ComponentScan(basePackages = {"com.example.springmvccrudexample"})
@EnableWebMvc
public class ApplicationContextConfig implements WebMvcConfigurer {
  
  @Override
  public void configureViewResolvers(ViewResolverRegistry registry) {
    registry.jsp("/WEB-INF/views/", ".jsp");
  }
  
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**").addResourceLocations("/static/");
  }
  
  @Bean
  public DataSource getDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/employee_db?useSSL=false");
    dataSource.setUsername("root");
    dataSource.setPassword("root");
    return dataSource;
  }
  
  @Bean
  public JdbcTemplate getJdbcTemplate() {
    JdbcTemplate jdbcTemplate = new JdbcTemplate();
    jdbcTemplate.setDataSource(getDataSource());
    return jdbcTemplate;
  }
  
  @Bean
  public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
  }
}

在以上示例中,我们配置了视图解析器、资源处理器和数据源。我们还配置了JdbcTemplate类,该类是Spring框架提供的用于简化JDBC操作的类。

数据库

在该示例程序中,我们将使用MySQL数据库。以下为MySQL数据库的表定义:

CREATE DATABASE employee_db;

USE employee_db;

CREATE TABLE employees (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NOT NULL,
  department VARCHAR(45) NOT NULL,
  salary INT NOT NULL,
  PRIMARY KEY (id)
);
控制器

接下来,我们需要编写控制器类。在该示例程序中,我们主要需要实现以下业务逻辑:

  • 显示所有员工记录
  • 添加新的员工记录
  • 更新员工记录
  • 删除员工记录

以下是EmployeeController类的实现:

@Controller
public class EmployeeController {

  @Autowired
  private EmployeeService employeeService;
 
  @RequestMapping("/")
  public ModelAndView home() {
    List<Employee> employees = employeeService.listAllEmployees();
    ModelAndView model = new ModelAndView("home");
    model.addObject("employees", employees);
    return model;
  }
  
  @RequestMapping("/new")
  public ModelAndView newEmployee() {
    Employee employee = new Employee();
    ModelAndView model = new ModelAndView("employee_form");
    model.addObject("employee", employee);
    return model;
  }
  
  @RequestMapping(value = "/save", method = RequestMethod.POST)
  public ModelAndView saveEmployee(@ModelAttribute("employee") Employee employee) {
    employeeService.save(employee);
    return new ModelAndView("redirect:/");
  }
  
  @RequestMapping("/edit/{id}")
  public ModelAndView editEmployee(@PathVariable(name = "id") int id) {
    ModelAndView model = new ModelAndView("employee_form");
    Employee employee = employeeService.get(id);
    model.addObject("employee", employee);
    return model;
  }
  
  @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
  public ModelAndView deleteEmployee(@PathVariable(name = "id") int id) {
    employeeService.delete(id);
    return new ModelAndView("redirect:/");
  }
}

在以上示例中,我们使用了@RequestMapping注解来定义URL到控制器方法的映射关系。我们使用@ModelAttribute注解将数据绑定到指定的对象上,并使用@Autowired注解来注入EmployeeService类。这样,我们就可以在控制器中使用服务层的方法,来实现CRUD操作。

服务层

接下来,我们需要编写服务层类。服务层类的作用是处理业务逻辑,与持久层交互。以下是EmployeeService类的实现:

@Service
public class EmployeeService {

  @Autowired
  private JdbcTemplate jdbcTemplate;
  
  public List<Employee> listAllEmployees() {
    String sql = "SELECT * FROM employees";
    List<Employee> employees = jdbcTemplate.query(sql, new RowMapper<Employee>() {

      @Override
      public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
        Employee employee = new Employee();
        employee.setId(rs.getInt("id"));
        employee.setName(rs.getString("name"));
        employee.setDepartment(rs.getString("department"));
        employee.setSalary(rs.getInt("salary"));
        return employee;
      }
    });
    return employees;
  }
  
  public void save(Employee employee) {
    String sql = "INSERT INTO employees (name, department, salary) VALUES (?, ?, ?)";
    jdbcTemplate.update(sql, employee.getName(), employee.getDepartment(), employee.getSalary());
  }
  
  public Employee get(int id) {
    String sql = "SELECT * FROM employees WHERE id = ?";
    Employee employee = jdbcTemplate.queryForObject(sql, new RowMapper<Employee>() {

      @Override
      public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
        Employee employee = new Employee();
        employee.setId(rs.getInt("id"));
        employee.setName(rs.getString("name"));
        employee.setDepartment(rs.getString("department"));
        employee.setSalary(rs.getInt("salary"));
        return employee;
      }
    }, id);
    return employee;
  }
  
  public void update(Employee employee) {
    String sql = "UPDATE employees SET name = ?, department = ?, salary = ? WHERE id = ?";
    jdbcTemplate.update(sql, employee.getName(), employee.getDepartment(), employee.getSalary(), employee.getId());
  }
  
  public void delete(int id) {
    String sql = "DELETE FROM employees WHERE id = ?";
    jdbcTemplate.update(sql, id);
  }
}

在以上示例中,我们使用了@Service注解来定义该类为一个服务层类。在该类中,我们使用JdbcTemplate类来与数据库进行交互,以实现CRUD操作。

视图模板

接下来,我们需要编写视图模板。在该示例程序中,我们使用JSP作为视图模板。以下是home.jsp模板的实现:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Employee Management System</title>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="/SpringMVCCRUDExample/static/css/style.css">
  </head>
  <body>
    <div class="container">
      
      <h1>Employee Management System</h1>
      
      <a href="/SpringMVCCRUDExample/new" class="btn btn-primary mb-3">Add New Employee</a>
      
      <table class="table table-striped">
        <thead>
          <tr>
            <th>#</th>
            <th>Name</th>
            <th>Department</th>
            <th>Salary</th>
            <th>Actions</th>
          </tr>
        </thead>
        <tbody>
          <c:forEach items="${employees}" var="employee">
            <tr>
              <td>${employee.id}</td>
              <td>${employee.name}</td>
              <td>${employee.department}</td>
              <td>${employee.salary}</td>
              <td>
                <a href="/SpringMVCCRUDExample/edit/${employee.id}" class="btn btn-primary btn-sm">Edit</a>
                <a href="/SpringMVCCRUDExample/delete/${employee.id}" class="btn btn-danger btn-sm">Delete</a>
              </td>
            </tr>
          </c:forEach>
        </tbody>
      </table>
      
    </div>
    
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
  </body>
</html>

在以上示例中,我们使用了Bootstrap框架来设计网页。我们使用了JSTL核心标签库和格式化标签库来显示员工记录。它使用了Controller层定义的URL路径,以便用户在网页上执行CRUD操作。

运行

最后,我们需要打包并部署应用程序。在该示例程序中,我们可以使用Maven来打包。以下是pom.xml文件的实现:

<groupId>com.example</groupId>
<artifactId>SpringMVCCRUDExample</artifactId>
<version>0.0.1-SNAPSHOT</version>

<properties>
  <spring.version>5.2.7.RELEASE</spring.version>
  <jstl.version>1.2</jstl.version>
  <mysql.version>8.0.19</mysql.version>
  <lombok.version>1.18.10</lombok.version>
  <bootstrap.version>4.6.0</bootstrap.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>${jstl.version}</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
  </dependency>
  <dependency>
    <groupId>org.webjars</groupId>
    <artifactId>bootstrap</artifactId>
    <version>${bootstrap.version}</version>
  </dependency>
</dependencies>

在以上示例中,我们使用了Spring MVC、JSTL、MySQL、Lombok、Bootstrap等技术来实现该示例程序。现在,我们可以打包并运行该示例程序。若干个页面将以网站的形式展示该示例程序的功能。

总结

Spring MVC是一个流行的Web应用程序框架,有助于实现CRUD操作。在该示例程序中,我们学习了如何使用Spring MVC和MySQL数据库来实现一个简单的员工管理系统。我们可以应用这些知识和技术来构建自己的Web应用程序,帮助我们更有效地管理业务。