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,创建项目

- 选择springboot,选择jdk1.8

- 输入项目名,点击下一步

- 选择spring boot web插件

- 选择mysql数据驱动

- 完成

- 进入idea后,maven会自动下载包,点击右下角的导入包,等maven下载好后就能开始开发了

- 尝试运行

数据连接池
连接池是后台应用的「心脏起搏器」——选不好,高并发时直接心脏骤停。Druid 是阿里开源的数据库连接池,号称 Java 界最强,自带 SQL 监控、慢查询统计、防注入 Wall 过滤器,比 DBCP 和 C3P0 高出一个段位。
为什么选 Druid? 一句话:它不只是连接池,更是一个数据库监控平台。配好之后直接在
/druid 面板上看 SQL 执行情况,生产环境排查慢查询全靠它。- 创建mysql数据库test,
- 创建测试表test
- 在根目录下的pom.xml下的dependencies节点下加入下面依赖,并导入包
后面导入包也类似

- 修改src/main/resources/application.properties改名为application.yml
- 在application.yml下添加druid配置代码
- url:数据库jdbc连接 必须加入serverTimezone=UTC的参数,否则会报错
- username:数据库用户名
- password:数据库密码
- 创建config文件夹,创建DruidConfiguration.java文件 写入下面代码

- 重启web应用

- 打开 http://localhost:8080/druid/

- 点击数据源,如相关信息则集成成功

数据持久化
如果说 MyBatis 是一把瑞士军刀,那 MyBatis-Plus(简称 MP)就是给这把刀装上了电动马达——只做增强不做改变,CRUD 开箱即用,分页插件一行搞定。写完 Entity 和 Mapper 接口,剩下的事情 MP 替你干了。
- 安装依赖,pom.xml加入下面依赖,并且导入依赖
- lombok:快速开发插件,能自动生成get和set方法
- mybatis-plus-boot-starter:mp
- config文件夹下创建MyBatisConfig文件,写入下面代码

- 重启springboot,如无报错则进行下一步 4. 编写测试类
test.java
TestMapper.java
SampleTest.java
- 运行测试类,如控制台输出相应结果则集成成功,本例数据库里没数据所以输出0

代码生成器
程序员最讨厌的事情之一:重复写 Entity → Mapper → Service → Controller 这套四件套。好消息是,MyBatis-Plus Generator 可以一键生成全部代码,连 CRUD 接口都帮你实现好了。真正的「一行命令,四层代码」。
效率提示: 代码生成器配合模板引擎(Freemarker / Velocity)使用,还能自定义生成模板,按团队规范输出代码。
- 引入依赖 pom.xml文件下添加下列依赖
- 创建CodeGenerator.java

配置好数据库信息后进行下一步
3. 运行代码生成器
输入需要生成的表名,多个表用逗号分隔,这里使用前面的test表作为例子

运行完毕后,将生成entity,dao,service,control的接口与实现类

- 修改生成后的文件
给dao类加上@mapper注解,否则mybatis将找不到这个类,无法进行注入,加上@Repository注解解决idea错误提示
修改TestMapper,在类名上添加@Mapper
- 测试
修改control类代码,来测试接口是否可用, 修改TestController:添加一个test函数
重启服务,浏览器上访问 http://localhost:8080/test/test/index
正确返回

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

- 修改controller代码 修改上文创建的TestController.java,给类添加@Api注解,给api方法添加@ApiOperation注解
- 重启服务器 访问 http://localhost:8080/doc.html (如果你配置的swagger2服务器是http://localhost:8080/) swagger2已经自动生成了api文档

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

- 创建Result.java
- 创建ApiResponse.java
- 在controller里使用 返回成功请求:
返回失败请求:
权限认证系统
后台没有权限认证,就像房子没有锁——谁都能进来翻你的抽屉。本节将搭建一套 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,就像这样:
认证过程
授权过程
- 用户使用用户名密码来请求服务器登录API
- 服务器进行验证用户的信息
- 服务器通过验证发送给用户一个jwt token
- 客户端存储jwt token,并在每次请求时附送上这个jwt token值
鉴权过程
- 客户端:客户端请求时将jwt token作为头发送给服务器
- 服务器:
- 头部是否带有token
- 有
- 验证token, 验证权限,验证角色
- 没有
- 返回错误信息
集成JWT
- 在pom.xml下添加下列依赖,并且安装
- 在utils文件夹下创建jwt文件夹
- 创建JWTToekn.java
- 创建JWTUtil.java
- 使用方法 签发token
验证token
集成Shiro
- 创建相关的数据库表,本文使用mysql 用户表:
角色表:
权限表:
角色-用户关系表:
角色-权限关系表:
- 插入测试数据
- 使用代码生成器生成代码 使用代码生成器生成五个表的mapper,service,controller

- 修改每个表的mapper,在类上面加上@Mapper注解和@Repository注解
SysPermissionMapper.java
5. 添加登录api与测试api
修改user的server接口
ISysUserService.java
修改user的server接口实现类
SysUserServiceImpl.java
修改user的controller
SysUserController.java
- 在pom.xml下添加依赖并且安装包
- 在config文件夹下创建shiro文件夹

- 创建ShiroFilter
- 创建ShiroRealm.java
- 创建ShiroConfig.java
- 创建exception文件夹

- 创建ShiroExceptionHandeler.java 全局拦截shiro异常并且返回对应的错误信息
- 测试 运行springboot应用,打开http://localhost:8080/doc.html 访问登录api 将返回来的token设置成全局参数 测试需要permission1权限才能访问api,验证通过 测试需要role1角色才能访问api,验证通过 测试需要role2角色才能访问api,验证不通过





结语
到这里,我们从零搭建了一套完整的 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,拥抱新特
