Spring Boot + MyBatis + MySQL:快速搭建CRUD应用
一、引言
1. 项目背景与目标
在现代Web开发中,CRUD(创建、读取、更新、删除)操作是几乎所有应用程序的核心功能。本项目旨在通过Spring Boot、MyBatis和MySQL技术栈,快速搭建一个高效、简洁的CRUD应用。我们将从零开始,逐步实现一个用户管理系统的增删改查功能。
2. 技术选型与适用场景
- Spring Boot:简化了基于Spring的应用开发,提供了自动配置、嵌入式服务器等特性。
- MyBatis:作为持久层框架,支持自定义SQL、存储过程和高级映射,灵活性高。
- MySQL:广泛使用的开源关系型数据库,性能稳定,社区活跃。
二、开发环境准备
1. 开发工具与依赖安装
- JDK:确保已安装Java Development Kit(建议版本8及以上)。
- Maven/Gradle:用于项目构建和依赖管理。
- IDE:推荐使用IntelliJ IDEA或Eclipse。
- MySQL:下载并安装MySQL数据库,配置好数据库连接信息。
2. Spring Boot项目初始化
- 使用 Spring Initializr 创建项目:
- Project: Maven Project
- Language: Java
- Spring Boot: 最新稳定版本
- Dependencies: Spring Web, MyBatis Framework, MySQL Driver
三、数据库设计与初始化
1. MySQL数据库表设计
创建一个简单的用户表user,包含以下字段:
CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,email VARCHAR(100),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. 数据初始化脚本
在src/main/resources目录下创建data.sql文件,插入一些测试数据:
INSERT INTO user (username, password, email) VALUES
('admin', 'password123', 'admin@example.com'),
('user1', 'password123', 'user1@example.com');
配置application.yml中的数据库连接信息:
spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
四、Spring Boot与MyBatis集成
1. MyBatis基础配置
在application.yml中添加MyBatis配置:
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.demo.entity
2. 实体类与Mapper接口开发
-
实体类:创建
User类表示用户信息。package com.example.demo.entity;public class User {private Integer id;private String username;private String password;private String email;private Timestamp createdAt;// Getters and Setters } -
Mapper接口:创建
UserMapper接口及对应的XML映射文件。package com.example.demo.mapper;import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select;@Mapper public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User findById(Integer id); }在
src/main/resources/mapper目录下创建UserMapper.xml:<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.UserMapper"><select id="findById" resultType="com.example.demo.entity.User">SELECT * FROM user WHERE id = #{id}</select> </mapper>
3. Service层与Controller层实现
-
Service层:封装业务逻辑。
package com.example.demo.service;import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;@Service public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Integer id) {return userMapper.findById(id);} } -
Controller层:提供RESTful API接口。
package com.example.demo.controller;import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController;@RestController public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users/{id}")public User getUser(@PathVariable Integer id) {return userService.getUserById(id);} }
五、CRUD功能实现
1. 创建(Create)功能
-
Mapper接口:添加插入数据的方法。
@Insert("INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email})") void insertUser(User user); -
Service层:实现新增用户逻辑。
public void createUser(User user) {userMapper.insertUser(user); } -
Controller层:提供新增用户的API接口。
@PostMapping("/users") public void createUser(@RequestBody User user) {userService.createUser(user); }
2. 读取(Read)功能
- 分页查询:使用MyBatis分页插件PageHelper。
<select id="findAllUsers" resultType="com.example.demo.entity.User">SELECT * FROM user </select>
PageHelper.startPage(pageNum, pageSize);List<User> users = userMapper.findAllUsers();PageInfo<User> pageInfo = new PageInfo<>(users);
- 动态条件查询:按用户名模糊搜索。
<select id="findUsersByUsername" resultType="com.example.demo.entity.User">SELECT * FROM user WHERE username LIKE CONCAT('%', #{username}, '%') </select>
3. 更新(Update)功能
-
Mapper接口:添加更新数据的方法。
@Update("UPDATE user SET username=#{username}, password=#{password}, email=#{email} WHERE id=#{id}") void updateUser(User user); -
Service层:实现更新用户逻辑。
public void updateUser(User user) {userMapper.updateUser(user); } -
Controller层:提供更新用户的API接口。
@PutMapping("/users/{id}") public void updateUser(@PathVariable Integer id, @RequestBody User user) {user.setId(id);userService.updateUser(user); }
4. 删除(Delete)功能
-
硬删除:直接从数据库中删除记录。
@Delete("DELETE FROM user WHERE id=#{id}") void deleteUserById(Integer id); -
软删除:添加
is_deleted字段标记删除状态。ALTER TABLE user ADD COLUMN is_deleted TINYINT DEFAULT 0;
@Update("UPDATE user SET is_deleted=1 WHERE id=#{id}")void softDeleteUserById(Integer id);
六、功能扩展与优化
1. 事务管理
- @Transactional注解:确保多个操作在同一事务中执行。
@Service @Transactional public class UserService {// CRUD方法 }
2. 分页与排序
-
PageHelper分页插件:实现分页查询。
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.0</version> </dependency> -
排序参数动态传入:根据请求参数进行排序。
PageHelper.startPage(pageNum, pageSize).setOrderBy(orderBy);
3. 异常处理
- 全局异常捕获:使用
@ControllerAdvice处理全局异常。@ControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());} }
七、测试与部署
1. 单元测试与集成测试
-
单元测试:编写Mapper接口测试用例。
@RunWith(SpringRunner.class) @SpringBootTest public class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testFindById() {User user = userMapper.findById(1);assertNotNull(user);} } -
集成测试:验证CRUD功能完整性。
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class UserControllerIT {@Autowiredprivate TestRestTemplate restTemplate;@Testpublic void testGetUser() {ResponseEntity<User> response = restTemplate.getForEntity("/users/1", User.class);assertEquals(HttpStatus.OK, response.getStatusCode());} }
2. 项目打包与部署
-
打包为可执行JAR文件:
mvn clean package -
部署到本地Tomcat或云服务器:
- 将生成的JAR文件上传至服务器,并通过命令启动:
java -jar myapp.jar
- 将生成的JAR文件上传至服务器,并通过命令启动:
相关文章:
Spring Boot + MyBatis + MySQL:快速搭建CRUD应用
一、引言 1. 项目背景与目标 在现代Web开发中,CRUD(创建、读取、更新、删除)操作是几乎所有应用程序的核心功能。本项目旨在通过Spring Boot、MyBatis和MySQL技术栈,快速搭建一个高效、简洁的CRUD应用。我们将从零开始ÿ…...
日新F1、瑞研F600P 干线光纤熔接(熔接损耗最大0.03DB)
Ⅰ. 设备特性对比与实测验证 1. 日新F1(两马达)极限参数 切割角度:必须≤0.3(双边累计误差<0.6) ▶ 实测案例:切割0.35时,损耗波动达0.05-0.08dB(超干线标准)…...
分布式网络
分布式网络(Distributed Network)指的是一种计算机网络架构,其中计算资源(计算、存储、数据处理等)分布在多个物理或逻辑上的节点上,而不是集中在单一的服务器或数据中心中。这种架构的主要目标是提高系统的…...
【招聘精英】
我们公司是一个位于石家庄的一个科技型新型技术公司。主要做人力资源、用工、科技等方面。 有意向回石家庄的或者已经在石家庄的技术大咖、软件大牛、产品大佬、UI大神可以来了解一下。 现在招聘 高级前端开发 高级java开发 其他岗位也可以联系。 有意向的朋友可以私信我。 -…...
ESP8266 NodeMCU 与 Atmega16 微控制器连接以发送电子邮件
NodeMCU ESP8266 AVR 微控制器 ATmega16 的接口 Atmega16 是一款低成本的 8 位微控制器,比以前版本的微控制器具有更多的 GPIO。它具有所有常用的通信协议,如 UART、USART、SPI 和 I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业有广泛的应用。 Atmega1…...
MongoDB用户管理和复制组
用户管理 1、建用户时,use到的库就是此用户的验证库 2、登录时必须明确指定验证库才能登录 3、通常管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库 4、如果直接登录到数据库,不进行use(示例ÿ…...
GoLang的select是什么?在什么时候场景下用
在 Go 语言中,select 是专门用于处理通道(Channel)多路复用的关键字,它可以同时监听多个通道的读写操作,并根据就绪的通道执行对应的逻辑。以下是 select 的用法和典型应用场景: 一、基本用法 select 语法…...
SQLAlchemy系列教程:集成Pydantic增强数据处理能力
本教程介绍如何将Pydantic用于数据验证,SQLAlchemy用于数据库操作,从而通过强大的数据处理能力增强Python应用程序。 介绍 在现代web开发中,确保数据的有效性和完整性至关重要。Pydantic和SQLAlchemy是两个功能强大的Python库,可…...
【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题
1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点&…...
python中httpx库的详细使用及案例
文章目录 1. 安装 httpx2. 同步请求3. 异步请求4. 高级功能5. 错误处理6. 配置客户端7. 结合 Beautiful Soup 使用8. 示例:抓取并解析网页9. 注意事项httpx 是一个现代化的 Python HTTP 客户端库,支持同步和异步请求,功能强大且易于使用。它比 requests 更高效,支持 HTTP/2…...
IP,MAC,ARP 笔记
1.什么是IP地址 IP 地址是一串由句点分隔的数字。IP 地址表示为一组四个数字,比如 192.158.1.38 就是一个例子。该组合中的每个数字都可以在 0 到 255 的范围内。因此,完整的 IP 寻址范围从 0.0.0.0 到 255.255.255.255。 IP 地址不是随机的。它们由互…...
【记录】Python3|Linux下安装Virtualenv和virtualenvwrapper用于处理虚拟环境
之前写过一篇Anaconda的:【安装】Python3|Windows下安装Anaconda、pytorch,以及修改pip默认安装路径_anaconda pip修改安装的包路径-CSDN博客 还写过一篇专门讲所有虚拟环境的:【记录】环境|Ubuntu18.04 Python 开发环…...
VSTO(C#)Excel开发3:Range对象 处理列宽和行高
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
Selenium库打开指定端口(9222、9333等)浏览器【已解决!!!】
就是在写动态爬虫爬取数据的过程中,如果用selenium的话,有一个缺点,就是当我们去测试一个网站能不能爬取,它都会重新换端口打开一个浏览器,不会使用上一次使用的浏览器,在实际使用过程中这样调试很烦&#…...
Redis在人员管理系统中的应用示例
用户会话管理 场景:用户登录后存储会话信息,支持多服务器共享 实现: 用户登录成功后,生成唯一Token(如JWT),作为Redis的Key Value存储用户ID、角色、权限等信息,设置过期时间&…...
蓝桥杯备考:倍增算法详解
如果我们想暴力求解的话,我们的时间复杂度是O(N)b最大是10的9次方,这时候我们一定会超时 #include <iostream> using namespace std;typedef long long LL; LL a,b,p;LL ret 1; int main() {cin >> a >> b &g…...
安徽省考计算机专业科目2025(持续更新)
目录 第一部分 计算机科学技术基础 第一章 计算机及其应用基础知识 1.1 计算机的特点、分类及其应用 1.2 信息编码与数据表示;数制及其转换方法;算术运算和逻辑运算的过程 第一部分 计算机科学技术基础 第一章 计算机及其应用基础知识 1.1 计算机…...
PostgreSQL、SQL Server和MySQL数据库性能调优与故障排除技术
通过结合具体技术特性与工具链的深度使用,可系统化提升数据库性能和稳定性。建议根据实际负载特征制定监控-分析-优化的闭环管理流程。 数据库技术: PostgreSQL 13:逻辑复制、分区表、并行查询、监控工具(如pg_stat_statements、…...
【贪心算法2】
力扣122.买卖股票最佳时机Ⅱ 链接: link 思路 要求最大利润,可以分解成子问题求解,在最低价格买入,最高价格卖出。 假如第0天价格最低,第3天价格最高,利润prices[3] - pricnes[0], 可以将利润公式拆解成 (prices[3]…...
SQL经典查询
查询不在表里的数据,一张学生表,一张学生的选课表,要求查出没有选课的学生? select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…...
## DeepSeek写水果记忆配对手机小游戏
DeepSeek写水果记忆配对手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端水果记忆配对小游戏H5文件: 要求 可以重新开始游戏 可以暂停游戏 卡片里的水果…...
Flask 框架简介
Flask 框架简介 Flask 框架简介 Flask 框架简介 Flask 是一个 Python 微型网页开发框架。微型指明了 Flash 的核心是轻量级的,但是可以灵活扩展。下面的简单的例子要和一个数据库系统交互。Django附带了与最常见的数据库交互所需的库。另一方面,Flask允…...
【GoTeams】-5:引入Docker
本文目录 1. Dokcer-compose回顾下Docker知识编写docker-compose.yaml运行docker 2. 部署go服务编写dockerfile 1. Dokcer-compose 这里简单先用一下win版本的Docker,后期开发好了部署的时候再移植到服务器下进行docker部署。 输入命令docker-compose version 就可…...
将自定义vue组件加载在Mapbox或Maplibre的marker和popup上
1. 使用场景 在开发WebGIS应用时,我们常需要将自定义UI组件与地图元素结合。本文介绍如何将Vue组件集成到Mapbox/Maplibre的Marker标记点和Popup弹窗中,实现动态交互式的地图功能。 2. 为什么需要特殊处理? 在常规开发中我们大多的处理是 …...
定时任务和分布式任务框架
文章目录 一 Spring Task1.@Scheduled注解介绍2 基本用法(1)使用@EnableScheduling修饰启动类(2)创建定时任务的类(3)fixedDelay(4)fixedRate(5)cron3 执行多个任务4 设置异步执行5 @Async使用自定义线程池6 缺点二 xxl-job介绍架构图与其他任务调度平台的比较运行调…...
GB28181视频监控流媒体平台LiveGBS如何自定义收流端口区间以便减少收流端口数或解决端口冲突问题
LiveGBS GB28181流媒体服务在接收视频的时候默认是使用30000-30249, webrtc流播放端口区间默认是UDP的30250-30500区间。有些网络环境不方便开放这么大的端口区间,下面介绍下如何修改配置这个区间。 从页面上修改这个区间,端口区间尽量设置大…...
rabbitmq-amqp事务消息+消费失败重试机制+prefetch限流
1. 安装和配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…...
Mac服务器上创建Docker并安装宝塔环境
1. 远程ssh登录服务器:ssh -o ProxyCommand"nc -X 5 -x 127.0.0.1:7890 %h %p" -i fenfaqianming.pem ec2-user54.254.XXX.XXX 2. mac服务器上需要安装Colima 3. brew install colima 4. colima start 5. colima autostart 创建mac服务器安装docker &…...
golang 从零单排 (一) 安装环境
1.下载安装 打开网址The Go Programming Language 直接点击下载go1.24.1.windows-amd64.msi 下载完成 直接双击下一步 下一步 安装完成 环境变量自动设置不必配置 2.验证 win r 输入cmd 打开命令行 输入go version...
康谋分享 | 3DGS:革新自动驾驶仿真场景重建的关键技术
随着自动驾驶技术的迅猛发展,构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下,3D高斯点阵渲染(3DGS)技术应运而生,成为自动驾驶仿真场景重…...
