はじめに
SpringBoot + MySQLでアプリを作る際、DBにアクセスするときに使用するORマッパーはいつもSpring Data JPAをだったのですが、個人的に使いにくいなと感じることが多かったんです。。。
しかし、Doma2というORマッパーが良いという事を聞き、今回使ってみようと思いました。
その際、初期設定あたりで色々つまづいたところがあったので、今回はそこを中心に執筆しようと思います。(Controller, Serviceの実装は省きます。)
GradleでDoma2を導入する記事がなかなか少なかったので、参考になれば幸いです!!
※本当はkotlinでしたかったのですが、つまづいたのでJavaで解説します(笑)
環境
SpringBoot 2.7.16
Java 11
MySQL 8.0.32
IntelliJ IDEA 2021.3.2
SpringBootのプロジェクトは事前にSpring Initializr等で準備してください
Doma2とは
- JavaのDBアクセスフレームワーク
- 注釈処理を使用して コンパイル時 にコードの生成やコードの検証を行う
- データベース上のカラムの値を振る舞いを持った Java オブジェクトにマッピングできる
- 2-way SQL と呼ばれる SQL テンプレートを利用できる
build.gradleにdoma2の設定を追加する
まずはbuild.gradleに以下の設定を追加しましょう
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.16'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
// ↓追加
id 'org.seasar.doma.compile' version '1.1.0'
}
dependencies {
// ↓追加
implementation 'org.seasar.doma.boot:doma-spring-boot-starter:1.4.0'
// ↓追加
annotationProcessor 'org.seasar.doma:doma-processor:2.35.0'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
追加したらビルドを行いましょう
MySQLの設定
application.yml(propertiesでも可)に、以下の設定を追加しましょう
spring:
datasource:
url: jdbc:mysql://localhost
username: root
password:
initialization-mode: always
sql:
init:
mode: always
doma:
dialect: ORACLE
naming: SNAKE_LOWER_CASE
Daoインターフェースの作成
続いて、SQLを発行してくれるDAOを作成しましょう
package com.example.doma.infrastructure.dao.todo;
import com.example.doma.domain.todo.Todo;
import org.seasar.doma.Dao;
import org.seasar.doma.Insert;
import org.seasar.doma.Select;
import org.seasar.doma.Update;
import org.seasar.doma.boot.ConfigAutowireable;
import java.util.List;
@ConfigAutowireable
@Dao
public interface TodoDao {
@Select
List<Todo> findAll(String name);
}
SQLファイルの作成
「findAll」に対応するSQLクエリを作成しましょう
SQLファイルの配置場所ですが、以下のディレクトリに配置し、名前も合わせる必要があります
src/main/resources/META-INF/...(Daoファイルまでのディレクトリ)/findAll.sql
今回は全件取得するSQLを発行したいので、以下のSQLをファイル内に書きましょう
select * from テーブル名;
エンティティの作成
以下のようにエンティティを作成しましょう
package com.example.doma.domain.todo;
import lombok.Data;
import org.seasar.doma.*;
import java.util.Date;
// application.propertiesの「doma.naming」で指定済みなので不要
//@Entity(naming = NamingType.SNAKE_LOWER_CASE)
@Data
@Entity
public class Todo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int id;
private String name;
private Date createTimestamp;
private Date updateTimestamp;
}
設定は以上です!
あとはRestでもなんでも良いので、Controller、Serviceを作成して、ServiceでDaoのfindAllを呼べばSQLを実行することができます。
不備等あればコメントいただけますと幸いです!