MyBatis活用術!効率的なデータ管理を目指して
はじめまして!音ゲー大好き、入社1年目の篠原です。
先日、ずっとやってみたかったドラムを始めました。
バンドメンバー募集しております!!(ドラム1名(私)のアットホームなチームです。)
突然ですが、Excel、使われていますか?
Excel、本当に万能であるため、精算管理、申請書としてExcelを使用する職場も多いのではないでしょうか?
便利な反面、集計する側は結構大変だったりします。
5人とか10人程度の集計だったら頑張れる気もしますが、数百人、しかも有給申請だったり、交通費申請だったり、種類がいっぱいあると、ファイル数が膨大になって大変です。
マクロを作ってしまえば、複数のファイルを自動的に集計してくれたりもしますが、今回は
「ファイルが沢山出来てしまって煩雑になってしまう」
といった場面を解消するために、簡単なwebアプリを作ってデータはRDBに保存しようと思います。
そこで力を発揮してくれるのが、題名でご紹介した、「MyBatis」 です。
※使用環境
- windows10
- Eclipse IDE for Java Developers Version: 2022-09 (4.25.0)
- java 17
- spring-boot-starter-thymeleaf 3.0.1
- mybatis-spring-boot-starter 3.0.0
- mysql version 8.0.30
目次
1.MyBatisとは何者??
まず、MyBatis(マイバティス)とは、JavaとRDBのやり取りを簡略化してくれるデータマッパーフレームワークです。
アノテーションの使用や、xmlにSQLを記載することにより、Javaオブジェクトへのマッピングを自動で行ってくれます。
今回私が声を大にして皆さんにお伝えしたいのが
「JavaとRDBのやり取りが本当に簡単だった」
ということです。
また、今回はSpring Bootを使用してプロジェクトを立ち上げます。
2. 今回やりたいこと
冒頭でも申し上げましたが、個人のデータ数百件を、事務担当者が集計する際に手間のかからない様なシステムを構築することが目的です。
今回は、「交通費の精算管理」という場面を想定しております。
ざっと、目指したいものを図示します。コーディングしてて思いましたが、この作業、とても大事だなって思いました。
概略としては、アプリを起動すると、社員全ての情報(従業員番号、氏名等)が一覧となっているページが表示され、それぞれの従業員情報の横に、詳細ボタンが有り、クリックすると対応するユーザーの集計画面に遷移する、といった流れです。
3. Spring Boot 開始!!
プロジェクトを作成します。
eclipseを起動し、spring bootプロジェクトを開始します。(Spring Initializr)
画像のような画面が表示されます。ご自身のプロジェクトの内容を記載していきましょう。
次に依存関係の設定を行います。依存関係って何??と困惑しましたが、ざっくりいうと、どんな機能を使いたいか!のようです。
上記を終えて、完了ボタンを押すと、プロジェクトの雛形が作成されます!こんなに簡単に、、、、というので本当に驚きました。嘘みたいに爆速でしたが、これで準備は完了です。
4. DBを作成する
先程のInitializrでプロジェクト開始の準備は整いましたが、「どのDBと連携するか?」といったことは設定できていません。
\src\main\resources\application.propertiesにDBの情報を書き込んでいきます。
今回の場合は以下の通り記載しました。ご自身の環境と合わせて記載をお願いします。
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/transportmanage
spring.datasource.username=root
spring.datasource.password=root
2行目の"transportmanage"が今回作成したDBで、簡単な設計は以下のとおりです。
workerテーブル(社員情報)
- id
- first_name
- last_name
feeテーブル
- id
- round_trip
- total_fee
- use_date
双方のテーブルをid紐づけて参照できるようにしています。
これでDBの準備も完了です。
5.コーディングしよう
それではコーディングをしていきます。
すべて記載していくと膨大な文字数となってしまうため、要所のみ記載させていただく旨、ご了承いただければと思います。(想像以上の文字数でした。。。)
今回作成したwebアプリのディレクトリ構成は以下の通りとなっています。
5-1. Entityの作成
先程作成したテーブルのentityを作成します。
@Data
public class Fee {
// feeテーブルより取得
private Integer id;
private Integer round_trip;
private int total_fee;
private String use_date;
}
@Data
public class Worker {
// workerテーブルより取得
private Integer id;
private String first_name;
private String last_name;
}
@Data は Lombokの機能で、このアノテーションを使用するとsetter,getterの記述無しで処理を行ってくれます。簡単にしたかったので、もちろん利用です。
5-2. Formの作成
今回のアプリの要となる検索用のidはこちらのFormに格納されます。
後述しますが、html(Thymeleaf)からidはpostされます。
@Data
public class FeeForm {
private Integer id;
}
5-3. Daoの作成
続いてDaoを作成します。
ここで、MyBatisさんの登場です。
@Mapper
public interface WorkerDao {
List<Worker> AllWorker();
}
@Mapper
public interface FeeDao {
List<Fee> feeResult(Fee fee);
List<Fee> AllFeeResult();
void add(Fee fee);
}
@MapperはMyBatisのアノテーションでインターフェースに付与することによって、xmlにsqlを記載するだけでDBとのやり取りができてしまいます。
- resources\com\napa\app\dao\WorkerDao.xml
<select id="AllWorker" resultType="com.napa.app.entity.Worker">
SELECT * From worker order by id
</select>
- resources\com\napa\app\dao\FeeDao.xml
<select id="AllWorker" resultType="com.napa.app.entity.Fee">
SELECT * From fee WHERE id = #{id} order by id
</select>
selectやinsertで囲まれている部分を見てみると、SQL文がそのまま記載されています。
こういった形で、使用するEntityとsqlを記載するだけでOKなのです。
ただし、xmlのディレクトリには注意してください。@Mapperを使用する際は、Daoと対応した形で配置する必要があります。
- FeeDaoの場合
java\com\napa\app\dao\FeeDao.java
resources\com\napa\app\dao\FeeDao.xml
- WorkerDaoの場合
java\com\napa\app\dao\WorkerDao.java
resources\com\napa\app\dao\WorkerDao.xml
どちらもjava配下なのか、resources配下が違うのみで、それ以降は対応した形となっています。
5-4. Viewの作成
今回はViewでThymeleafを使用していますが、弊社の社員がTechBlogで記載していますので、詳細はそちらをご覧いただければと思います。
https://www.i-vinci.co.jp/techblog/664
今回コードの記載は省略させていただきます。
5-5. Controllerの作成
ゴールが見えてきました。
最後はControllerの作成です。
ControllerはViewとModelの制御をしてくれる部分です。
Spring Bootでは、クラスに@Controllerを付与するだけでControllerとして認識してくれます。
また、@RequestMapping("/workerlist")という記載は、()内に記載されているパスへ遷移した際に、本アノテーションを付与したクラスの処理がされます。
@Controller
public class WorkerController {
@Autowired
WorkerService workerservice;
@RequestMapping("/")
public String main(Model model) {
List<Worker> list = workerservice.AllWorkerSelect();
model.addAttribute("Worker", list);
return "main";
}
}
@Controller
@RequestMapping("/workerlist")
public class FeeController {
Integer sum = 0;
@Autowired
FeeService feeservice;
@RequestMapping("/result")
public String index(
@RequestParam String fname,
@RequestParam String lname,
FeeForm feeform,
String showList,
Model model
) {
sum = 0;
model.addAttribute("title", "Vinci_workerlist");
model.addAttribute("first", fname);
model.addAttribute("last", lname);
return "index";
}
@RequestMapping("/add")
public String add(Fee fee) {
feeservice.FeeAdd(fee.getId(), fee.getRound_trip(), fee.getTotal_fee(),fee.getUse_date());
return "redirect:/";
}
}
6. webアプリを起動してみる
少し駆け足で進めましたが、ここで作成したアプリを起動してみます。
プロジェクトを右クリック→デバッグ→SpringBootアプリケーション を押していくとできます。
(もちろん、開始の方からでも大丈夫です)
これは毎度のことなのですが、mysqlが起動できてません。
mysqldで起動します。
無事起動しました!現在コンテキストパスにアクセスしているので、index.htmlが表示されています。
それでは、「5000兆円欲しい」さんの詳細ボタンを押下してみます。
使用した履歴に加え、上部に合計金額を出力できています。
合計金額の出力については、しれっとWorkerControllerにて処理を記載していました。
if (feeform.getId() != null) {
List<Fee> list = feeservice.feeResult(feeform.getId());
for (int i = 0; i < list.size(); i++) {
sum += list.get(i).getTotal_fee();
}
model.addAttribute("fee", list);
model.addAttribute("sumfee", sum);
}
今回insert機能も追加しています。
試しにinsert機能を使用してみます。
(何も説明ないですが、上からID、往復、金額、右に向かって日付の順で入力します)
登録ボタンを押して、もう一度詳細を見てみます。
無事追加されていることが確認できます。
簡単にですが、アプリ完成です!!
7. 所感
今回、MyBatisを使用して普段のExcelで行っている作業をwebアプリに落とし込む、ということを行いました。
MyBatisのおかげで
RDBとJavaの紐づけがすっきりと簡単に記載することができ、webアプリの敷居はかなり低く感じました。
実は、自分で一からwebアプリを作成するのは今回が初めてでしたが、途中で挫折せずに一通りの過程を実施することにより、webアプリの理解が深まりました。(途中で、本当にたくさんのことをぐぐりました。)
今回作成したwebアプリは本当の触りでしかありませんので、今後グレードアップし、またブログに執筆したいな、と考えています。
最後まで読んでいただきまして、ありがとうございました。