我应该如何将数据库表复制到可以在 Spring Boot Rest api 中使用的等效 Java bean 类中?

Posted

技术标签:

【中文标题】我应该如何将数据库表复制到可以在 Spring Boot Rest api 中使用的等效 Java bean 类中?【英文标题】:How should i replicate database table into equivalent java bean class which can be used in spring boot rest api? 【发布时间】:2020-06-21 02:08:44 【问题描述】:

我的数据库表名称是 seller,其中包含列 seller_id(PK)(Auto Increment)、seller_nameseller_email强>等.. 这是 java bean 类 SellerBean

public class SellerBean 

    private Integer sellerId;
    private String sellerName;
    private String sellerEmail;
    ....

    //Constructor & Getters-Setters


我为卖家注册创建了一个rest api方法,并使用Swagger作为api文档

@RestController
public class SellerRestController 

    @Autowired
    SellerService sellerService;

    @RequestMapping(value="seller/register",method = RequestMethod.POST)
    public ResponseEntity<SellerBean> registerSeller(@RequestBody SellerBean sellerBean)
        SellerBean seller = sellerService.registerSeller(sellerBean);
        return new ResponseEntity<>(seller,HttpStatus.OK);
    

这里的问题是,当我通过 swagger UI 检查此方法时,此方法要求输入包含 SellerBean 的所有字段的 json,但我不希望询问(或被由用户输入) 有什么方法可以限制要求(或输入)的任何 bean 字段? (我必须在 SellerBean 中保留该 SellerId,因为我已经通过它执行了所有 CRUD 操作)

【问题讨论】:

【参考方案1】:

您可以使用 JPA 来做到这一点。

这是一个小例子:

首先,您需要创建作为数据库表“镜像”的实体:

@Entity(name = "Seller")
@Table(name = "SELLER") // your table name
public class Seller 
    @Id
    @Column(name = "id") // your column name
    private Long id;

    @Column(name = "name")
    private String sellerName;

    @Column(name = "email")
    private String sellerEmail;

    ...

然后你可以使用 JpaRepository 和 CrudRepository 接口来做你想做的事:

@Repository
public interface Repository<Seller> extends JpaRepository<Seller, Long> 

然后是一个 DAO:

public class SellerDaoImpl implements SellerDao 

    SellerRepository repository;

    public SellerDaoImpl(SellerRepository repository) 
        this.repository = repository;
    

    @Override
    @Transactional
    public Seller create(Seller toCreate) 
        return this.repository.save(toCreate);
    

您的服务应如下所示:

public SellerServiceImpl implements SellerService 

    SellerMapper mapper;
    SellerDao dao;

    public SellerServiceImpl(SellerMapper mapper, SellerDao dao) 
        this.mapper = mapper;
        this.dao = dao;
    

    @Override
    @Transactional
    public SellerDto registerSeller(SellerDto toRegister) 
        Seller entity = this.mapper.mapDto(toRegister);
        return this.mapper.mapEntity(this.dao.create(entity));
    

您的 DTO(基本上是您的 SellerBean):

public class SellerDto 
   private String sellerName;
   private String sellerEmail;
   ...

还有你的映射器:

public class SellerMapper 
    public SellerDto mapEntity(Seller entity) 
        if (entity == null) 
            return null;
        
        SellerDto dto = new SellerDto();
        dto.setSellerName(entity.getSellerName());
        dto.setSellerEmail(entity.getSellerEmail());
        ...
        return dto;
    

    public Seller mapDto(SellerDto dto) 
        if (dto == null) 
            return null;
        
        Seller entity = new Seller();
        entity.setSellerName(dto.getSellerName());
        entity.setSellerEmail(dto.getSellerEmail());
        ...
        return entity;
    

别忘了 Bean 的配置:

@Configuration
@EnableJpaRepositories(basePackageClasses = SellerRepository.class)
@EntityScan(basePackageClasses = SellerConfiguration.class)
public class SellerConfiguration 
    @Bean
    public SellerModelMapper sellerModelMapper() 
        return new SellerModelMapper();
    

    @Bean
    public SellerDao sellerDao(SellerRepository repository) 
        return new SellerDao(repository);
    

    @Bean
    public SellerService sellerService(SellerMapper mapper, SellerDao dao) 
        return new SellerService(mapper, dao);
    

【讨论】:

以上是关于我应该如何将数据库表复制到可以在 Spring Boot Rest api 中使用的等效 Java bean 类中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将大数据表复制到 MySql 表?

php,如何把一个数据表的内容复制到另一个数据表中?

oracle中如何将数据从一个表复制到另一个表(仅复制其中某些字段)

将一些数据从 sqlite 表复制到具有不同两列的同一个表中

我应该将所有外键从主事实表复制到其他相关表吗?

将多个表从一个数据库复制到另一个