ペロハム大学

ヤルゾー

Javaでアプリ作ってみよう MyBatis編

MyBatisを使ったDB接続確認

まずはDB接続確認を行うぜ、MyBatisを使うのに必要なのは主にMapper インターフェイスとMapper XML

「application.properties」に接続設定

最初は空っぽなので、以下を設定。実際は環境変数とかにするのでは

# PostgreSQL
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/dvdrental
spring.datasource.username=postgres
spring.datasource.password=postgres

必要なものを作る

まず全体的にはこんな感じ、黄色が新規作成したとこ!resource配下のCategoryMapper.xmljava配下のCategoryMapper.javaとフォルダ構成同じじゃないと読み込まれないので注意!(つまり、com/example/demo/mapperまで一致させる)

Entity

データ入れとくだけのクラスだよ。大体の場合テーブル毎に作成される、今回はカテゴリマスタの中身を表示できるように、SELECT結果をそのままフィールド変数にしている。@Dataを書いて君もLombokの便利機能を今すぐ使おう!

// Lombokの機能、Getter/Setterをコンパイル時に自動で生成してくれる
@Data
public class Category {
    private int category_id;
    private String name;
} 

Mapper インターフェイス

DBを操作し保存するためのRepositoryクラス、さっき作ったentityはここでSQLの結果として使われる!インターフェースだけど、特に実装されたりせず、対応するXMLがあればよい。

@Mapper
public interface CategoryMapper {
    public List<Category> selectCategory();
}

Mapper XML

namespaceに例のインターフェースと共通する部分を書く、ここで紐づけられるのだ。idもresultTypeもインターフェースの内容書いてるだけだNE!

<mapper namespace="com.example.demo.mapper.CategoryMapper">
    <select id="selectCategory" resultType="com.example.demo.entity.Category">
        SELECT 
           category_id
          ,name 
        FROM category
    </select>
</mapper>

Service インターフェイス

では、今作ったMapperを実際呼び出して処理するのはどこなのか?それは…Serviceクラス。いきなり処理書くと危ないのでまずはインターフェースを作ってあげる。なくても正直動くが、あったほうがいい。

public interface CategoryService {

    public List<Category> selectCategory();
}

Service IMPL

具体的な実装はコチラへ。フィールド変数に@Autowiredをつけるとインスタンスを注入してくれる。つまりオートでnewしてgetしといてくれる、イメージ!こういう仕組みをDI(Dependency Injection = 依存性注入)というよ。でも実際、CategoryMapperはインターフェースしかないので@Autowired使うしかない気がするけど・・

@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;

    @Override
    public List<Category> selectCategory() {
        return categoryMapper.selectCategory();
    }
}

Controller

Serviceにデータを渡してあげたり、受け取ったり。クライアントにデータを渡したり・・そう、まさに画面と処理の橋渡し!@RequestMapping("/")なので、http://localhost:8080/にアクセスされたら呼ばれる。return に指定したhtmlを表示できて、なんか値渡したい場合はメソッドの引数に用意したModel にセットすればOK。今回はカテゴリマスタの検索結果をcategoriesに入れて渡してるんだぜ!

Controller

@Controller
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    // http://localhost:8080/ の時に呼ばれる
    @RequestMapping("/")
    public String init(Model model) {
        List<Category> category = categoryService.selectCategory();
        model.addAttribute("categories", category);
        return "index";
    }

Thymeleaf

HTMLで画面を作る!Bootstrap入れた!${categories}の中にControllerで渡したSELECTS結果が入ってるのでループでテーブルに表示している。

    <div class="col-5 ml-3">
      <table class="table table-sm">
         
        <thead class="thead-light">
          <tr>
            <th>カテゴリID</th>
            <th>名称</th>
          </tr>
        </thead>
        <tr th:each="category : ${categories}">
          <td th:text="${category.category_id}"></td>
          <td th:text="${category.name}"></td>
        </tr>
      </table>

ていうかメインメソッド出てこなかったけどどこで処理はじまってるの

自動作成されたプロジェクト名 + Application.javaの中にメインメソッドあり。@SpringBootApplicationっていうのが自動で@RequestMapping持ってるクラス(つまりController)探して実行していたのだ。

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

感想

ていうかキュウM1決勝・・嬉しすぎる!!