.createStatement("SELECT firstname FROM PERSON WHERE age > $1") .bind("$1", 42) .execute()) .flatMap(result -> result .map((row, rowMetadata) -> row.get("firstname", String.class))) .doOnNext(System.out::println) .subscribe(); R2DBCサイトに掲載のサンプルコード(Javaコード) リアクティブなAPIは難しい
val name: String ) create table employee ( id integer generated always as identity not null, name varchar(500) not null, constraint pk_employee primary key(id) ) 従業員テーブル 従業員クラス(Kotlinコード)
e = Meta.employee val query: Query<List<Employee>> = QueryDsl.from(e).where { e.name eq "ABC" }.orderBy(e.id) fun main() { // ③クエリの実⾏ val employees : List<Employee> = db.runQuery(query) } select t0_.id, t0_.name from employee as t0_ where t0_.name = ? order by t0_.id asc Kotlinコード 発⾏されるSQL
e = Meta.employee val query: Query<List<Employee>> = QueryDsl.from(e).where { e.name eq "ABC" }.orderBy(e.id) suspend fun main() { // ③クエリの実⾏ val employees : List<Employee> = db.runQuery(query) } select t0_.id, t0_.name from employee as t0_ where t0_.name = ? order by t0_.id asc Kotlinコード 発⾏されるSQL
val e = Meta.employee val query = QueryDsl.from(e).where { e.name eq "ABC" }.orderBy(e.id) fun main() { val employees = db.runQuery(query) } val db = R2dbcDatabase(“r2dbc:h2:mem:///test;DB_CLOSE_DELAY=-1”) val e = Meta.employee val query = QueryDsl.from(e).where { e.name eq "ABC" }.orderBy(e.id) suspend fun main() { val employees = db.runQuery(query) } JDBC接続 R2DBC接続 接続⽂字列は⽐較対象にしていません
val db: JdbcDatabase) { @RequestMapping("/") fun list(): List<Employee> { val e = Meta.employee val query = QueryDsl.from(e).orderBy(e.id) return db.runQuery(query) } } Komapper JDBC + Spring Web MVC @RestController @Transactional class MyController(private val db: R2dbcDatabase) { @RequestMapping("/") suspend fun list(): List<Employee> { val e = Meta.employee val query = QueryDsl.from(e).orderBy(e.id) return db.runQuery(query) } } Komapper R2DBC + Spring WebFlux