当前位置: 首页 > article >正文

MyBatis-Plus一站式增强组件MyBatis-Plus-kit(更新2.0版本):零Controller也能生成API?

MyBatis-Plus-Kit

🚀 MyBatis-Plus-Kit 是基于MyBatis-Plus的增强组件,专注于提升开发效率,支持零侵入、即插即用的能力扩展。它聚焦于 免写 Controller、代码一键生成、通用响应封装 等核心场景,让您只需专注业务建模,繁琐的样板代码交给我们自动完成。项目地址请添加图片描述

✨ 特性

  • ✅ 动态代理生成 RESTful API,实现零Controller编码

    在实体类上添加 @AutoApi 注解,即可自动生成完整 CRUD 接口,无需手写 Controller。

  • ✅ 支持手动继承 BaseController 进行个性化定制

    如需特殊接口或权限控制,可继承 BaseController 自定义扩展。

  • ✅ 支持一键生成所有代码

    包括实体类、Mapper、Service、Controller 等,并自动添加 @AutoApi 注解,开箱即用。

  • ✅ 统一分页模型

    提供 PageQuery + PageResult 模型,统一分页请求和响应结构。

  • ✅ 自动封装响应体

    可配置开启或关闭,对所有 Controller 返回值进行统一包装。

  • ✅ 统一异常捕获机制

    提供全局异常处理,支持自定义异常配置。

  • ✅ 无侵入设计,可按需引入功能

🧩 模块结构

mybatis-plus-kit
├── kit-core       // 核心能力,动态代理,通用Service、Controller、分页、封装等
├── kit-starter    // Spring Boot Starter,自动装配、配置处理、响应/异常支持
├── kit-example    // 示例模块,演示如何使用kit-core + kit-starter
├── kit-generator    // 代码生成器,一键生成entity,service,mapper,controller

📦 快速开始

  1. 引入依赖(Maven Central)
<dependency><groupId>io.github.l4vid4</groupId><artifactId>kit-starter</artifactId><version>0.2.0</version>
</dependency>
<dependency><groupId>io.github.l4vid4</groupId><artifactId>kit-generator</artifactId><version>0.2.0</version>
</dependency>
  1. 新建Test.java,配置代码生成器参数,运行生成所有代码
public class Test {public static void main(String[] args) {// 数据库链接(必填)String url = "jdbc:mysql://192.168.56.10:3306/mp?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai"; String username = "root";String password = "root";// 生成Entity,Service,Mappernew CodeGenerator().dataSource(url, username, password).packageName("io.github.l4vid4.example") //包名(必填).module("kit-example") //模块名.tables("user") //表名,支持传多个表(必填).author("l4vid4") //用户名.build().execute();//        // 生成Controller
//        new ControllerGenerator()
//                .dataSource(url, username, password)
//                .packageName("io.github.l4vid4.example")
//                .module("kit-example")
//                .tables("user1")
//                .author("l4vid4")
//                .build()
//                .execute();}
}
  • 生成的代码示例:

    • entity
    @TableName(value ="user")
    @Data
    @AutoApi(path = "/user")
    public class User implements Serializable {/*** 用户id*/@TableId(type = IdType.AUTO)private Long id;/*** 用户名*/private String username;/*** 密码*/private String password;
    }
    
    • service
    public interface UserService extends BaseService<User> {}
    
    • serviceImpl
    @Service
    public class UserServiceImpl extends BaseServiceImpl<UserMapper, User>implements UserService {}
    
    • mapper
    @Mapper
    public interface UserMapper extends BaseMapper<User> {}
    
  1. 可以在entity上加上@DisableApis(Api.GET_BY_ID)动态控制不想暴露的API
@TableName(value ="user")
@Data
@DisableApis(Api.GET_BY_ID)
@AutoApi(path = "/user")
public class User implements Serializable {/*** 用户id*/@TableId(type = IdType.AUTO)private Long id;/*** 用户名*/private String username;/*** 密码*/private String password;
}
  1. 如果不想使用动态代理的功能暴露API,也可以将@AutoApi(path = "/user")加上mode = AutoApiMode.EXTENDS,然后手动继承BaseController也会实现所有方法
@RestController
@RequestMapping("/user")
@DisableApis({DisableApis.Api.DELETE, DisableApis.Api.UPDATE}) //自定义不想暴露的接口
public class UserController extends BaseController<User, UserService> {//重写User → UserVO转换方法@Overrideprotected Function<User, UserVO> voConvertor() {return user -> {UserVO userVO = new UserVO();BeanUtils.copyProperties(user, userVO);return userVO;};}
}

配置完上述所有后,自动拥有所有增删改查方法。

  • 可以在entity或Controller类上加上@DisableApis({DisableApis.Api.DELETE, DisableApis.Api.UPDATE}) 自定义不想暴露的接口
HTTP 方法接口路径方法名称功能描述是否可禁用(通过注解)
GET/user/getById/{id}getById根据 ID 查询单个实体GET_BY_ID
GET/user/listlist查询所有数据(不分页)LIST
GET/user/listByIdslistByIds根据 ID 集合批量查询(不分页)LIST_BY_IDS
POST/user/listByConditionlistByCondition根据实体字段进行条件查询(不分页)LIST_BY_CONDITION
POST/user/pagepage分页查询实体(返回实体 T)PAGE
POST/user/pageVopageVo分页查询(返回 VO,默认无转换)PAGE_VO
POST/user/savesave新增数据SAVE
POST/user/updateupdate更新数据(根据 ID)UPDATE
GET/user/deleteById/{id}deleteById删除单条数据(根据 ID)DELETE_BY_ID
POST/user/deletedelete批量删除(根据 ID 集合)DELETE

🧾 通用分页组件

分页参数类

@Data
public class PageQuery {private Integer pageNo; // 页码private Integer pageSize; // 每一页数据量private String sortBy; // 排序字段private Boolean isAsc; // 是否正序// 将分页条件转换为Page<T>public <T> Page<T> toMpPage(OrderItem ... orders){}// 默认分页条件public <T> Page<T> toMpPage(String defaultSortBy, boolean isAsc){}// 按照create_time字段降序public <T> Page<T> toMpPageDefaultSortByCreateTimeDesc() {}// 按照update_time字段降序public <T> Page<T> toMpPageDefaultSortByUpdateTimeDesc() {}
}

分页响应类

@Data
@AllArgsConstructor
public class PageResult<T> {private Long total;  //总条数private Long pages; // 总页数private List<T> list; // 数据// 返回空分页结果public static <V, P> PageResult<V> empty(Page<P> p){}//将MybatisPlus分页结果转为 VO分页结果public static <V, P> PageResult<V> of(Page<P> p, Class<V> voClass) {}//将MybatisPlus分页结果转为 VO分页结果,允许用户自定义PO到VO的转换方式public static <V, P> PageResult<V> of(Page<P> p, Function<P, V> convertor) {}
}

⚙️ 配置项说明(application.yml

mybatis-plus-kit:response-wrapper-enabled: true  # 是否启用统一响应封装(默认 true)exception-handler-enabled: true # 是否启用全局异常处理(默认 true)auto-api-proxy-enabled: true # 是否启用全局动态代理 (默认 true)base-package: io.github.l4vid4.example # 包路径

✅ TODO(未来计划)

  • 开发代码生成插件
  • 通用字段自动填充(createTime, updateTime)
  • 多数据源/分表兼容支持
  • 添加swagger支持

🧑‍💻 贡献指南

欢迎 PR 或 issue!如果你觉得这个项目对你有帮助,欢迎点个 ⭐!

📄 License

Apache 2.0

相关文章:

MyBatis-Plus一站式增强组件MyBatis-Plus-kit(更新2.0版本):零Controller也能生成API?

MyBatis-Plus-Kit &#x1f680; MyBatis-Plus-Kit 是基于MyBatis-Plus的增强组件&#xff0c;专注于提升开发效率&#xff0c;支持零侵入、即插即用的能力扩展。它聚焦于 免写 Controller、代码一键生成、通用响应封装 等核心场景&#xff0c;让您只需专注业务建模&#xff0…...

实时数仓flick+clickhouse启动命令

1、启动zookeeper zk.sh start 2、启动DFS&#xff0c;Hadoop集群 start-dfs.sh 3、启动yarn start-yarn.sh 4、启动kafka 启动Kafka集群 bin/kafka-server-start.sh -daemon config/server.properties 查看Kafka topic 列表 bin/kafka-topics.sh --bootstrap-server local…...

【Git】Commit Hash vs Change-Id

文章目录 1、Commit 号2、Change-Id 号3、区别与联系4、实际场景示例5、为什么需要两者&#xff1f;6、总结附录——Gerrit 在 Git 和代码审查工具&#xff08;如 Gerrit&#xff09;中&#xff0c;Commit 号&#xff08;Commit Hash&#xff09; 和 Change-Id 号 是两个不同的…...

Netty学习专栏(六):深度解析Netty核心参数——从参数配置到生产级优化

文章目录 前言一、核心参数全景解析1.1 基础网络层参数1.2 内存管理参数1.3 水位线控制1.4 高级参数与系统级优化 二、生产级优化策略2.1 高并发场景优化2.2 低延迟场景优化 总结 前言 在分布式系统和高并发场景中&#xff0c;Netty作为高性能网络通信框架的核心地位无可替代。…...

服务器磁盘按阵列划分为哪几类

以下是服务器磁盘阵列&#xff08;RAID&#xff09;的详细分类及技术解析&#xff0c;基于现行行业标准与实践应用&#xff1a; 一、主流RAID级别分类 1. ‌RAID 0&#xff08;条带化&#xff09;‌ ‌技术原理‌&#xff1a;数据分块后并行写入多块磁盘&#xff0c;无…...

在WPF中添加动画背景

在WPF中添加动画背景 在WPF中创建动画背景可以大大增强应用程序的视觉效果。以下是几种实现动画背景的方法&#xff1a; 方法1&#xff1a;使用动画ImageBrush&#xff08;图片轮播&#xff09; <Window x:Class"AnimatedBackground.MainWindow"xmlns"htt…...

【KWDB创作者计划】_KWDB分布式多模数据库智能交通应用——高并发时序处理与多模数据融合实践

导读&#xff1a;本文主要探讨了基于KWDB的分布式多模数据库智能交通应用场景&#xff0c;进行了高并发时序处理与多模数据融合实践方向的思考。探索智慧交通领域的数据实时处理与存储资源利用方面的建设思路。 本文目录 一、智能交通数据架构革命   1.1 传统架构瓶颈  …...

Android 中的 ViewModel详解

在 Android 开发中&#xff0c;ViewModel 是 Jetpack 架构组件的核心成员之一&#xff0c;专为管理与界面相关的数据而设计。它通过生命周期感知能力&#xff0c;确保数据在配置变更&#xff08;如屏幕旋转&#xff09;时持久存在&#xff0c;并将数据逻辑与 UI 控制器&#xf…...

Java集合框架与三层架构实战指南:从基础到企业级应用

一、集合框架深度解析 1. List集合的武林争霸 ArrayList&#xff1a; 数组结构&#xff1a;内存连续&#xff0c;查询效率O(1) 扩容机制&#xff1a;默认扩容1.5倍&#xff08;源码示例&#xff09; private void grow(int minCapacity) {int oldCapacity elementData.len…...

6个月Python学习计划 Day 2 - 条件判断、用户输入、格式化输出

6个月Python学习计划&#xff1a;从入门到AI实战&#xff08;前端开发者进阶指南&#xff09; Python 基础入门 & 开发环境搭建 &#x1f3af; 今日目标 学会使用 input() 获取用户输入掌握 if/else/elif 条件判断语法熟悉格式化输出方式&#xff1a;f-string、format() …...

使用docker容器部署Elasticsearch和Kibana

简介&#xff1a;&#xff08;Elasticsearch&#xff09; elasticsearch简称Es, 是位于Elastic Stack核心的分布式搜索和分析引擎。它为所有类型的数据提供近乎实时的搜索和分析。无论您拥有机构化或非结构化的文本、数字数据还是地理空间数据&#xff0c;Es都能以支持快速搜索…...

批量处理合并拆分pdf功能 OCR 准确率高 免费开源

各位 PDF 编辑小白们&#xff0c;今天咱来唠唠 PDFXEdit10_Portable 这款软件。 先说说它的核心功能和适用场景。这玩意儿是个便携式的 PDF 编辑工具&#xff0c;不用安装就能直接用&#xff0c;能改 PDF 里的文本、图片&#xff0c;还能批注、调整格式&#xff0c;老方便了。…...

Unity—lua基础语法

Lua 语言执行方式 编译型语言&#xff1a;代码在运行前需要使用编译器&#xff0c;先将程序源代码编译为可执行文件&#xff0c;再执行 C/C Java C# Go Objective-C 解释型语言&#xff08;脚本语言&#xff09; 需要提前安装编译语言解析器&#xff0c;运行时使用解析…...

目标检测 TaskAlignedAssigner 原理

文章目录 TaskAlignedAssigner 原理和代码使用示例 TaskAlignedAssigner 原理和代码 原理主要是结合预测的分类分数和边界框与真实标注的信息&#xff0c;找出与真实目标最匹配的锚点&#xff0c;为这些锚点分配对应的目标标签、边界框和分数。 TaskAlignedAssigner 是目标检…...

Qt popup窗口半透明背景

半透明弹窗需要paintEvent()接口支持 方法一&#xff1a;使用setStyleSheet设置半透明样式&#xff0c;如果是子窗口&#xff0c;则可注释构建函数内属性设置 class TranslucentWidget : public QWidget { public: explicit TranslucentWidget(QWidget *parent nullptr)…...

游戏:元梦之星游戏开发代码(谢苏)

《元梦之星》是一款轻松社交派对游戏,玩家们可以化身星宝,体验纯粹的游玩乐趣,收获简单的快乐。无论i人e人,都能轻松找到属于自己的社交方式。 《元梦之星》的快乐,可以是闯关夺冠时的激动&#xff0c;谁是狼人推理的巧妙&#xff0c;峡谷3V3打赢团战的爽感。也可以是星梦广场开…...

TCP协议原理与Java编程实战:从连接建立到断开的完整解析

1.TCP协议核心&#xff1a;面向连接的可靠通信基石 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网的“可靠信使”&#xff0c;属于传输层协议&#xff0c;其核心在于面向连接和可靠传输。它通过严谨的握手机制与数据控制逻辑&am…...

Linux的top命令使用

Linux系统中top命令详解及使用技巧 一、基础功能 top命令用于实时监控系统性能和进程活动&#xff0c;可查看以下信息&#xff1a; - CPU使用率 - 内存使用情况 - 进程状态信息 - 系统负载数据 二、使用步骤 1. 打开终端输入命令&#xff1a;top 2. 查看实时更新的数据界面&a…...

Spring Cloud Gateway 限流实践:基于 Redis 令牌桶算法的网关层流量治理

一、引言 在微服务架构中,API 网关作为流量枢纽,需对进入系统的请求进行精细化限流,以保护下游服务免受流量冲击。Spring Cloud Gateway 结合 Redis 实现的令牌桶算法,为网关层限流提供了高效、分布式的解决方案。本文将深入解析其原理、配置及实践优化。 二、技术栈与原…...

可视化大屏实现全屏或非全屏

通过点击按钮实现全屏和非全屏效果展示 代码如下&#xff1a; <template> //点击icon图片进入全屏或非全屏<img :src"screenStatus ? /src/assets/noFull.png : /src/assets/full.png" alt"" click"enterFullScreen" /> </te…...

java8函数式接口(函数式接口的匿名实现类作为某些方法的入参)

文章目录 前置介绍通过 lambda 表达式&#xff0c;使用匿名类&#xff0c;实现函数式接口函数式接口和回调函数的关系函数式接口的应用 前置介绍 是 Java 8 引入的核心概念之一&#xff0c;指的是 仅包含一个抽象方法的接口。它可以被 FunctionalInterface 注解标记&#xff0…...

linux自有服务

文章目录 [TOC](文章目录)linux自有服务概述systemctl管理服务命令CentOS 7 之前CentOS 7 常用自有服务ntpd或systemd-timesyncd时间同步服务ntp同步服务器原理ntpd时间同步操作systemd-timesyncd同步原理systemd-timesyncd时间同步操作 firewalld防火墙计划任务crontab CentOS…...

UniApp网页版集成海康视频播放器

注意&#xff1a;本人全部集成好后使用最新的海康平台下载插件进行替换后就不能预览视频 使用Uni插件进行集成&#xff1a;海康视频H5播放器组件 - DCloud 插件市场 CSDN资源下载&#xff1a;https://download.csdn.net/download/wangdaoyin2010/90910975 注意&#xff1a;初…...

Filter和Interceptor详解(一文了解执行阶段及其流程)

Filter和Interceptor的区别 Filter&#xff08;过滤器&#xff09;和 Interceptor&#xff08;拦截器&#xff09;都是用于在请求处理前后插入额外逻辑的组件&#xff0c;下面依次介绍&#xff0c;并额外介绍Spring Gateway的过滤器&#xff08;GlobalFilter/GatewayFilter&am…...

鸿蒙仓颉开发语言实战教程:实现商城应用详情页

昨天有朋友提到鸿蒙既然有了ArkTs开发语言&#xff0c;为什么还需要仓颉开发语言。其实这个不难理解&#xff0c;安卓有Java和Kotlin&#xff0c;iOS先后推出了Objective-C和Swift&#xff0c;鸿蒙有两种开发语言也就不奇怪了。而且仓颉是比ArkTs更加灵活的语言&#xff0c;虽然…...

GitAny - 無需登入的 GitHub 最新倉庫檢索工具

地址&#xff1a;https://github.com/MartinxMax/gitany GitAny - 無需登入的 GitHub 專案搜尋工具 GitAny 是一款基於 Python 的工具&#xff0c;允許你在無需登入的情況下搜尋當天最新的 GitHub 專案。它支援模糊搜尋、條件篩選以及倉庫資料的視覺化分析。 安裝依賴 $ pip…...

在飞牛nas系统上部署gitlab

在飞牛nas系统上部署gitlab需要使用docker进行部署&#xff0c;如下将介绍详细的部署流程。 文章目录 1. docker镜像2. 拉取镜像3. 运行容器4. 运行和访问gitlab5. 一些小配置5.1 url问题5.2 ssh端口5.3 其他配置 1. docker镜像 首先需要找一个gitlab的docker镜像地址&#x…...

深入理解 Redis 哨兵模式

Redis 哨兵模式深度解析&#xff1a;从原理到实践的全流程指南 在分布式系统架构中&#xff0c;Redis 作为高性能的内存数据库&#xff0c;其哨兵模式&#xff08;Sentinel&#xff09;是保障服务高可用性的核心方案。本文将从基础概念、运行机制出发&#xff0c;结合具体配置…...

SQL进阶之旅 Day 4:子查询与临时表优化

文章标题 【SQL进阶之旅 Day 4】子查询与临时表优化 文章内容 开篇&#xff1a;SQL进阶之旅的第4天 在“SQL进阶之旅”系列中&#xff0c;第4天的主题是子查询与临时表优化。这是SQL开发中不可或缺的一部分&#xff0c;尤其在处理复杂查询时&#xff0c;合理使用子查询和临…...

[特殊字符]《Qt实战:基于QCustomPlot的装药燃面动态曲线绘制(附右键菜单/样式美化/完整源码)》

1、将qcustomplot.cpp qcustomplot.h放入工程目录下引入qcustomplot 2、代码 .h #if defined(_MSC_VER) #pragma execution_character_set(...