SpringでJPA
JPAはDBとのやりとりを簡単にしてくれる。
クエリメソッドでSQLを自動生成。
SpringBoot + JPA + Thymeleafで簡単なCRUDを作る②~画面と機能作成まで~
https://qiita.com/ozaki25/items/3b348874b6db5ab4f04f
DB側で必要な設定は↓ 参考:@GeneratedValueを使って主キーを生成する方法
https://qiita.com/KevinFQ/items/a6d92ec7b32911e50ffe
JPA その3 - JPQL
https://qiita.com/opengl-8080/items/e074330b5f4862d9995f
Spring Data JPA でのクエリー実装方法まとめ(@Query()とかの使い方)
https://qiita.com/tag1216/items/55742fdb442e5617f727
【Spring Data JPA】自動実装されるメソッドの命名ルール(クエリメソッドってやつの参考)
https://qiita.com/shindo_ryo/items/af7d12be264c2cc4b252#orderby
JPQL基本の書き方
table名→Entityクラス名
カラム名→フィールド名
で書く。
さらに、teble名を変数宣言する(ここの場合AdressEntity a)
@Table(name="address")
public class AddressEntity {
@Column(name="city_code")
private Integer cityCode;
}
---------------------------------
上記に対応したSQLとJPQL
SELECT * FROM address Where city_code = ?; //SQL
SELECT a FROM AddressEntity a Where a.cityName = ?1; //JPQL
Entity
- @EntityをつけることでDBのテーブルと紐づく
- @Tableでテーブル名を指定
- @Idを付けた変数がテーブルのプライマリーキーになる
- @GeneratedValueをつけると連番が自動で振られるようになる(MySQL側では主キーにオートインクリメントが必須)
- @Columnでカラム名を指定
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
@Data
@Entity
@Table(name="player_table")
-
public class Player {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="name")
private String name;
@Column(name="number")
private Integer number;
@Column(name="position")
private String position;
}
Repository
中身は空でもOK。独自の処理をしたい時はここに追記。
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PlayerRepository extends JpaRepository<Player, Long> {
@PersistenceContext
private EntityManager em;
参考
@return
public List<Player> index() {
return em.createQuery("select m from Player m ", Player.class).getResultList();
}
}
Service
findAll/findOne/save/deleteはJPAのメソッド。
基本的なCRUDはこれでOK.
SQL書かなくてよいのでグッド。
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PlayerService {
@Autowired
private PlayerRepository playerRepository;
public List<Player> findAll() {
return playerRepository.findAll();
}
public Player findOne(Long id) {
return playerRepository.findById(id).orElse(null);
}
public Player save(Player player) {
return playerRepository.save(player);
}
public void delete(Long id) {
playerRepository.deleteById(id);
}
}