Java + Spring-boot + H2でインメモリDB接続を試してみる

はじめに

参考:

インメモリデータベースとは何ですか?

インメモリデータベースとは、非リレーショナルデータベースの一種です。データをディスクや SSD に保存するデータベースではなく、データストレージ用のメモリに主に依存します。インメモリデータベースは、ディスクにアクセスする必要性を除くことによって、最小限の応答時間を達成するよう設計されました。

準備

登場人物

  • H2
  • JPA
  • エンティティクラス
  • レポジトリ(インターフェース)
  • コントローラー

流れ

  • ビルドファイルの修正(JPA/H2のライブラリ追加)
  • エンティティクラスの作成(テーブルのデータをJavaオブジェクトとして保管する)
  • レポジトリの作成(DBとの接続担当)
  • コントローラーの修正

ビルドファイルの修正

pom.xml

<!--       DBの接続-->
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
      <dependency>
         <groupId>com.h2database</groupId>
         <artifactId>h2</artifactId>
      </dependency>

エンティティクラスの作成

  • Laravelでいうところのモデル?
  • Kotlinだとdata classでめっちゃ簡単にかけることを改めて実感

作成

@Entity
@Table(name=“user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)  //???
    @Column
    private long id;


    @Column(length = 50,nullable = false)
    private String name;


    @Column(nullable = true)
    private Integer age;


    public long getId() {
        return id;
    }


    public void setId(long id) {
        this.id = id;
    }
    
    :
  • @Entityでモデルであることを記述
  • @Tableでテーブルを明示的に指定(必須ではない)
  • privateでレコードを記述
  • setter / getterを記述
  • @Id/@Columnなどでフィールドの説明

@Id/@Columnなどでフィールドの説明

  • @Id
    • プライマリーキーの指定
  • @GeneratedValue(strategy = GenerationType.AUTO)
    • 主キーの生成
  • @Column
    • 制限を指定

レポジトリの作成

  • JpaRepositoryを継承する事で、fineOne、findAll、save、deleteの4メソッドが使用

作成

@Repository
public interface DataRepository extends JpaRepository<Data,Long> { 

}
  • @Repositoryでリポジトリであることを記述
  • JpaRepositoryを継承

JpaRepositoryを継承

// JpaRepository<エンティティ , IDタイプ>
JpaRepository<Data,Long>

コントローラーの修正

作成

@Autowired 
MyDataRepository repository;


@RequestMapping(value = "/db" , method = RequestMethod.GET)
public ModelAndView index(ModelAndView mav){
    mav.setViewName(“index”);
    Iterable<Data> list = repository.findAll();
    mav.addObject("datalist",list);
    return mav;
}
  • @AutoWiredでnewせずに使える(ここまだ曖昧)
  • Iterableでfor-eachをつかえる形式にしている
  • repository.findAllで全データをlistに入れている

画面には下記のように表示される(/db)

[]

データはないが、インメモリなDBは使用可能になってる

参考

https://www.walbrix.com/jp/blog/2010-05-java.html

【Spring Data Jpa のやり方】 - Qiita

JpaRepositoryを利用する(1/8):初心者のためのSpring Framework入門 - libro