menu
書いてる野郎
orebike@gmail.com
プロジェクト作成。ここまでは普通だが MyBatis は Spring Boot 標準でサポートされているらしく選択肢が出てくる。
なので標準的な構成にしようとして build.gradle
がこうなる。
plugins { id 'org.springframework.boot' version '2.1.6.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' group = 'com.unko.dev' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.1' runtimeOnly 'mysql:mysql-connector-java' testImplementation 'org.springframework.boot:spring-boot-starter-test' }
application.yml
にデータベースの接続設定を書く
spring: datasource: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/hogehoge username: root password: hogehoge
とりあえずコントローラを作って Spring 自体の動作を確認する
package com.unko.sample.mybatis.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/") public String index() { return "Hello MyBatis."; } }
このへんの開発は他のページ参照。
MyBatis ではテーブルと対応するものとして「ドメイン」というものを作るそうなのでそれを作る。
このように POJO でメンバに対して getter setter があるという構成。
public class Hoge { private Long id; private String name; private Integer age; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
自分は単に記述量を減らすしか意味が無いメタプログラミング的操作は嫌いなので全部手書きしている。
Service とか DAO に当たるような操作メソッドを持つ Mapper というものを作る
とりあえず全件抜きの findAll
を作る。
これは interface として作成し、実装部分は勝手にゴニョゴニョやってくれる系のようだ。
@Mapper public interface HogeMapper { public List<Hoge> findAll(); }
Mapper というアノテーションをつけておく。
このファイルと同一パッケージに同一名で HogeMapper.xml を作りこの中に実装の元になる SQL を書き込む
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.unko.sample.mybatis.mapper.HogeMapper"> <select id="findAll" resultType="com.unko.sample.mybatis.domain.Hoge"> SELECT * FROM hoge </select> </mapper>
こんな感じ。namespace は対象の Mapper インターフェースに合わせて、resultType は今回の場合は List<Hoge> なのだが、その場合は中身のクラス、今回ならドメインクラスの Hoge を指定する。
Controller にコンストラクタインジェクションで記述すると DI される。
@RestController public class HelloController { private HogeMapper hogeMapper; public HelloController(HogeMapper hogeMapper) { this.hogeMapper = hogeMapper; } @RequestMapping("/") public String index() { List<Hoge> hogeList = hogeMapper.findAll(); return "Hello MyBatis." + hogeList.get(0).getName(); } }
ちゃんと動いた。非常に簡単である。