Spring dataでr 2 dbcを使用します.


概要
上記の文章はSpring webFluxでr 2 dbcをどう使うかについて述べました.今日はspring-data-r 2 dbcというSpring dataを使ってr 2 dbcをパッケージ化してr 2 dbcを操作する方法を見てみます.
依存関係
Spring-datea-r 2 dbcを使用するには、以下の依存関係を設定する必要があります.

    
        
        org.springframework.boot
        spring-boot-starter-data-r2dbc
        2.3.3.RELEASE
    

        
        
            io.r2dbc
            r2dbc-h2
            ${r2dbc-h2.version}
        

        
            org.springframework.boot
            spring-boot-starter-webflux
        
データベース接続の設定
Spring-data-r 2 dbcはR 2 dbc Proptiesを使ってプロファイルの読み込みを行います.
簡単にR 2 dbc Proptiesの定義を見てください.
@ConfigurationProperties(prefix = "spring.r2dbc")
public class R2dbcProperties {

    /**
     * Database name. Set if no name is specified in the url. Default to "testdb" when
     * using an embedded database.
     */
    private String name;

    /**
     * Whether to generate a random database name. Ignore any configured name when
     * enabled.
     */
    private boolean generateUniqueName;

    /**
     * R2DBC URL of the database. database name, username, password and pooling options
     * specified in the url take precedence over individual options.
     */
    private String url;

    /**
     * Login username of the database. Set if no username is specified in the url.
     */
    private String username;

    /**
     * Login password of the database. Set if no password is specified in the url.
     */
    private String password;
したがって、私たちの配置ファイルはどうなっていますか?
spring.r2dbc.url=r2dbc:h2:mem://./testdb
spring.r2dbc.username=sa
spring.r2dbc.password=password
ここで使っているのはH 2データベースです.
データベース初期化
データベース初期化の過程で、私たちはusersテーブルを作成する必要があります.ここではinitDatabase beanで実現します.
    @Bean
    public ApplicationRunner initDatabase(DatabaseClient client, UsersDao usersDao) {
        List statements = Arrays.asList(
                "DROP TABLE IF EXISTS USERS;",
                "CREATE TABLE IF NOT EXISTS USERS ( 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(usersDao::save).subscribe(user -> log.info("User saved: {}", user));

    }

    private Flux getUser() {
        return Flux.just(new Users(null, "John", "Doe"), new Users(null, "Jane", "Doe"));
    }

    private Mono executeSql(DatabaseClient client, String sql) {
        return client.execute(sql).fetch().rowsUpdated();
    }
上記の例では、データベースを作成して二つの部分に分けて、第一部分はデータベースschemaの操作で、dropとcreate tableの操作を実行しました.
第二の部分はデータベーステーブルにデータを挿入します.
なお、上記の2つの部分の動作は、本当にReactive動作をトリガするためにsubscribe動作を実行する必要がある.
DAO操作
DAO操作の前に、私たちはUsers entityを作成する必要があります.
@Data
@AllArgsConstructor
public class Users {

    @Id
    private Integer id;
    private String firstname;
    private String lastname;

    boolean hasId() {
        return id != null;
    }
}
私達が作成したUserDaoをもう一度見てみます.
public interface UsersDao extends ReactiveCrudRepository {

    @Query("select id, firstname, lastname from users c where c.lastname = :lastname")
    Flux findByLastname(String lastname);
}
ここでは@Componentコメントを追加する必要はありません.ReactiveCrudRepositoryを継承しているので、UsersDaoの実例を自動的に作成してくれるので、そのまま使ってもいいです.
ReactiveCrudRepositoryは、save、saveAll、findById、existsByIdなどのDAOの基本的な操作を実装してくれました.
もちろん、上のfindByLastnameなどのSQL文もカスタマイズできます.
Service操作とTransaction
どのようにUserDaoを使って具体的な方法を操作するかを確認します.
@Component
public class UsersService {

    @Resource
    private UsersDao usersDao;

    @Transactional
    public Mono save(Users user) {

        return usersDao.save(user).map(it -> {

            if (it.getFirstname().equals("flydean")) {
                throw new IllegalStateException();
            } else {
                return it;
            }
        });
    }

}
上記では、対応するUserオブジェクトを保存するためのsave方法を作成しました.
制御装置
最後に、私たちは外部に対応する方法を暴露するためにcontrollerを作成しました.
@RestController
@RequiredArgsConstructor
public class UsersController {

    private final UsersDao usersDao;

    @GetMapping("/users")
    public Flux findAll() {
        return usersDao.findAll();
    }
}
テスト
はい、今私たちのプログラムはもう書きました.テストができます.
プログラムを実行します.
curl "localhost:8080/users"    
[{"id":1,"firstname":"John","lastname":"Doe"},{"id":2,"firstname":"Jane","lastname":"Doe"}]%       
相応の結果を取り出したことが見えます.
完璧で、実験は成功します.
本論文のコード:spring-data-r 2 dbc
本文の作者:flydeanプログラムのあれらの事
本論文のリンク:http://www.flydean.com/spring-data-r2dbc/
flydeanのブログ
私の公衆番号に注目してください.「プログラムに関すること」を最も分かりやすく解読し、最も深い商品、最も簡潔な教程、多くのあなたの知らない小さな技術などを発見してください.