要创建一个基于Spring Boot、Thymeleaf、MyBatis Plus和MySQL的简单表格增删改查(CRUD)项目
文章目录
- 要创建一个基于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: 8080spring:datasource:username: rootpassword: rooturl: jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Driverthymeleaf:cache: falsemybatis-plus:mapper-locations: classpath:mapper/*Mapper.xmltype-aliases-package: com.geekmice.sbtbal.entity
数据库表配置
/*Navicat Premium Data TransferSource Server : dsfsSource Server Type : MySQLSource Server Version : 80036Source Host : localhost:3306Source Schema : schoolTarget Server Type : MySQLTarget Server Version : 80036File Encoding : 65001Date: 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 {@Autowiredprivate UserService userService;// 显示所有用户@GetMappingpublic 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>
相关文章:
要创建一个基于Spring Boot、Thymeleaf、MyBatis Plus和MySQL的简单表格增删改查(CRUD)项目
文章目录 要创建一个基于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模板 要创建一…...
解决Cubemx生产的 .ioc文件不能外部打开的方法
正常来说,cubemx生成的文件会有图标 但是当图标白色的时候,无法通过直接点击这个文件进入cubemx 1.首先检查java环境是不是装的JAVA8,如果是的话进行第二步操作; 2.重新安装一次cubemx,在安装的时候选择为我安装&…...
在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服务器,并实现远程联机,详细教程
Linux 部署 MineCraft 服务器 详细教程(丐版,无需云服务器) 一、虚拟机 Ubuntu 部署二、下载 Minecraft 服务端三、安装 JRE 21四、安装 MCS manager 面板五、搭建服务器六、本地测试连接七、下载樱花,实现内网穿透,邀…...
Transformer | 一文了解:缩放、批量、多头、掩码、交叉注意力机制(Attention)
源自: AINLPer(每日干货分享!!) 编辑: ShuYini 校稿: ShuYini 时间: 2025-3-27 更多:>>>>专注大模型/AIGC、学术前沿的知识分享! 引言 之前的文章:2万字长文!一文了解…...
原型验证后客户推翻原有需求,如何止损
原型验证后客户推翻原有需求时止损的有效方法包括:迅速评估影响范围、立即开展沟通确认、调整项目计划和资源配置、更新变更管理流程、协商成本分担机制。其中,迅速评估影响范围是关键,项目团队必须立即明确此次变更的具体影响,包…...
六、小白学JAVA-类和对象
1、什么是类和对象 人类---类:走路、说话、学习 人---对象:具体到某个人,就是对象,走路、说话、学习,每个人都是独特的人。 public class Person {String name;public void walk() {System.out.println("我会走…...
CMLINK APN 手动设置
以下是针对 CMLINK 的 APN设置 的详细指南,基于常见配置需求: CMLINK APN 手动设置参数 参数项值说明名称CMLINK (自定义)任意命名(如 CMLINK、CM Internet 等),建议使用ASCII字符,无特殊符号。APNcm.com …...
深入探索 Python 中的 asyncio:异步编程的利器
在当今的软件开发中,异步编程已经成为了提高程序性能和响应能力的重要手段之一。Python 作为一种广泛使用的编程语言,提供了强大的异步编程支持,而 asyncio 库则是其中的核心。本文将深入探讨 asyncio 的基本概念、使用方法以及一些高级特性&…...
STM32硬件IIC与OLED使用
OLED屏幕介绍 OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点,被认为是下一代的平面显示屏新兴应用技术 OLED显示…...
基于Spring Boot的电动车智能充电服务平台的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
十、JavaScript对象
一、对象 创建对象的方法有三种:字面量、new、构造函数。 1.利用字面量创建对象 花括号{}里面包含了表达这个具体事物(对象)的属性和方法 // 1.利用对象字面量创建对象{}// var obj {}; // 创建了一个空的对象var obj {uname: black,ag…...
FFmpeg开发学习:音视频封装
1.基本流程 1.输入参数 输出文件路径 char *output 视频编码参数 AVCodecParameters *video_par 音频编码参数 AVCodecParameters *audio_par 数据包 AVPacket *packets[] 2.封装流程 (1)创建输出的上下文AVFormatContext指针 AVFormatContext *out_fm…...
hackmyvm-reversteg
arp-scan -l nmap -sS -v 192.168.222.45 在源码中可以看到 根据下面的提示可以猜测117db0148dc179a2c2245c5a30e63ab0是一个图像文件 将图片下载到本地 隐写术 在两张图片上使用strings,发现有一些可打印的字符串 strings 117db0148dc179a2c2245c5a30e63ab0.jpg base64解码…...
UE4学习笔记 FPS游戏制作17 让机器人持枪 销毁机器人时也销毁机器人的枪 让机器人射击
添加武器插槽 打开机器人的Idle动画,方便查看武器位置 在动画面板里打开骨骼树,找到右手的武器节点,右键添加一个插槽,重命名为RightWeapon,右键插槽,添加一个预览资产,选择Rifle,根…...
考研408-数据结构完整代码 线性表的链式存储结构 - 单链表
单链表操作详解(C实现) 目录 单链表尾插法创建单链表头插法创建删除指定节点按值查找按序号查找插入节点完整代码示例注意事项总结 尾插法创建 #include<bits/stdc.h> using namespace std;typedef struct LNode {int data;struct LNode* next;…...
蓝桥杯经典题解:班级活动分组问题的深度解析与优化实现
目录 一、问题背景与描述 二、问题分析与核心思路 2.1 问题本质:统计与配对优化 2.2 关键观察 2.3 数学建模 三、算法设计与实现步骤 3.1 算法步骤 3.2 代码实现(Python) 3.3 优化点分析 四、关键细节与常见误区 4.1 细节处理 4.…...
设计模式(创建型)-建造者模式
定义 建造者模式(Builder Pattern)是一种创建型设计模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。该模式允许通过多个简单的步骤逐步构建出一个复杂的对象,用户只需指定复杂对象…...
RIP和OSPF的区别
文章目录 RIP(路由信息协议)和 OSPF(开放最短路径优先)是两种常见的动态路由协议,它们的主要区别如下:1. 协议类型2. 更新方式3. 路由计算算法4. 最大跳数5. 管理距离(AD)6. 认证机制…...
Git 之配置ssh
1、打开 Git Bash 终端 2、设置用户名 git config --global user.name tom3、生成公钥 ssh-keygen -t rsa4、查看公钥 cat ~/.ssh/id_rsa.pub5、将查看到的公钥添加到不同Git平台 6、验证ssh远程连接git仓库 ssh -T gitgitee.com ssh -T gitcodeup.aliyun.com...
遍历数组时,如何获取数组每个元素索引号
在 JavaScript 中,有多种方法可以在遍历数组时获取每个元素的索引号,下面为你介绍几种常用的方法: 1. 使用 for 循环 const array [apple, banana, cherry]; for (let i 0; i < array.length; i) {console.log(索引 ${i} 的元素是: ${…...
黑马点评项目
遇到问题: 登录流程 session->JWT->SpringSession->tokenRedis (不需要改进为SpringSession,token更广泛,移动端或者前后端分离都可以用) SpringSession配置为redis模式后,redis相当于分布式se…...
如何防御TCP洪泛攻击
TCP洪泛攻击(TCP Flood Attack)是一种常见的分布式拒绝服务(DDoS)攻击手段,以下是其原理、攻击方式和危害的详细介绍: 定义与原理 TCP洪泛攻击利用了TCP协议的三次握手过程。在正常的TCP连接建立过程中&a…...
【AVRCP】AVRCP核心术语解析
目录 一、协议核心术语:架构的基石 1.1 音视频控制协议簇(AVRCP 生态链) 1.2 数据传输协议(L2CAP 核心术语) 二、设备架构术语:角色与交互 2.1 设备角色模型(CT/TG 二元架构) …...
【弹性计算】异构计算云服务和 AI 加速器(四):FPGA 虚拟化技术
异构计算云服务和 AI 加速器(四):FPGA 虚拟化技术 🚀 FPGA(Field-Programmable Gate Array,现场可编程门阵列)是一种可重构的半导体芯片,允许用户根据需要动态配置硬件逻辑ÿ…...
Python爬虫如何检测请求频率?
在进行网络爬虫开发时,合理设置请求频率是确保爬虫稳定运行、避免被目标网站封禁的关键策略之一。以下是一些有效的方法和最佳实践,帮助你合理设置请求频率,确保爬虫的可持续性和稳定性。 一、了解速度限制的原因 网站对爬虫速度进行限制的…...
编译原理——自底向上语法优先分析
文章目录 自底向上优先分析概述一、自底向上优先分析概述二、简单优先分析法(一)优先关系定义(二)简单优先文法的定义(三)简单优先分析法的操作步骤 三、算法优先分析法(一)直观算符…...
nuxt3网站文章分享微信 ,QQ功能
1.安装 npm install qrcode --save-dev 2.组件使用 <div class"share"><div style"line-height: 69px; color: #fff;width: 100px;"><p style"text-align: center;">分享:</p></div><div click"shareToMi…...
智能任务分配:Python高并发架构设计
Python并发编程实战:多进程与多线程的智能任务分配策略 引言:突破性能瓶颈的关键选择 在CPU核心数量激增和I/O密集型应用普及的今天,Python开发者面临着一个关键抉择:如何通过并发编程充分释放硬件潜力?本文通过实测数…...
Oracle 数据库通过exp/imp工具迁移指定数据表
项目需求:从prod数据库迁移和复制2个表(BANK_STATE,HBS)的数据到uat数据库环境。 数据库版本:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 迁移工具:客户端exp/imp工具 -- 执行命令 从Prod数据库导出数据exp us…...
批发订货系统:驱动企业数字化转型的核心引擎
在数字经济时代,传统批发企业正面临供应链效率低、客户体验不足、管理成本高等挑战。而批发订货系统作为企业数字化转型的重要工具,正通过智能化、数据化和流程重构,重塑企业的运营模式,助力企业实现降本增效与业务创新。以下从多…...
