JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■SpringMVC の小径 第8歩 あと一歩 DB連携
8-3)XMLMapper
ここからは暫く、鬱蒼とした森林地帯の けもの道 が続きます。
道に迷わないように、先にどのようなルートを通るか確認しておきましょう。
これがこれから迷い込む、Mapperコースのルートとなりますので良く覚えておいてください。

JDBCMapperXML(DTO) Mapperインターフェース(DTO) ビジネスロジック(FormBean)コントローラ
※)ビジネスロジックと、コントローラは、この次の節で説明します。

しっかり頭に叩き込みましたか?
説明の都合上、ルートの順番通りに説明が進むとは限らないので迷わないでください。
迷ったら、一度ここに戻ってルートを再確認してください。
それでは突入します。

まず、MyBatisとはいったい何ぞや?という問いかけに対しては、
■MyBatis の小径 MyBatisとは」に、まったく役に立たない情報を載せていますので、
もし暇ができたら、ササーッと読み飛ばしてください。

で、MyBatisの使い方ですが、理論は置いといて実戦的解説に入ります。

MyBatisの設定を行う上で、避けて通れないのがデータベースのテーブル情報です。
あくまでテーブルありきの世界なので、まずそこらあたりから話を始めたいと思います。

最初に、必要となるデータベースのテーブルを作成しておきます。
前節で、PostgreSQLのセットアップを行った際に、
データベース(jlabodb)を作成しました(作成したつもり)。
このデータベースに、そうですね。「tbluser」というテーブルを作成しましょう。
テーブルの内容は、「7-2)入力チェック」で実施した画面の要素名に
対応した方が分かりやすいと思うので、
 create table tbluser (
  userid  serial PRIMARY KEY,  /* プライマリキー */
  myname varchar(32),  /* 名前 */
  age    int4,      /* 年齢 */
  phone  varchar(16),   /* 電話番号 */
  email   varchar(64),   /* email */
  checkVal varchar(6)    /* 好きなもの */
 );
とします。

MyBatis-Springで一番重要なのは、MapperXML定義なのですが、その話をする前に、
Mapperによって取り出されたデータを格納するための
DTO(Data Table Object)クラスを作成しておく必要があります。
いわゆる、ビジネスモデルとか、業務モデルと呼ばれるデータ格納Beanです。
MapperXMLの中では、このDTOを直接指定してあげる必要があるので、
話の順番としてDTOクラスから話を進めます。
DTOクラスのファイル名は、src/main/java/jp/dip/arimodoki/model/dto/User.java です。
src/main/java/jp/dip/arimodoki/model/dto/User.java

でも、なんかよく見ると、どこかで見たことがあるようなクラスですね。
良く気が付きました。
実は、このクラスは、前節で使用したパラメータ格納FormBean PromenadeForm.javaを
コピーしてビジネスモデル仕様に微修正したものです。
プロパティ名とDBテーブル(tbluser)のカラム名を完全に一致させています。

さらによく観察すると、各プロパティに前に解説した入力検証用アノテーションも
付いたままになっています。これは次の節で説明しますので、
今は、PromenadeForm.javaから、仲間たちがごっそり
User.javaに引っ越したんだ。と思ってください。


次は、DTOクラスのインターフェースファイル。
これは、Eclipseで自動出力するので特段説明の必要はないでしょう。
src/main/java/jp/dip/arimodoki/model/dto/UserIf.java

 

次は、MapperXMLの本体。DBのテーブルにアクセス(select/insert/update/delete)するための、XML定義を作成します。
このファイルに記述されているSQL文がJDBC経由で実行され、結果が返ります。
ファイル名は特に規定はないので、ここでは、UserMapper.xml としておきます。
ファイルの配置先ですが、前節のapplicationContextDB.xmlで定義した、mapperLocations
の指定に従って、WebContent/WEB-INF/mappers の下に配置します。
WebContent/WEB-INF/mappers/UserMapper.xml
大まかな処理内容としては、実行するSQL文をXMLで定義しています。
先頭の、namespaceで指定されているパッケージは、このMapperXMLを使用する
 Mapperインタフェースを指定しています。
parameterTypeで指定されている型は、Javaから呼び出されたメソッドの引数に該当します。
 Userのようなクラスで指定された場合は、クラスのプロパティを使用して、
 #{userid}のように指定できますが、intの様な型で指定された場合はプロパティ名が分からないので
 #{value} という形で引数の値を取得します。
resultTypeで指定されている型は、SQLの処理結果を返す変数の型です。
 Mapperインターフェースを介して、Java側に返却されます。

<select></select> :参照系のSQLを実行します。
<insert></insert> :新規追加系のSQLを実行します。
<update></update> :更新系のSQLを実行します。
<delete></delete> :削除系のSQLを実行します。
各XMLタグのidで指定されている名称が、次に説明するMapperインタフェースのメソッド名となります。
Java側では、このメソッドを呼び出しでDBにアクセスします。

parameterTypeや、resultTypeで指定されている、自作のDTOクラス(User)ですが、
パッケージ名が指定されていないので、MapperXMLはどこのパッケージか解らないように思えますが、
これは、前に説明したDB接続情報「applicationContextDB.xml」の、sqlSessionFactory Beanで
「typeAliasesPackage」というプロパティで対象パッケージが指定されています。

 

最後は、JavaからMapperXMLを呼び出すための、Mapperインターフェースを作成します。
src/main/java/jp/dip/arimodoki/mapper/UserMapper.java

おや、またなにか新しいアノテーション宣言が出てきましたね。
@Repositoryアノテーション
前に一度お話ししてるはずですが、
どういう意味のアノテーションだったかお覚えていますか?

え~と、、、、あるじゃ~のん?

。。。。ん~と、、、、、あなたの頭脳は、どうもアルジャーノンより劣っているみたいですが、
まぁいいでしょう。
7-1)データモデルバインド」で既に説明しましたが、
DBアクセス層のクラス(or インターフェース)には、@Repositoryアノテーションを使用するという説明でしたね。
UserMapper.javaは、まさにMapperXMLを介して、Javaから直接DBにアクセスするインターフェースなので
@Repositoryアノテーションを宣言しています。
で、インターフェースの各メソッド名について説明すると、
上の、MapperXML(UserMapper.xml)の中に書いてあるselectなどのXMLタグの id で指定されている名称が、
そのまま一対一で、インタフェースのメソッド名になっています。

 

迷路が蜘蛛の糸のように絡み合い、あっち行ったりこっち行ったり、
なかなか骨の折れるコースでしたが、やっと通過しました。
一応、おさらいをしておきます。 ここで説明したのは、最初にお見せしたMapperコースのうち
MapperXML(DTO)Mapperインターフェース
の部分だけです。
ずいぶん歩き回ったつもりでしたが、実はたったこれだけしか進んでいませんでした。
迷路に感覚を狂わされてしまったようですね。
残りの
(DTO)ビジネスロジック(FormBean)コントローラ
は、次の節で説明します。
なんか顔色が良くないみたいですが、ほんとに大丈夫ですか?
もう少しで陽の当たる場所に出ますから、頑張って進みましょう。