■SpringMVC の小径 第8歩 あと一歩 DB連携 |
8-3)XMLMapper |
ここからは暫く、鬱蒼とした森林地帯の けもの道 が続きます。 道に迷わないように、先にどのようなルートを通るか確認しておきましょう。 これがこれから迷い込む、Mapperコースのルートとなりますので良く覚えておいてください。 JDBC⇔MapperXML⇔(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)⇔コントローラ は、次の節で説明します。 なんか顔色が良くないみたいですが、ほんとに大丈夫ですか? もう少しで陽の当たる場所に出ますから、頑張って進みましょう。 |
8-2)JDBC接続 ![]() |
8-3)XMLMapper
HOME |
![]() |