sunabak0 / realworld-kotlin-springboot-jdbc

勉強:Kotlin/SpringBoot/アプリアーキテクチャ/戦術的DDD/エラーハンドリング/ソフトウェアテスト/OpenAPIからコードの自動生成
https://sunabak0.github.io/realworld-kotlin-springboot-jdbc/
4 stars 0 forks source link

Spring Data JDBC を調査 #278

Open Msksgm opened 1 year ago

Msksgm commented 1 year ago

概要

Spring Data JDBC について調査する。

Msksgm commented 1 year ago

導入方法

build.gradle.kts に以下を記述

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
}

基本的な利用方法は以下

zenn に記事を作成した。

https://zenn.dev/msksgm/articles/20221028-kotlin-spring-data-jdbc-web-api

sunakan commented 1 year ago

やり方は分かった

以下のようにやれば

class HogeRepoImpl implements HogeRepo, CrudRepo<User> {
  override saveForhogeRepo(user: User) {
    this.saveCrudRepo(user)
    this.orgSave()
  }

  @Query("SELECT * FROM ...")
  fn orgSave() {
  }
}
Msksgm commented 1 year ago

やり方は分かった

以下のようにやれば

  • セパレートインターフェースを汚さない
  • 詰替えもORMの力を借りてやってくれる
  • UseCase側からはドメインレポのメソッドしか見えない
class HogeRepoImpl implements HogeRepo, CrudRepo<User> {
  override saveForhogeRepo(user: User) {
    this.saveCrudRepo(user)
    this.orgSave()
  }

  @Query("SELECT * FROM ...")
  fn orgSave() {
  }
}

CrudRepos を implements すると、以下のようになることがわかった。 一度定義しないと、メソッドの中身が確定しないから?

class HogeRepoImpl implements HogeRepo, CrudRepo<UserInt> {

    override fun <S : Customer?> save(entity: S): S {
        TODO("Not yet implemented")
    }

    override fun <S : Customer?> saveAll(entities: MutableIterable<S>): MutableIterable<S> {
        TODO("Not yet implemented")
    }

    override fun findById(id: Int): Optional<Customer> {
        TODO("Not yet implemented")
    }

    override fun existsById(id: Int): Boolean {
        TODO("Not yet implemented")
    }

    override fun findAll(): MutableIterable<Customer> {
        TODO("Not yet implemented")
    }

    override fun count(): Long {
        TODO("Not yet implemented")
    }

    override fun deleteAll() {
        TODO("Not yet implemented")
    }

    override fun deleteAll(entities: MutableIterable<Customer>) {
        TODO("Not yet implemented")
    }

    override fun deleteAllById(ids: MutableIterable<Int>) {
        TODO("Not yet implemented")
    }

    override fun delete(entity: Customer) {
        TODO("Not yet implemented")
    }

    override fun deleteById(id: Int) {
        TODO("Not yet implemented")
    }

    override fun findAllById(ids: MutableIterable<Int>): MutableIterable<Customer> {
        TODO("Not yet implemented")
    }

}
Msksgm commented 1 year ago

代替案

Impl の引数に、CrudRepository を継承した interface を引数に持たせる。

class HogeRepoImpl(val springDataHogeRepository: SpringDataHogeRepository) implements HogeRepo {
    fun saveHoge(hoge: Hoge) {
        val entityHoge = EntityHoge(...)
        springDataHogeRepository.save(entityHoge)
    }
}
Msksgm commented 1 year ago

「Spring Data JDBC - リファレンスドキュメント」を読む

以下に記入中。

https://zenn.dev/msksgm/scraps/b11ebf63e7e795