Spring Boot + MyBatis 实现 RESTful API 的完整流程


后端开发:Spring Boot 快速开发实战

引言

在现代后端开发中,Spring Boot 因其轻量级、快速开发的特性而备受开发者青睐。本文将带你从零开始,使用 Spring Boot + MyBatis 实现一个完整的 RESTful API,并深入探讨如何优雅地处理异常和日志记录。无论你是初学者还是有一定经验的开发者,这篇笔记都能为你提供实用的知识点。


一、环境准备

1. 安装依赖工具

确保你已经安装了以下工具:

  • JDK 8 或更高版本
  • Maven(构建工具)
  • IDE(如 IntelliJ IDEA 或 VS Code)

2. 创建 Spring Boot 项目

使用 Spring Initializr 快速生成项目骨架:

  1. 访问 Spring Initializr 网站。
  2. 配置项目信息:
    • Project: Maven Project
    • Language: Java
    • Spring Boot: 最新稳定版本
    • Dependencies: 添加 Spring Web, MyBatis Framework, MySQL Driver
  3. 下载并解压项目,导入到 IDE 中。

二、Spring Boot + MyBatis 实现 RESTful API 的完整流程

1. 数据库设计

假设我们要开发一个简单的用户管理系统,包含以下字段:

  • id (主键)
  • name (用户名)
  • email (邮箱)
SQL 脚本
CREATE DATABASE user_management;USE user_management;CREATE TABLE users (id BIGINT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE
);

2. 配置数据库连接

application.properties 文件中配置 MySQL 数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/user_management?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# MyBatis 配置
mybatis.mapper-locations=classpath:mapper/*.xml

3. 创建实体类

创建一个 User 实体类,与数据库表对应:

package com.example.demo.entity;public class User {private Long id;private String name;private String email;// Getters and Setters
}

4. 创建 Mapper 接口

使用 MyBatis 的注解或 XML 配置方式定义数据访问层接口:

package com.example.demo.mapper;import com.example.demo.entity.User;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper
public interface UserMapper {@Select("SELECT * FROM users")List<User> findAll();@Select("SELECT * FROM users WHERE id = #{id}")User findById(Long id);@Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id")void insert(User user);@Update("UPDATE users SET name=#{name}, email=#{email} WHERE id=#{id}")void update(User user);@Delete("DELETE FROM users WHERE id=#{id}")void delete(Long id);
}

5. 创建 Service 层

封装业务逻辑,调用 Mapper 接口:

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;import java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getAllUsers() {return userMapper.findAll();}public User getUserById(Long id) {return userMapper.findById(id);}public void createUser(User user) {userMapper.insert(user);}public void updateUser(User user) {userMapper.update(user);}public void deleteUser(Long id) {userMapper.delete(id);}
}

6. 创建 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.*;import java.util.List;@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> getAllUsers() {return userService.getAllUsers();}@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getUserById(id);}@PostMappingpublic void createUser(@RequestBody User user) {userService.createUser(user);}@PutMapping("/{id}")public void updateUser(@PathVariable Long id, @RequestBody User user) {user.setId(id);userService.updateUser(user);}@DeleteMapping("/{id}")public void deleteUser(@PathVariable Long id) {userService.deleteUser(id);}
}

三、如何优雅地处理异常和日志记录?

1. 全局异常处理

使用 @ControllerAdvice 注解实现全局异常处理,避免重复代码:

package com.example.demo.exception;import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception ex) {return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);}
}

自定义异常类:

package com.example.demo.exception;public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

2. 日志记录

使用 SLF4JLogback 记录日志,便于调试和问题追踪:

package com.example.demo.controller;import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/api/users")
public class UserController {private static final Logger logger = LoggerFactory.getLogger(UserController.class);@Autowiredprivate UserService userService;@GetMappingpublic List<User> getAllUsers() {logger.info("Fetching all users");return userService.getAllUsers();}@PostMappingpublic void createUser(@RequestBody User user) {logger.info("Creating user: {}", user);userService.createUser(user);}
}

四、总结

通过本文,我们完成了以下内容:

  1. 使用 Spring Boot 和 MyBatis 实现了一个完整的 RESTful API。
  2. 学习了如何优雅地处理异常和记录日志。

这些技能是后端开发的核心能力,能够帮助你在实际项目中快速构建高效、稳定的系统。希望这篇文章能为你提供实用的指导,并助力你在以后的只有我道路上有目标,向钱进!

参考链接

  • Spring Boot 官方文档
  • MyBatis 官方文档
  • RESTful API 设计指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python开发以太坊智能合约:轻松入门与深度探索

使用Python开发以太坊智能合约&#xff1a;轻松入门与深度探索 随着区块链技术的快速发展&#xff0c;以太坊作为最为成熟和广泛使用的智能合约平台&#xff0c;成为了开发去中心化应用&#xff08;DApp&#xff09;的核心工具。智能合约不仅是区块链技术的基础&#xff0c;更…

ES scroll=1m:表示快照的有效时间为1分钟。怎么理解

在Elasticsearch中&#xff0c;scroll1m 表示你创建的 scroll 上下文 的有效时间为 1分钟。这个参数控制了你可以在多长时间内继续使用这个 scroll_id 来获取更多的数据。 什么是 Scroll 上下文&#xff1f; 当你使用 scroll API 时&#xff0c;Elasticsearch 会为你的查询创…

Linux与UDP应用1:翻译软件

UDP应用1&#xff1a;翻译软件 本篇介绍 本篇基于UDP编程接口基本使用中封装的服务器和客户端进行改写&#xff0c;基本功能如下&#xff1a; 从配置文件dict.txt读取到所有的单词和意思客户端向服务端发送英文服务端向客户端发送英文对应的中文意思 配置文件内容 下面的内…

Jeecg-Boot 开放接口开发实战:在 Jeecg-Boot 的jeecg-system-biz中添加一个controller 实现免鉴权数据接口

Jeecg-Boot 开放接口开发实战&#xff1a;在 Jeecg-Boot 的jeecg-system-biz中添加一个controller 实现免鉴权数据接口 一、场景需求分析 在微服务架构中&#xff0c;常需要快速实现以下两类接口&#xff1a; 开放接口&#xff1a;无需登录即可访问&#xff08;如数据查询、…

C++ ++++++++++

初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时&#xff0c;必须要指定出相应的数据类型&#xff0c;否则无法给变量分配内存 整型 sizeof关键字 浮点型&#xff08;实型&#xff09; 有效位数保留七位&#xff0c;带小数点。 这个是保…

构建安全的Docker基础镜像:从最佳实践到自动化加固

引言 容器化技术的普及使得Docker镜像成为软件交付的核心载体,但镜像中的安全漏洞、敏感信息泄露和权限配置不当等问题可能引发严重风险。本文结合OWASP容器安全指南与一线运维经验,系统化讲解如何构建安全的Docker基础镜像,覆盖镜像构建、依赖管理、运行时防护全链路,并提…

BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab

BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab 目录 BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab分类效果基本介绍BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目…

SOLID Principle基础入门

(Robert C. Martin (Uncle Bob)) 什么是SOLID原则&#xff1f; SOLID原则是面向对象编程&#xff08;OOP&#xff09;中编写高质量代码的指导方针。实际上&#xff0c;即使不使用SOLID原则&#xff0c;仅通过类、继承、封装和多态性&#xff0c;也可以让程序正常运行。那么为…

轻松实现语音生成:GPT-SoVITS V2整合包的远程访问操作详解

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天要给大家安利一个绝对能让你大呼过瘾的声音黑科技——GPT-SoVITS&#xff01;这款由花儿不哭大佬精心打造的语音克隆神…

Python线程池知多少

目录 目标 Python版本 官方文档 概述 线程池 实战 创建线程池的基本语法 批量提交任务 生产者&消费者模型 目标 掌握线程池的基本概念和使用方法。 Python版本 Python 3.9.18 官方文档 concurrent.futures — Launching parallel taskshttps://docs.python.org/3…

(转)SpringBoot和SpringCloud的区别

&#xff08;转&#xff09;SpringBoot和SpringCloud的区别&#xff1a;

中科大 计算机网络组成原理 1.4 接入网和物理媒体 笔记

一、接入网核心功能与架构 ‌核心作用‌ 接入网是连接用户终端与核心网络的桥梁&#xff0c;承担用户身份认证、带宽分配、数据加密等功能&#xff0c;直接影响网络服务的可靠性和用户体验。例如&#xff0c;杭州电视台的数字人主播通过光纤专线实现零失误新闻播报&#xff0c;…

阿里云音频算法岗内推

1、视频云直播、连麦&#xff0c;点播&#xff0c;短视频&#xff0c;媒体生产与处理等服务相关的实时/非实时的音频分析和处理&#xff1b; 2、音频处理算法&#xff0c;包括多场景降噪、自动增益控制、回声消除等&#xff1b; 3、音频特效算法研发&#xff0c;包括变调变速…

如何使用DeepSeek辅助准备面试

前言 又到了金三银四的时间点了。每年的这个时间点都会出现无数的机遇和机会&#xff0c;但是如何准备面试&#xff0c;应该准备哪些面试题&#xff0c;如何查漏补缺我们的技术面的短板&#xff0c;这是我们每次准备面试的时候&#xff0c;都会遇见的问题。在今年&#xff0c;…

如何流畅访问github

1.传输数据原理 本地计算机通过本地网接入运营骨干网&#xff0c;经过DNS域名解析&#xff0c;将输入的字符解析为要连接的真实IP地址&#xff0c;服务器返还一个数据包(github)给计算机 2.原因 DNS域名污染-DNS解析出现问题&#xff0c;导致访问一个不存在的服务器 3.解决…

JPA属性转换器的使用与实例解析

在Java持久化框架中&#xff0c;JPA&#xff08;Java Persistence API&#xff09;为我们提供了强大的功能来操作数据库。其中&#xff0c;属性转换器&#xff08;Attribute Converter&#xff09;是一个非常实用的特性&#xff0c;它允许我们将实体类中的属性类型转换为适合存…

AI数据分析:用DeepSeek做数据清洗

在当今数据驱动的时代&#xff0c;数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展&#xff0c;AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行数据清洗。 数据清洗是数据分析的基础&#xff0c;其目的是…

rust学习~tokio的io

await Suspend execution until the result of a Future is ready. 暂停执行&#xff0c;直到一个 Future 的结果就绪。 .awaiting a future will suspend the current function’s execution until the executor has run the future to completion. 对一个 Future 使用 .awa…

腾讯2025年软件测试面试题

以下是基于腾讯等一线互联网公司软件测试岗位的面试趋势和技术要求,025年出现的软件测试面试题。这些问题涵盖了基础知识、自动化测试、性能测试、安全测试、编程能力等多个方面,供参考和准备。 一、基础知识 软件测试的基本概念

数据结构(陈越,何钦铭) 第四讲 树(中)

4.1 二叉搜索树 4.1.1 二叉搜索树及查找 Position Find(ElementTyoe X,BinTree BST){if(!BST){return NULL;}if(X>BST->Data){return Find(X,BST->Right)}else if(X<BST->Data){return Find(X,BST->Left)}else{return BST;} } Position IterFind(ElementTyp…