JPAのアノテーションの一部をそのまま使用する。
例:
@Getter
@Setter
@Table(name = "user")
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
@Column(name = "value")
private String nickname;
}
エンティティクラスには @Table
でテーブル名を指定する。
primary keyなカラムには @Id
を指定。
auto incrementなら @GeneratedValue
を指定。
カラム名を指定するなら@Column
でnameを指定。
プロパティ名とカラム名が同一なら@Column
を付けなくてよい。
複数のカラムに @Id
を付ける。複合主キークラスの定義は不要。
自動で定義されるupdateを呼ぶ際にのみ複合主キーが考慮される。
基本的にはSpring Data JPAとだいたい同じように書ける。 ただし、アノテーションは独自のものを使う。
@Query
でクエリを指定。
更新するクエリは @Modifying
を付ける。
例:
@Repository
public interface UserRepository extends JdbcTemplateRepository<User> {
@Query("SELECT * FROM user WHERE name = :name")
User getByName(@Param("name") String name);
@Query("SELECT * FROM users WHERE name IN (:names)")
List<User> getByNames(@Param("names") List<String> names);
@Modifying
@Query("UPDATE user SET nickname = :nickname WHERE id = :id")
void updateNickname(@Param("id") Long id, @Param("nickname") String nickname);
}
entityを指定してのupdate,insert,insertAndReturnKeyのみ自動で定義される。 insertした際にauto incrementなkeyを取得したい時は、insertAndReturnKeyを呼ぶことで返り値として返ってくる。 その他は自分でクエリの定義が必要。
EntityCallback インターフェースを実装することで、insert/updateの前後でコールバックメソッドを呼んでくれる。
JPAでの、@PrePersist
, @PostPersist
, @PreUpdate
, @PostUpdate
アノテーションの代替。
countなどカラムが1つのクエリを書く時は、@SingleColumnアノテーションを付ける。
例:
@SingleColumn
@Query(value = "SELECT count(*) FROM user")
long count();
デフォルトではResutSetからEntityへのマッピングをリフレクションで行っている。
以下の場合はカスタマイズが必要。
- 高速化のため
- リレーションを扱いたい時
@Mapper(YourCustomizedMapper.class)
@Query("SELECT * FROM 〜")
public SomeEntity getWithMapper();
上記のように、@Mapper
アノテーションを、クエリメソッド、リポジトリインターフェース、エンティティクラス、
のいずれかに付けることでMapperを指定する。
MapperクラスはEntityMapper
インターフェースを実装しなければならない。
通常は、AbstractEntityMapper
を継承して、setValue
メソッドだけオーバーライドすれば良い。
setValue
メソッドには、Entityのインスタンス、カラム名、値が渡ってくるので、値をセットする。
Configuration Classに アノテーション @EnableJdbcTemplateRepositories
を付けることで有効化する。
basePackagesプロパティにスキャン対象のパッケージを記述する。
例:
@EnableJdbcTemplateRepositories(basePackages = "your.repository.package")
@Configuration
public class ApplicationConfig {
}
データベースへのアクセスは、NamedParameterJdbcTemplate
クラスを使用して行う。
NamedParameterJdbcTemplate
クラスのインスタンスをbeanとして登録することで、データベースにアクセス出来る。
例:
@Bean
public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
DateSource dataSource = /* DateSourceの初期化 */;
return new NamedParameterJdbcTemplate(dataSource);
}