文章目录
- 要创建一个基于Spring Boot、Thymeleaf、MyBatis Plus和MySQL的简单表格增删改查(CRUD)项目
- 1. 创建Spring Boot项目
- 2.项目配置
- 2.1 依赖
- yml配置
- 数据库表配置
- 3.代码实现
- 3.1 实体类
- 3.2 数据访问层
- 3.3 服务层
- 3.4 控制层
- 3.5 Thymeleaf模板
要创建一个基于Spring Boot、Thymeleaf、MyBatis Plus和MySQL的简单表格增删改查(CRUD)项目
1. 创建Spring Boot项目
可以通过Spring Initializr(https://start.spring.io/ )来创建项目,添加以下依赖:
- Spring Web
- Thymeleaf
- MyBatis Framework
- MySQL Driver
- MyBatis-Plus Boot Starter
2.项目配置
2.1 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.geekmice.sbtbal</groupId>
<artifactId>sbtbal</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Swagger3-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!--knife4j-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-ui</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--JSON-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
<!--MySQL-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.31</version>
<scope>runtime</scope>
</dependency>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.10.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- AspectJ 依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version> <!-- 请根据实际情况选择合适的版本 -->
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
</dependencies>
</project>
yml配置
server:
port: 8080
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
thymeleaf:
cache: false
mybatis-plus:
mapper-locations: classpath:mapper/*Mapper.xml
type-aliases-package: com.geekmice.sbtbal.entity
数据库表配置
/*
Navicat Premium Data Transfer
Source Server : dsfs
Source Server Type : MySQL
Source Server Version : 80036
Source Host : localhost:3306
Source Schema : school
Target Server Type : MySQL
Target Server Version : 80036
File Encoding : 65001
Date: 27/03/2025 22:44:03
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(0) NOT NULL AUTO_INCREMENT,
`user_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`birthday` date NULL DEFAULT NULL COMMENT '生日',
`sex` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`insert_time` timestamp(0) NULL DEFAULT NULL,
`update_time` timestamp(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1905264654908944386 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
3.代码实现
3.1 实体类
package com.geekmice.sbtbal.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("user")
public class User implements Serializable {
private static final long serialVersionUID=1L;
private Long id;
private String userName;
private String birthday;
private String sex;
private String address;
private Date insertTime;
private Date updateTime;
}
3.2 数据访问层
package com.geekmice.sbtbal.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.geekmice.sbtbal.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper<User> {
}
3.3 服务层
package com.geekmice.sbtbal.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.geekmice.sbtbal.entity.User;
public interface UserService extends IService<User> {
}
package com.geekmice.sbtbal.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.geekmice.sbtbal.entity.User;
import com.geekmice.sbtbal.mapper.UserMapper;
import com.geekmice.sbtbal.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
3.4 控制层
package com.geekmice.sbtbal.controller;
import com.geekmice.sbtbal.entity.User;
import com.geekmice.sbtbal.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
// 显示所有用户
@GetMapping
public String showAllUsers(Model model) {
List<User> users = userService.list();
model.addAttribute("users", users);
return "user";
}
// 显示添加用户表单
@GetMapping("/add")
public String showAddUserForm(Model model) {
model.addAttribute("user", new User());
return "add-user";
}
// 处理添加用户请求
@PostMapping("/addFista")
public String addUser(@ModelAttribute User user) {
System.out.println(user.toString());
userService.save(user);
return "redirect:/users";
}
// 显示编辑用户表单
@GetMapping("/edit/{id}")
public String showEditUserForm(@PathVariable Long id, Model model) {
User user = userService.getById(id);
model.addAttribute("user", user);
return "edit-user";
}
// 处理编辑用户请求
@PostMapping("/edit/{id}")
public String editUser(@PathVariable Long id, @ModelAttribute User user) {
user.setId(id);
userService.updateById(user);
return "redirect:/users";
}
// 处理删除用户请求
@GetMapping("/delete/{id}")
public String deleteUser(@PathVariable Long id) {
userService.removeById(id);
return "redirect:/users";
}
}
3.5 Thymeleaf模板
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>用户列表</title>
</head>
<body>
<h1>用户列表</h1>
<a href="/users/add">新增</a>
<br/>
<br/>
<br/>
<table border="5">
<tr>
<th>ID</th>
<th>Name</th>
<th>SEX</th>
<th>Actions</th>
</tr>
<tr th:each="user : ${users}">
<td th:text="${user.id}"></td>
<td th:text="${user.userName}"></td>
<td th:text="${user.sex}"></td>
<td>
<a th:href="@{/users/edit/{id}(id=${user.id})}">Edit</a>
<a th:href="@{/users/delete/{id}(id=${user.id})}">Delete</a>
</td>
</tr>
</table>
</body>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js">
table {
border: 1px solid #000;
width: 200px;
height:500px;
}
td {
border: 1px solid blue;
}
</script>
</html>
编辑
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<head>
<title>编辑</title>
</head>
<body>
<h1>编辑</h1>
<form th:action="@{/users/edit/{id}(id=${user.id})}" th:object="${user}" method="post">
<label for="userName">Name:</label>
<input type="text" id="userName" th:field="*{userName}" required><br>
<label for="sex">sex:</label>
<input id="sex" th:field="*{sex}" required><br>
<button type="submit">Update</button>
</form>
<a href="/users">Back to List</a>
</body>
</html>
新增
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<head>
<title>新增</title>
</head>
<body>
<h1>新增</h1>
<form th:action="@{/users/addFista}" th:object="${user}" method="post">
<label for="userName">用户名:</label>
<input type="text" id="userName" th:field="*{userName}" required><br><br>
<label for="sex"> 性别: </label>
<input id="sex" th:field="*{sex}" required><br><br>
<label for="birthday">生日:</label>
<input id="birthday" type="date" name="birthday"></input><br><br>
<label for="address">邮箱:</label>
<input id="address" type="email" name="address"></input><br><br>
<button type="submit">submit</button>
</form>
<br>
<br>
<a href="/users">Back to List</a>
</body>
</html>