使用Spring Data R2DBC +Postgres實現增刪改查 - vinsguru

banq發表於2021-03-03

在本教程中,我想向您展示如何透過帶有Spring WebFlux的Spring Data R2DBC  執行各種Postgres  CRUD操作。
R2DBC代表反應式關聯式資料庫連線。
像JPA(Java永續性API)一樣,R2DBC是關聯式資料庫的反應性驅動程式的規範。由於它是一個單獨的規範,因此請勿與JPA / Hibernate功能(如@OneToMany,@ManyToMany 等)比較。
我們將開發一個名為product-service的Spring Boot應用程式,該應用程式負責建立新產品/檢索所有產品/刪除或更新現有產品以執行R2DBC的各種Postgres CRUD操作。
 

實體類

@Data
@ToString
public class Product {

    @Id
    private Integer id;
    private String description;
    private Double price;
    
}

我們不能在此處新增@Entity,因為這不是JPA。
  

Spring Data反應性儲存庫
Spring Data照常進行所有繁重的工作。我們需要透過擴充套件ReactiveCrudRepository為我們的實體類建立一個儲存庫。

import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ProductRepository extends ReactiveCrudRepository<Product, Integer> {
}

 

CRUD操作
讓我們建立一個服務類,以透過Spring Data Reactive Repository執行Postgres CRUD操作。

@Service
public class ProductService {

    @Autowired
    private ProductRepository repository;

    public Flux<Product> getAllProducts(){
        return this.repository.findAll();
    }

    public Mono<Product> getProductById(int productId){
        return this.repository.findById(productId);
    }

    public Mono<Product> createProduct(final Product product){
        return this.repository.save(product);
    }

    public Mono<Product> updateProduct(int productId, final Mono<Product> productMono){
        return this.repository.findById(productId)
                .flatMap(p -> productMono.map(u -> {
                    p.setDescription(u.getDescription());
                    p.setPrice(u.getPrice());
                    return p;
                }))
                .flatMap(p -> this.repository.save(p));
    }

    public Mono<Void> deleteProduct(final int id){
        return this.repository.deleteById(id);
    }

}

 

REST API
現在是時候透過REST API公開服務了:

@RestController
@RequestMapping("product")
public class ProductController {

    @Autowired
    private ProductService productService;

    @GetMapping("all")
    public Flux<Product> getAll(){
        return this.productService.getAllProducts();
    }

    @GetMapping("{productId}")
    public Mono<ResponseEntity<Product>> getProductById(@PathVariable int productId){
        return this.productService.getProductById(productId)
                                .map(ResponseEntity::ok)
                                .defaultIfEmpty(ResponseEntity.notFound().build());
    }

    @PostMapping
    public Mono<Product> createProduct(@RequestBody Mono<Product> productMono){
        return productMono.flatMap(this.productService::createProduct);
    }

    @PutMapping("{productId}")
    public Mono<Product> updateProduct(@PathVariable int productId,
                                       @RequestBody Mono<Product> productMono){
        return this.productService.updateProduct(productId, productMono);
    }

    @DeleteMapping("/{id}")
    public Mono<Void> deleteProduct(@PathVariable int id){
        return this.productService.deleteProduct(id);
    }

}

 

配置
Spring Data反應驅動程式需要這樣的配置才能連線到Postgres DB。

  • 方法1:使用application.properties

spring.r2dbc.url=r2dbc:postgresql://localhost:5432/productdb
spring.r2dbc.username=vinsguru
spring.r2dbc.password=admin

  • 方法2:公開連線工廠bean

@Configuration
public class R2DBCConfig {

    @Bean
    public ConnectionFactory connectionFactory() {
        return ConnectionFactories.get(
                ConnectionFactoryOptions.builder()
                        .option(DRIVER, "postgresql")
                        .option(HOST, "localhost")
                        .option(PORT, 5432)
                        .option(USER, "vinsguru")
                        .option(PASSWORD, "admin")
                        .option(DATABASE, "productdb")
                        .option(MAX_SIZE, 40)
                        .build());
    }

}


完整的原始碼在這裡
 

相關文章