ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

如何使用R2DBC连接数据库?

2021-03-26 19:04:00  阅读:197  来源: 互联网

标签:R2DBC lastname 数据库 springframework r2dbc Usr org import 连接


一、R2DBC是什么?

反应式编程能大大降低服务器的内存和线程需要量。但是并非所有数据库都能原生支持反应式编程。通常只有非关系型数据库支持反应式编程。为了使关系型数据库支持反应式编程,发明了R2DBC。

二、如何使用R2DBC

1. 使用Maven引入的依赖项

部分pom.xml

...
  <dependencies>
    <!-- Spring WebFlux依赖项 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <!-- Spring Data JPA依赖项 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- H2嵌入式数据库依赖项 -->
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <scope>runtime</scope>
    </dependency>
    <!-- R2DBC依赖项,用于使不支持反应式的数据库支持反应式 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-r2dbc</artifactId>
    </dependency>
    <!-- R2DBC-h2依赖项,为了使R2DBC能使用H2数据库 -->
    <dependency>
      <groupId>io.r2dbc</groupId>
      <artifactId>r2dbc-h2</artifactId>
      <scope>runtime</scope>
    </dependency>
    <!-- lombok依赖项,用于自动生成代码 -->
	<dependency>
	  <groupId>org.projectlombok</groupId>
	  <artifactId>lombok</artifactId>
	  <optional>true</optional>
	</dependency>
  </dependencies>
...

2. 配置文件

application.yml

spring: 
  r2dbc: 
    # 设置R2DBC的url。这里使用的h2数据库。基于内存。创建的数据库名是testdb
    url: r2dbc:h2:mem://./testdb
    username: sa
    password: 123456

3. Java文件

Usr.java

package model;

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
import lombok.AllArgsConstructor;
import lombok.Data;

@Table
@Data
@AllArgsConstructor
public class Usr {
	@Id
	private Integer id;
	private String firstname;
	private String lastname;
	
	boolean hasId() {
		return id != null;
	}
}

UsrRepository.java

package repository;

import org.springframework.data.r2dbc.repository.Query;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Flux;
import model.Usr;

public interface UsrRepository extends ReactiveCrudRepository<Usr, Integer> {
	@Query("SELECT id, firstname, lastname FROM Usr c WHERE c.lastname = :lastname")
	Flux<Usr> findByLastname(String lastname);
}

UsrController.java

package controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import model.Usr;
import repository.UsrRepository;

@RestController
@RequestMapping(path = "/user", produces = "application/hal+json")
@RequiredArgsConstructor
public class UsrController {
	private final UsrRepository usrRepository;
	
	@GetMapping("/all")
	public Flux<Usr> findAll() {
		return usrRepository.findAll();
	}
	
	@GetMapping("/save")
	public Mono<Usr> save() {
		Usr user = new Usr(null, "Lindong", "Wang");
		return usrRepository.save(user);
	}
}

DatabaseConfig.java

package config;

import java.util.Arrays;
import java.util.List;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.r2dbc.core.DatabaseClient;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import model.Usr;
import repository.UsrRepository;

@Configuration
@Slf4j
public class DbConfig {
	@Bean
	public ApplicationRunner initDatabase(DatabaseClient client, UsrRepository usrRepository) {
		List<String> statements = Arrays.asList(
				"DROP TABLE IF EXISTS Usr;", 
				"CREATE TABLE IF NOT EXISTS Usr (id SERIAL PRIMARY KEY, firstname VARCHAR(100) NOT NULL, lastname VARCHAR(100) NOT NULL);");
		statements.forEach(sql -> executeSql(client, sql)
				.doOnSuccess(count -> log.info("Schema created, rows updated: {}", count))
				.doOnError(error -> log.error("got error: {}", error.getMessage(), error))
				.subscribe()
		);
		return args -> getUser().flatMap(usrRepository::save).subscribe(user -> log.info("User saved: {}", user));
	}
	
	private Flux<Usr> getUser() {
		return Flux.just(new Usr(null, "John", "Doe"), new Usr(null, "Jane", "Doe"));
	}
	
	private Mono<Integer> executeSql(DatabaseClient client, String sql) {
		return client.sql(sql).fetch().rowsUpdated();
	}
}

4. 测试代码

在控制台输入:curl localhost:8080/user/all
可以获得返回结果:[{“id”:1,“firstname”:“John”,“lastname”:“Doe”},{“id”:2,“firstname”:“Jane”,“lastname”:“Doe”}]

标签:R2DBC,lastname,数据库,springframework,r2dbc,Usr,org,import,连接
来源: https://blog.csdn.net/Real_CSDN_User/article/details/115252787

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有