在本教程中,我想向您展示如何通过带有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
|
@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()); }
}
|
完整的源代码在这里。