1
1

More than 1 year has passed since last update.

SpringBoot + MyBatis ふりかえり

Posted at

記事を書く理由

業務で初めて、SpringBoot + MyBatisを使ったバックエンドの開発を行ったので
忘れないように備忘録として残そうと思ったからです。
それと、私と同じように初めて触れる人の助けになれたらなと思っています。

そもそもMyBatisって?

MyBatis はカスタム SQL、ストアドプロシージャ、高度なマッピング処理に対応した優れた永続化フレームワークです。

と書くのは簡単なのですが、私は配属されるまで、O/Rマッパーというものを私はよく理解していませんでした。

以下の記事がとても参考になりました。
https://qiita.com/wanko5296/items/d7829f18d4827cecd4f6

端的にオブジェクトとリレーショナルデータベースの紐づけですね。

以上で、MyBatisの説明を終えて
次からは、私が実際に作ったコードのサンプルと一緒に解説していこうと思います。

ディレクトリ構成

  • entity
     ┗Test.java
  • controller
    ┗TestController.java
  • model
    ┗impl
     ┗TestServiceImpl.java
    ┗TestService.java(Interface)
  • domain
    ┗repository
     ┗TestRepository.java(Interface)
  • infra
    ┗datasource
     ┗TestRepositoryImpl.java
    ┗mapper
     ┗TestMapper.java(Interface)
  • resources
    ┗ TestMapper.xml

各コードの説明

Test

@Data
public Test {
    int id;
    String name;
}

TestController

@Controller
@RequiredArgsConstructor
public TestController {

	private final TestService testService;

	@GetMapping("/test/{testId}")
	public getTestList(@PathVariable("testId") String testId) {
		return testService.getTestList(Integer.parseInt(testId)));
	}
}

@RequiredArgsConstructorアノテーションにより
Serviceを呼び出しています。
私は、少し前までAutoWiredを使っていたのですが、非推奨になっていました。
技術のキャッチアップはこまめに行わないといけないな...と深く思いました。

TestService

public interface TestService {
	List<Test> getTestList(int testId);
}

こちらがServiceになっております。
implディレクトリで実際のふるまいを書いていきます。

TestServiceImpl

@Service
@RequiredArgsConstructor
public TestServiceImpl implements TestService {
	
	private final TestRepository testRepository;

	@Override
	List<Test> getTestList(int testId) {
		return testRepository.getTestList(testId);
	}
	
}

TestRepository

public Interface TestRepository {
    List<Test> getTestList(int testId);
}

TestRepositoryImpl

@Repository
@RequiredArgsConstructor
public TestRepositoryImpl implements TestRepository {
    private final TestMapper testMapper;

    @Override
    List<Test> getTestList(int testId){

        return testMapper.getTestList(int testId);
    
    }
}


TestMapper

@Mapper
public Interface TestMapper {
    List<Test> getTestList(@Param("testId") int testId);
}

ここでXMLファイルと紐づけるTestMapper.javaを作成します。
マッパーを書くときは、@Mapperアノテーションを必ずつけましょう。
よくこれを忘れてエラーを起こしていました。
引数の@Paramで指定した文字列はXMLファイルでSQL文を書くときの変数名として扱うことができます。

TestMapper.xml

~~~ヘッダ省略
<mapper namespace="紐づけるMapperクラスのパスを記載(ここだと ~/infra/mapper/TestMapperとなります)">
    <resultMap id="TestBody" type="参照したいエンティティのパスを記載(ここでは、entity/Testとなります)">
        <id property="id(オブジェクトの変数を記載)" column="id(DBのカラム名)"/>
        <result property="name" column="name"/>
    </resultMap>

    <select id="getTestList" resultMap="testBody">
        SELECT
            *
        FROM test
        WHERE id = #{testId}
</mapper>

ここでは、sql文を書いています。
resultMapはselect文などで返ってくる値のマッピングと私は理解しています。
selectのidはTestMapper.javaのメソッド名と同じにすることでマッピングされます。
resultMapはresultMapタグで指定したIDを指定することで、返り値のマッピングをしています。
まだまだ使いこなせていませんが、下記のサイトで詳しく説明があるので
是非参考にしてください。
↓↓
mybatis

以上がコードの説明でした。

最後に

間違っているところなどあったら、ご指摘してください。
まだまだ未熟ですが、業務や勉強で得た知識をこれからもアウトプットしていこうと思います。
ここまで、読んでいただきありがとうございました!
それでは、また!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1