springboot中如何用公共方法对不同表进行增删改查 只需要一个controller层 写一个通用增删改查方法
3条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在Spring Boot中实现一个通用的增删改查(CRUD)方法,你需要使用Java泛型、MyBatis Plus(简称MP)以及一些反射技术。首先确保你已经在项目中添加了MyBatis Plus依赖。
- 添加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>
- 创建一个基础实体类(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; }
- 创建一个通用服务接口(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); }
- 实现通用服务(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); } }
- 创建一个通用控制器(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(); } }
- 在应用启动类中注册实体类
在主启动类上使用
@ComponentScan
注解,扫描包含你的实体类的包,例如:@SpringBootApplication @ComponentScan(basePackages = {"your.package.name.for.entities"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
- 使用示例
在其他Controller中,只需注入相应的GenericService,并通过其提供的方法进行操作即可。
注意:这个方案仅适用于简单的查询和基本的CRUD操作。对于更复杂的业务逻辑,可能需要在具体的服务和实体类中增加额外的方法和处理。此外,为了简化代码,这里没有处理异常情况,实际开发中应根据需要添加适当的错误处理。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥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后投屏调试只能显示一个设备