小帅包 2024-06-05 09:52 采纳率: 20%
浏览 12

springboot中如何用公共方法对不同表进行增删改查 只需要一个controller层 写一个通用增删改查方法

springboot中如何用公共方法对不同表进行增删改查 只需要一个controller层 写一个通用增删改查方法

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-05 09:52
    关注

    引自免费微信小程序:皆我百晓生

    在Spring Boot中实现一个通用的增删改查(CRUD)方法,你需要使用Java泛型、MyBatis Plus(简称MP)以及一些反射技术。首先确保你已经在项目中添加了MyBatis Plus依赖。

    1. 添加MyBatis Plus依赖

    pom.xml文件中添加MyBatis Plus依赖:

    <dependencies>
        <!-- MyBatis Plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.4</version>
        </dependency>
    </dependencies>
    
    1. 创建一个基础实体类(BaseEntity)

    创建一个所有实体类继承的基础实体类,例如BaseEntity.java:

    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    
    public abstract class BaseEntity {
    
        @TableId(type = IdType.AUTO)
        protected Long id;
    }
    
    1. 创建一个通用服务接口(GenericService)

    创建一个通用服务接口,例如GenericService.java:

    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.extension.service.IService;
    
    public interface GenericService<T extends BaseEntity> extends IService<T> {
        IPage<T> page(IPage<T> page, T entity);
    }
    
    1. 实现通用服务(GenericServiceImpl)

    创建一个通用服务实现类,例如GenericServiceImpl.java:

    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class GenericServiceImpl<T extends BaseEntity> extends ServiceImpl<T, String> implements GenericService<T> {
        // 如果你的数据源不是String类型,这里需要修改为对应的类型
        @Autowired
        public GenericServiceImpl(EntityMapper<T> entityMapper) {
            super(entityMapper);
        }
    
        @Override
        public IPage<T> page(IPage<T> page, T entity) {
            return this.page(page, null, entity);
        }
    }
    
    1. 创建一个通用控制器(GenericController)

    创建一个通用控制器,例如GenericController.java:

    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("/api/generic")
    public class GenericController<T extends BaseEntity> {
    
        private final GenericService<T> genericService;
    
        public GenericController(GenericService<T> genericService) {
            this.genericService = genericService;
        }
    
        @GetMapping("/{id}")
        public T getById(@PathVariable("id") Long id) {
            return genericService.getById(id);
        }
    
        @PostMapping
        public T create(T entity) {
            return genericService.save(entity);
        }
    
        @PutMapping
        public T update(@RequestBody T entity) {
            genericService.updateById(entity);
            return entity;
        }
    
        @DeleteMapping("/{id}")
        public void delete(@PathVariable("id") Long id) {
            genericService.removeById(id);
        }
    
        @GetMapping
        public IPage<T> list(@RequestParam Map<String, Object> params) {
            QueryWrapper<T> queryWrapper = new QueryWrapper<>();
            if (params != null && !params.isEmpty()) {
                for (Map.Entry<String, Object> entry : params.entrySet()) {
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    if (value instanceof List) {
                        queryWrapper.in(key, (List<?>) value);
                    } else {
                        queryWrapper.eq(key, value);
                    }
                }
            }
            return genericService.page(new Page<>(1, 10), queryWrapper);
        }
    
        @GetMapping("/listAll")
        public List<T> listAll() {
            return genericService.list();
        }
    }
    
    1. 在应用启动类中注册实体类

    在主启动类上使用@ComponentScan注解,扫描包含你的实体类的包,例如:

    @SpringBootApplication
    @ComponentScan(basePackages = {"your.package.name.for.entities"})
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    
    1. 使用示例

    在其他Controller中,只需注入相应的GenericService,并通过其提供的方法进行操作即可。

    注意:这个方案仅适用于简单的查询和基本的CRUD操作。对于更复杂的业务逻辑,可能需要在具体的服务和实体类中增加额外的方法和处理。此外,为了简化代码,这里没有处理异常情况,实际开发中应根据需要添加适当的错误处理。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月5日

悬赏问题

  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分 合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备