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.xmlはjava配下の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決勝・・嬉しすぎる!!