基于SpringBoot和MybatisPlus实现通用Controller

基于SpringBoot和MybatisPlus实现通用Controller,只需要创建实体类和mapper接口,单表增删改查接口就已经实现,提升开发效率

1.定义通用controller

package com.xian.controller;import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xian.common.alias.*;
import com.xian.common.result.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.*;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;@RestController
@RequestMapping("/api/v1/data")
public class BaseController<T extends Serializable> {@Autowiredprivate ApplicationContext applicationContext;private T entity;// 使用泛型和IService来处理通用CRUD操作protected <S extends BaseMapper<T>> S getMapper(String entityName) throws Exception {String serviceName = entityName + "Mapper"; // 假设服务名与实体名相同return (S) applicationContext.getBean(serviceName);}@GetMapping("/{entityName}/get/{id}")public Result get(@PathVariable String entityName, @PathVariable Long id) throws Exception {BaseMapper<T> mapper = getMapper(entityName);return Result.success(mapper.selectById(id));}@GetMapping("/{entityName}/all")public Result get(@PathVariable String entityName) throws Exception {BaseMapper<T> mapper = getMapper(entityName);return Result.success(mapper.selectList(new QueryWrapper<>()));}@PostMapping("/{entityName}/insert")public Result insert(@PathVariable String entityName,@RequestBody T entity) throws Exception {BaseMapper<T> baseMapper =  getMapper(entityName);ValidateService<T> validateService = new ValidateServiceImpl<>();validateService.validate(entity,baseMapper);baseMapper.insert(entity);return Result.success();}@PutMapping("/{entityName}/update")public Result update(@PathVariable String entityName,@RequestBody T entity) throws Exception {BaseMapper<T> baseMapper =  getMapper(entityName);// 使用Spring注入验证服务// 验证数据ValidateService<T> validateService = new ValidateServiceImpl<>();validateService.validate(entity, baseMapper);baseMapper.updateById(entity);return Result.success();}@PutMapping("/{entityName}/delete/{id}")public Result update(@PathVariable String entityName,@PathVariable Long id) throws Exception {BaseMapper<T> baseMapper =  getMapper(entityName);baseMapper.deleteById(id);return Result.success();}@PutMapping("/{entityName}/deleteByIds")public Result update(@PathVariable String entityName,@RequestBody Collection<Long> ids) throws Exception {BaseMapper<T> baseMapper =  getMapper(entityName);baseMapper.deleteBatchIds(ids);return Result.success();}// 可以添加其他通用的增删改查方法...@PostMapping("/{entityName}/list")public Result update(@PathVariable String entityName, @RequestBody PageRequestVo pageRequest) throws Exception {BaseMapper<T> baseMapper =  getMapper(entityName);System.out.println("pageRequest = " + pageRequest);PageHelper.startPage(pageRequest.getPage(), pageRequest.getSize());QueryWrapper<T> queryWrapper = new QueryWrapper<>();List<String> sort = pageRequest.getSorts();if (sort!=null&& !sort.isEmpty()) {sort.forEach(o -> {if (o.endsWith("Asc")) {queryWrapper.orderByAsc(o.replace("Asc", ""));}else if (o.endsWith("Desc")) {queryWrapper.orderByDesc(o.replace("Desc", ""));}else {queryWrapper.orderByAsc(o);}});}if (!MapUtil.isEmpty(pageRequest.getParams())){// 处理查询参数pageRequest.getParams().forEach((field, values) -> {if (values != null && !values.isEmpty()) {if (field.endsWith("Like")) {for (Object value : values) {queryWrapper.like(field.replace("Like",""), value);}}else if (field.endsWith("Is")){for (Object value : values) {queryWrapper.eq(field.replace("Like",""), value);}}else if (field.endsWith("Between")){queryWrapper.between(field.replace("Between",""), values.get(0), values.get(1));}else if (field.endsWith("IsNull")){queryWrapper.isNull(field.replace("IsNull",""));}else if (field.endsWith("IsNotNull")){queryWrapper.isNotNull(field.replace("IsNotNull",""));}else if (field.endsWith("NotIn")){queryWrapper.notIn(field.replace("NotIn",""), values);}else if (field.endsWith("In")){queryWrapper.in(field.replace("In",""), values);}else if (field.endsWith("Gt")){queryWrapper.gt(field.replace("Gt",""), values.get(0));}else if (field.endsWith("Ge")){queryWrapper.ge(field.replace("Ge",""), values.get(0));}else if (field.endsWith("Lt")){queryWrapper.lt(field.replace("Lt",""), values.get(0));}else if (field.endsWith("Le")){queryWrapper.le(field.replace("Le",""), values.get(0));}else if (field.endsWith("Eq")){for (Object value : values) {queryWrapper.eq(field.replace("Eq",""), value);}}else if (field.endsWith("Ne")){queryWrapper.ne(field.replace("Ne",""), values.get(0));}else if (field.endsWith("NotBetween")){queryWrapper.notBetween(field.replace("NotBetween",""), values.get(0), values.get(1));}else {for (Object value : values) {queryWrapper.eq(field, value);}}}});}return Result.success(PageInfo.of(baseMapper.selectList(queryWrapper)));}}

2.创建业务实体和mapper接口,

@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User extends Account {@TableId(type = IdType.AUTO)private Integer id;private String username;private String password;private String name;private String avatar;private String role;private String sex;private String phone;private String email;private String info;private String birth;@TableField(exist = false)private Integer blogCount;@TableField(exist = false)private Integer likesCount;@TableField(exist = false)private Integer collectCount;}

mapper接口:

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

postman测试

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

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

相关文章

Axure大屏可视化原型模板及素材:数据可视化的高效解决方案

数据可视化已成为企业决策、运营分析、市场洞察的重要工具。数据可视化大屏&#xff0c;作为数据展示和交互的直观平台&#xff0c;能够实时呈现关键数据&#xff0c;帮助企业快速做出决策。Axure作为原型设计领域的领先工具&#xff0c;以其丰富的组件库、强大的交互设计能力和…

YOLOE:实时查看任何事物

摘要 https://arxiv.org/pdf/2503.07465v1 目标检测和分割在计算机视觉应用中得到了广泛应用&#xff0c;然而&#xff0c;尽管YOLO系列等传统模型高效且准确&#xff0c;但它们受限于预定义的类别&#xff0c;阻碍了在开放场景中的适应性。最近的开放集方法利用文本提示、视觉…

【品铂科技工业生产应用案例解析】

品铂科技&#xff08;Pinpoint&#xff09;在工业领域的高精度定位解决方案已广泛应用于电力、钢铁、仓储、化工、地铁等场景&#xff0c;以下为典型应用案例及技术方案&#xff1a; 一、‌电力行业&#xff1a;上海闵行电厂人员定位‌ 白鹤滩水力发电站 ‌项目需求‌&#x…

7-Zip 功能介绍

7-Zip 是一款开源、高效的文件压缩与解压缩工具&#xff0c;支持多种格式&#xff0c;以高压缩率和灵活性著称。以下是其核心功能&#xff1a; 多格式支持 压缩 / 解压&#xff1a;支持 7z&#xff08;默认格式&#xff0c;压缩率极高&#xff09;、ZIP、RAR、GZIP、BZIP2、TAR…

這是我第一次寫關於aapenal服務器管理控制面板的文章

首先我們來認識一下服務器管理面板的所有功能  網站管理功能&#xff1a; 支持創建和管理多個網站。配置虛擬主機&#xff08;Vhost&#xff09;和域名綁定。自動安裝常用應用&#xff08;如WordPress、Joomla等&#xff09;。  文件管理功能&#xff1a; 文件上傳、…

小语言模型(SLM)技术解析:如何在有限资源下实现高效AI推理

引言&#xff1a;为什么小语言模型&#xff08;SLM&#xff09;是2025年的技术焦点&#xff1f; 2025年&#xff0c;人工智能领域正经历一场“由大变小”的革命。尽管大语言模型&#xff08;LLM&#xff09;如GPT-4、Gemini Ultra等在复杂任务中表现惊艳&#xff0c;但其高昂的…

jmeter:登录接口的token用于下一个接口

问题&#xff1a; 仅仅登录接口可以使用&#xff0c;其他接口进行测试的时候都是报错&#xff1a;账号已经失效 原因&#xff1a; 应该是登录接口的token并没有用到下一个接口上来 解决方法 1、目录建设如下&#xff1a; 2、先添加一个后置处理器&#xff1a;查看结果数&…

1、操作系统引论

一、操作系统 会使用linux系统 建议大家先学会linux的基础指令&#xff0c;可以看菜鸟教程网站进行学习。 1、各种定义 操作系统定义 管理计算机的 硬件 和软件资源&#xff0c; 能对各类作业进行调度&#xff0c;方便用户使用计算机的程序集合。操作系统运行在内核态&#xf…

KVM安全模块生产环境配置与优化指南

KVM安全模块生产环境配置与优化指南 一、引言 在当今复杂多变的网络安全环境下&#xff0c;生产环境中KVM&#xff08;Kernel-based Virtual Machine&#xff09;的安全配置显得尤为重要。本指南旨在详细阐述KVM安全模块的配置方法&#xff0c;结合强制访问控制&#xff08;M…

深入解析工厂模式及其C#实现

工厂模式&#xff08;Factory Pattern&#xff09;是设计模式中的一种创建型模式&#xff0c;它通过工厂方法来创建对象&#xff0c;而不是让客户端代码直接实例化对象。这样可以避免客户端与具体类的紧密耦合&#xff0c;从而提高代码的灵活性、可维护性和扩展性。工厂模式能够…

【愚公系列】《高效使用DeepSeek》009-PPT大纲自动生成

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

SpringCloud系列教程(十四):Sentinel持久化

Sentinel之前已经搭建和应用成功了&#xff0c;但是它有一个很大的缺点就是官方没有提供持久化的方案&#xff0c;从项目源码上看感觉这款工具也没有完成的太好&#xff0c;所以需要我们去对它进行二次开发。要补充的功能大概如下&#xff1a; 1、将Sentinel接入nacos中&#…

AGI大模型(3):大模型生成内容

1 大模型是怎么生成内容的 简单来说就是靠"猜"! 虽然⾮常不可思议,但事实就是这样,现阶段所有的 NLP 任务,都不意味着机器真正理解这个世界,它只是在玩⽂字游戏,进⾏⼀次⼜⼀次的概率解谜,本质上和我们玩报纸上的填字游戏是⼀个逻辑。只是我们靠知识和智慧,…

Go语言环境搭建并执行第一个Go程序

目录 一、Windows环境搭建 二、vscode安装插件 三、运行第一个go程序 一、Windows环境搭建 下载Go&#xff1a;All releases - The Go Programming Language 这里是Windows搭建&#xff0c;选择的是windows-amd64.msi&#xff0c;也可以选择zip直接解压缩到指定目录 选择msi…

Java数据结构第二十三期:Map与Set的高效应用之道(二)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、哈希表 1.1. 概念 1.2. 冲突 1.3. 避免冲突 1.4. 解决冲突 1.5. 实现 二、OJ练习 2.1. 只出现一次的数字 2.2. 随机链表的复制 2.3. 宝石与石头 一、哈希表 1.1. 概念 顺序结构以及平衡树中…

OpenHarmony子系统开发 - Rust编译构建指导

OpenHarmony子系统开发 - Rust编译构建指导 一、Rust模块配置规则和指导 概述 Rust是一门静态强类型语言&#xff0c;具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C…

【SpringMVC】常用注解:@ModelAttribute

1.作用 该注解是在SpringMVC4.3版本后新加入的。它可以修饰方法和参数。出现在方法上&#xff0c;表示当前方法会在控制器的方法之前执行。它可以修饰 没有返回值的方法&#xff0c;也可以修饰没有返回值的方法。它修饰参数&#xff0c;获取指定 的数据给参数赋值。 当表单提…

人工智能之数学基础:如何将线性变换转换为矩阵?

本文重点 在机器学习中,常用的理论就是线性变换,线性变化一定有对应的矩阵表示,非线性变换是不具备这个性质的,那么现在如果有一个线性变换T那么如何知道它对应的矩阵呢? 线性变换的本质 我们知道线性变换相当于一个函数,而矩阵也是一个函数,所以线性变换一定存在一个…

STM32驱动代码规范化编写指南(嵌入式C语言方向)

点击下面图片&#xff0c;为您提供全新的嵌入式学习路线 文章目录 一、命名规范体系1.1 变量/函数命名1.2 宏定义规范1.3 类型定义 二、代码结构组织2.1 文件组织结构2.2 头文件规范模板 三、注释体系构建3.1 Doxygen风格示例3.2 复杂逻辑注释 四、硬件抽象层设计4.1 寄存器封…

C++Primer学习(7.1 定义抽象数据类型)

类的基本思想是数据抽象(data abstraction)和封装(encapsulation)。数据抽象是种依赖于接口(interface)和实现(implementation)分离的编程(以及设计)技术。类的接口包括用户所能执行的操作:类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。 封…