使用Spring Data R2DBC +Postgres实现增删改查功能

网友投稿 1119 2023-02-08

使用Spring Data R2DBC +Postgres实现增删改查功能

使用Spring Data R2DBC +Postgres实现增删改查功能

在本教程中,我想向您展示如何通过带有Spring WebFlux的Spring Data R2DBC 执行各种Postgres CRUD操作。

R2DBC代表反应式关系数据库连接。

像JPA(java持久性API)一样,R2DBC是关系数据库的反应性驱动程序的规范。由于它是一个单独的规范,因此请hzClP勿与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 {

}

CRUD操作

让我们创建一个服务类,以通过Spring Data Reactive Repository执行Postgres CRUD操作。

@Service

public class ProductService {

@Autowired

private ProductRepository repository;

public Flux getAllProducts(){

return this.repository.findAll();

}

public Mono getProductById(int productId){

return this.repository.findById(productId);

}

public Mono createProduct(final Product product){

return this.repository.save(product);

}

public Mono updateProduct(int productId, final Mono 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 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 getAll(){

return this.productService.getAllProducts();

}

@GetMapping("{productId}")

public Mono> getProductById(@PathVariable int productId){

return this.productService.getProductById(productId)

.map(ResponseEntity::ok)

.defaultIfEmpty(ResponseEntity.notFound().build());

}

@PostMapping

public Mono createProduct(@RequestBody Mono productMono){

return productMono.flatMap(this.productService::createProduct);

}

@PutMapping("{productId}")

public Mono updateProduct(@PathVariable int productId,

@RequestBody Mono productMono){

return this.productService.updateProduct(productId, productMono);

}

@DeleteMapping("/{id}")

public Mono 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());

}

}

完整的源代码在这里。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:安卓app运营模式(安卓app运营模式有哪些)
下一篇:详解Maven JAR包冲突问题排查及解决方案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~