SpringBoot 快速开发API后台

Words 6292Read Time 16 min
2018-4-20
2026-2-11
cover
type
Post
status
Published
date
Apr 20, 2018 21:28
slug
summary
本文以小程序后台为背景,演示了如何用 SpringBoot 快速搭建一套生产就绪的 API 脚手架。全文覆盖六大核心模块:Druid 数据库连接池(含监控面板配置)、MyBatis-Plus 持久层(零 CRUD 手写)、代码生成器(一键生成四层代码)、Swagger2 动态 API 文档统一返回格式与异常处理,以及 JWT + Shiro 无状态权限认证体系(用户-角色-权限三级模型)。每个模块均提供完整的依赖配置、核心代码与运行截图,读者可按步骤直接复现。适合希望快速启动中小型 Java Web 项目的后端开发者。
tags
Java
Spring
category
Development
icon
password
wordCount
4436
每个后端开发者的心中,都住着一个「写完 CRUD 就下班」的梦想。本文将带你用 SpringBoot 搭建一套开箱即用的 API 后台脚手架——从数据连接池、ORM、代码生成器,到 Swagger 文档、统一返回格式,再到 JWT + Shiro 权限认证,一篇打通任督二脉。读完之后,你的小程序后台可能比你想象中来得更快。
🔑
本文核心技术栈
  • 核心框架: SpringBoot
  • 连接池: Druid(阿里出品,自带监控面板)
  • ORM: MyBatis-Plus(告别手写 CRUD)
  • 代码生成: MyBatis-Plus Generator + Freemarker
  • API 文档: Swagger2 + Knife4j UI
  • 权限认证: Shiro + JWT(无状态、跨域友好)

实验环境

  • Windows10
  • Jdk-1.8
  • MySQL 7

实验目标

最近在写自己的小程序,后台是绕不过去的坎儿。与其从零搬砖,不如站在巨人的肩膀上——围绕 敏捷开发 的思想,尽可能少写 CRUD,把宝贵的时间留给核心业务逻辑。
最终选定了以下「全家桶」组合:
层面
选型
一句话理由
核心框架
SpringBoot
约定优于配置,开箱即用
数据连接池
Druid
自带监控面板,生产可观测
持久层
MyBatis-Plus
CRUD 自动生成,告别重复劳动
权限控制
Shiro + JWT
无状态认证,天然支持跨域
API 文档
Swagger2
接口自动生成文档,前后端协作神器
再辅以 统一 API 返回格式全局异常处理,开发起来又快又安全。

环境准备

  • 安装Jdk1.8
  • Maven

创建项目

这里仅演示用idea创建项目 1. 打开idea,创建项目
notion image
  1. 选择springboot,选择jdk1.8
notion image
  1. 输入项目名,点击下一步
notion image
  1. 选择spring boot web插件
notion image
  1. 选择mysql数据驱动
notion image
  1. 完成
notion image
  1. 进入idea后,maven会自动下载包,点击右下角的导入包,等maven下载好后就能开始开发了
notion image
  1. 尝试运行
notion image

数据连接池

连接池是后台应用的「心脏起搏器」——选不好,高并发时直接心脏骤停。Druid 是阿里开源的数据库连接池,号称 Java 界最强,自带 SQL 监控、慢查询统计、防注入 Wall 过滤器,比 DBCP 和 C3P0 高出一个段位。
📊
为什么选 Druid? 一句话:它不只是连接池,更是一个数据库监控平台。配好之后直接在 /druid 面板上看 SQL 执行情况,生产环境排查慢查询全靠它。
  1. 创建mysql数据库test,
    1. 创建测试表test
      1. 在根目录下的pom.xml下的dependencies节点下加入下面依赖,并导入包
        1. 后面导入包也类似
          notion image
       
      1. 修改src/main/resources/application.properties改名为application.yml
      1. 在application.yml下添加druid配置代码
          • url:数据库jdbc连接 必须加入serverTimezone=UTC的参数,否则会报错
            • username:数据库用户名
            • password:数据库密码
        1. 创建config文件夹,创建DruidConfiguration.java文件 写入下面代码
          1. notion image
        1. 重启web应用
          1. notion image
        1. 打开 http://localhost:8080/druid/
          1. notion image
        1. 点击数据源,如相关信息则集成成功
          1. notion image

        数据持久化

        如果说 MyBatis 是一把瑞士军刀,那 MyBatis-Plus(简称 MP)就是给这把刀装上了电动马达——只做增强不做改变,CRUD 开箱即用,分页插件一行搞定。写完 Entity 和 Mapper 接口,剩下的事情 MP 替你干了。
        1. 安装依赖,pom.xml加入下面依赖,并且导入依赖
            • lombok:快速开发插件,能自动生成get和set方法
            • mybatis-plus-boot-starter:mp
          1. config文件夹下创建MyBatisConfig文件,写入下面代码
            1. notion image
          1. 重启springboot,如无报错则进行下一步 4. 编写测试类
            1. test.java
              TestMapper.java
              SampleTest.java
           
          1. 运行测试类,如控制台输出相应结果则集成成功,本例数据库里没数据所以输出0
            1. notion image

          代码生成器

          程序员最讨厌的事情之一:重复写 Entity → Mapper → Service → Controller 这套四件套。好消息是,MyBatis-Plus Generator 可以一键生成全部代码,连 CRUD 接口都帮你实现好了。真正的「一行命令,四层代码」。
          效率提示: 代码生成器配合模板引擎(Freemarker / Velocity)使用,还能自定义生成模板,按团队规范输出代码。
          1. 引入依赖 pom.xml文件下添加下列依赖
            1. 创建CodeGenerator.java
              1. notion image
                配置好数据库信息后进行下一步
            3. 运行代码生成器
            输入需要生成的表名,多个表用逗号分隔,这里使用前面的test表作为例子
            notion image
            运行完毕后,将生成entity,dao,service,control的接口与实现类
            notion image
            1. 修改生成后的文件
              1. 给dao类加上@mapper注解,否则mybatis将找不到这个类,无法进行注入,加上@Repository注解解决idea错误提示 修改TestMapper,在类名上添加@Mapper
            1. 测试
              1. 修改control类代码,来测试接口是否可用, 修改TestController:添加一个test函数
                重启服务,浏览器上访问 http://localhost:8080/test/test/index 正确返回
                notion image

            动态API文档

            前后端分离时代,最怕的不是写接口,而是写接口文档——写完还容易过时。Swagger2 直接从代码注解中自动生成 API 文档,实时同步、在线调试,前端同学再也不用追着你问「这个接口参数到底是什么」了。
            1. 引入依赖 pom.xml下添加以下依赖
              1. 添加swagger2配置 修改application.yml,添加下面配置信息
                  • base-package:需要扫描的API方法的包名
                    • title:swagger2标题
                    • description: swagger2描述
                    • terms-ServiceUrl:swagger2访问地址
                    • contact:联系方式
                    • version:版本号
              1. 创建SwaggerConfiguration 在config文件夹下创建SwaggerConfiguration.java,并添加下面代码
                1. notion image
              1. 修改controller代码 修改上文创建的TestController.java,给类添加@Api注解,给api方法添加@ApiOperation注解
                1. 重启服务器 访问 http://localhost:8080/doc.html (如果你配置的swagger2服务器是http://localhost:8080/) swagger2已经自动生成了api文档
                  1. notion image

                统一返回接口

                想象一下:前端同学收到的接口返回,有时候是字符串,有时候是 JSON,有时候直接是个异常堆栈……沟通成本直接拉满。统一返回格式就是给所有 API 穿上「校服」——不管成功还是失败,都用 {code, msg, data} 三件套,前端拿到手就知道怎么处理。
                1. 创建utils文件夹,创建result文件夹
                  1. notion image
                1. 创建Result.java
                  1. 创建ApiResponse.java
                    1. 在controller里使用 返回成功请求:
                      1. 返回失败请求:

                    权限认证系统

                    后台没有权限认证,就像房子没有锁——谁都能进来翻你的抽屉。本节将搭建一套 JWT + Shiro 的无状态认证体系,让你的 API 既安全又优雅。

                    JWT认证

                    传统的 Session 认证把用户状态存在服务端,扩展性差,跨域也麻烦。而 JWT(JSON Web Token) 是一种基于 JSON 的开放标准(RFC 7519),把认证信息直接编码在 Token 里,服务端无需存储会话——天然适合 RESTful API 和分布式架构。
                    🔐
                    Session vs JWT 对比
                    维度
                    Session 认证
                    JWT 认证
                    状态
                    有状态(服务端存储)
                    无状态(Token 自包含)
                    跨域
                    需要额外处理
                    天然支持
                    扩展性
                    需要 Session 共享
                    任意节点可验证
                    适用场景
                    传统 Web 应用
                    RESTful API / 微服务 / SSO
                    JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。就像这样:
                    第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature). 而JWT解密出来后是一个JSON,就像这样:

                    认证过程

                    授权过程

                    1. 用户使用用户名密码来请求服务器登录API
                    1. 服务器进行验证用户的信息
                    1. 服务器通过验证发送给用户一个jwt token
                    1. 客户端存储jwt token,并在每次请求时附送上这个jwt token值

                    鉴权过程

                    • 客户端:客户端请求时将jwt token作为头发送给服务器
                    • 服务器:
                      • 头部是否带有token
                          • 验证token, 验证权限,验证角色
                        • 没有
                          • 返回错误信息

                    集成JWT

                    1. 在pom.xml下添加下列依赖,并且安装
                      1. 在utils文件夹下创建jwt文件夹
                      1. 创建JWTToekn.java
                        1. 创建JWTUtil.java
                          1. 使用方法 签发token
                            1. 验证token

                          集成Shiro

                          1. 创建相关的数据库表,本文使用mysql 用户表:
                            1. 角色表:
                              权限表:
                              角色-用户关系表:
                              角色-权限关系表:
                          1. 插入测试数据
                            1.  
                          1. 使用代码生成器生成代码 使用代码生成器生成五个表的mapper,service,controller
                          notion image
                          1. 修改每个表的mapper,在类上面加上@Mapper注解和@Repository注解
                            1. SysPermissionMapper.java
                          5. 添加登录api与测试api
                          修改user的server接口
                          ISysUserService.java
                          修改user的server接口实现类 SysUserServiceImpl.java
                          修改user的controller SysUserController.java
                           
                          1. 在pom.xml下添加依赖并且安装包
                            1. 在config文件夹下创建shiro文件夹
                              1. notion image
                            1. 创建ShiroFilter
                              1. 创建ShiroRealm.java
                                1. 创建ShiroConfig.java
                                  1. 创建exception文件夹
                                    1. notion image
                                  1. 创建ShiroExceptionHandeler.java 全局拦截shiro异常并且返回对应的错误信息
                                    1. 测试 运行springboot应用,打开http://localhost:8080/doc.html 访问登录api 将返回来的token设置成全局参数 测试需要permission1权限才能访问api,验证通过 测试需要role1角色才能访问api,验证通过 测试需要role2角色才能访问api,验证不通过
                                      1. notion image
                                        notion image
                                        notion image
                                        notion image
                                        notion image

                                    结语

                                    到这里,我们从零搭建了一套完整的 SpringBoot API 后台脚手架。回顾一下这趟旅程:
                                    • Druid 帮我们管好了数据库连接,还附赠了一个监控面板
                                    • MyBatis-Plus 消灭了 90% 的 CRUD 样板代码
                                    • 代码生成器 让 Entity → Mapper → Service → Controller 四层代码一键到位
                                    • Swagger2 让接口文档永远不过时
                                    • 统一返回格式 终结了前后端的「接口格式混乱战争」
                                    • JWT + Shiro 给整个系统上了一把靠谱的锁
                                    这套组合拳的核心思想就是:把重复劳动交给工具,把创造力留给自己。当你的脚手架搭好之后,后续每新增一个业务模块,可能只需要几分钟就能跑通基本的增删改查——剩下的时间,去写真正有价值的业务逻辑吧。
                                    🚀
                                    下一步可以探索的方向:
                                    • 接入 Redis 做缓存与 Token 黑名单
                                    • 使用 Spring AOP 实现操作日志记录
                                    • 集成 MinIO / OSS 做文件上传
                                    • 升级到 SpringBoot 3.x + JDK 17,拥抱新特
                                    Loading...