這段在使用Spring Data JDBC來取代JdbcTemplate的設計。若使用JdbcTemplate,我們還是得自己實作repository介面定義的方法,例如findAll, findById, save等等,不過其實Spring Data有提供例如CrudRepository這樣的介面給我們繼承,而其背後就是Spring會直接幫我們實作這些general的方法,不需要在自己寫實作。
這段還提到了CommandLineRunner和ApplicationRunner,這兩個介面都是functional interface,只有一個run方法要實作,用途是Spring會在application context啟動,並且所有component都wire起來後,去跑這兩個介面的run方法內容,而這段提到說可以在這邊寫db table的初始資料,而不用另外寫data.sql放在src/main/resources裡面,除了不用寫sql的好處外,重點是透過repository介面來操作,底層的實作就可以隨時替換掉,例如原本是用relational database (要寫sql),這時我們抽換成NoSql database也可以直接運作。
@Bean
public CommandLineRunner dataLoader(IngredientRepository repo) {
return args -> {
repo.save(new Ingredient("KNIGHT", "knight", Type.BLADE));
repo.save(new Ingredient("SAMURAI", "samurai", Type.BLADE));
repo.save(new Ingredient("IRON", "iron", Type.MATERIAL));
repo.save(new Ingredient("VALYRIAN", "valyrian", Type.MATERIAL));
repo.save(new Ingredient("STRAIGHT", "straight", Type.HOLD));
repo.save(new Ingredient("BEND", "bend", Type.HOLD));
};
}
Fun Fact: JPA的repository method naming convention其實不會管你method name的主詞是什麼,因為背地裡是根據你implements的介面中所給的generic type來決定,例如:
public interface ManRepository extends CrudRepository<Man, Long>{
Man findDogsByName(String name);
}
JPA一樣會幫你找出Man物件,而不會是Dog物件,其實通常主詞連寫也不會寫。