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

news2025/5/29 11:00:53

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,Mapper
        new 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转换方法
 	@Override
    protected 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

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

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

相关文章

实时数仓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 号 是两个不同的…

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

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

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() …

目标检测 TaskAlignedAssigner 原理

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

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

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

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

1.TCP协议核心&#xff1a;面向连接的可靠通信基石 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网的“可靠信使”&#xff0c;属于传输层协议&#xff0c;其核心在于面向连接和可靠传输。它通过严谨的握手机制与数据控制逻辑&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;结合具体配置…

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

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

力扣-最大连续一的个数

1.题目描述 2.题目链接 1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09; 3.代码解答 class Solution {public int longestOnes(int[] nums, int k) {int zero0,length0;for(int left0,right0;right<nums.length;right){if(nums[right]0){zero;}while…

无人机避障——深蓝学院浙大栅格地图以及ESDF地图内容

Occupancy Grid Map & Euclidean Signed Distance Field: 【注意】&#xff1a;目的是为了将有噪声的传感器收集起来&#xff0c;用于实时的建图。 Occupancy Grid Map&#xff1a; 概率栅格&#xff1a; 【注意】&#xff1a;由于传感器带有噪声&#xff0c;在实际中基于…

Postman基础操作

1.Postman是什么&#xff1f; Postman是接口测试的工具&#xff0c;简单来说它能模拟浏览器对服务器的某个接口发起请求并接收响应数据。 1.1 Postman工作原理 2.Postman发送请求 2.1 发送GET请求 我们知道GET请求是没用请求体的&#xff0c;所以我们需要将请求参数写在Param…

【MPC控制 - 从ACC到自动驾驶】3 MPC控制器设计原理与参数配置:打造ACC的“最强大脑”

【MPC控制 - 从ACC到自动驾驶】MPC控制器设计原理与参数配置&#xff1a;打造ACC的“最强大脑” 在Day 1&#xff0c;我们认识了ACC自适应巡航和MPC这位“深谋远虑的棋手”。Day 2&#xff0c;我们一起给汽车“画像”&#xff0c;建立了它的纵向动力学模型&#xff0c;并把它翻…

Unity3D仿星露谷物语开发52之菜单页面

1、目标 创建菜单页面&#xff0c;可通过Esc键开启或关闭。 当把鼠标悬停在上面时它会高亮&#xff0c;然后当点击按钮时标签页会被选择。 2、 创建PauseMenuCanvas &#xff08;1&#xff09;创建Canvas 在Hierarchy -> PersistentScene -> UI下创建新的Cavans命名为…

MySQL——复合查询表的内外连

目录 复合查询 回顾基本查询 多表查询 自连接 子查询 where 字句中使用子查询 单行子查询 多行子查询 多列子查询 from 字句中使用子查询 合并查询 实战OJ 查找所有员工入职时候的薪水情况 获取所有非manager的员工emp_no 获取所有员工当前的manager 表的内外…

小米玄戒O1架构深度解析(一):十核异构设计与缓存层次详解

前言 这两天&#xff0c;小米的全新SOC玄戒O1横空出世&#xff0c;引发了科技数码圈的一次小地震&#xff0c;那么小米的这颗所谓的自研SOC&#xff0c;内部究竟有着什么不为人知的秘密呢&#xff1f;我们一起一探究竟。 目录 前言1 架构总览1.1 基本构成1.2 SLC缺席的原因探…