okinawa

IT勉強メモ

SpringでJPAメモ

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); 
    } 
}