Spring BootでMyBatisを使ったときのメモを残しておきます。具体的には、MyBatisを使ってSELECT文を発行し、結果をコンソールに表示するプログラムを作ります。今回使用するデータベース(H2)はメモリ上で利用するものなので、事前にMySQLやOracleといったクライアントを用意する必要はありませ … ''', src/main/groovy/com/example/mybatisdemo/mapper/TodoMapper.groovy, https://github.com/kazuki43zoo/qiita-materials/tree/master/mybatis-spring-boot/mybatis-demo, https://github.com/kazuki43zoo/qiita-materials/tree/groovy-with-mybatis-spring-boot-2.0/mybatis-spring-boot/mybatis-demo, https://github.com/groovy/groovy-eclipse/wiki/Groovy-Eclipse-Maven-plugin, https://github.com/groovy/groovy-eclipse/wiki, http://qiita.com/kazuki43zoo/items/ea79e206d7c2e990e478, XMLファイル(サブプロジェクトからVelocityとFreeMarkerの提供もあり), you can read useful information later efficiently. ヰ刀のおもちゃ箱

前章までで、設定方法と SQL マップの書き方は学びました。MyBatis Java API は、今までの努力が実を結ぶところです。この章を読めば、JDBC と比べると、MyBatis によってコードが大幅に単純化され、クリーンで理解しやすくメンテナンスも容易な状態を保つことができるということが分かると思います。, Java API の説明に入る前に、ディレクトリ構造に関するベストプラクティスを理解しておくことが重要です。MyBatis は柔軟で、基本的にファイルは好きな場所に配置することができますが、多くのフレームワークと同様に推奨される構成があります。, これは推奨されるディレクトリ構造であって必須ではありませんが、一般的なディレクトリ構造を使っておけば他の開発者からは感謝されるはずです。, MyBatis の最も良く使う Java インターフェイスは SqlSession です。コマンドの実行、Mapper の取得、トランザクション管理はこのインターフェイスを通して行うことができます。SqlSession については、後で詳しく説明しますが、その前に SqlSession のインスタンスを取得する方法について学ばなくてはなりません。SqlSession は SqlSessionFactory のインスタンスによって作成されます。SqlSessionFactory には、様々な方法で SqlSession を作成するメソッドが含まれています。SqlSessionFactory 自身は SqlSessionFactoryBuilder によって作られますが、作成される SqlSessionFactory は XML、アノテーション、ハードコードされた Java コンフィグレーションのいずれかの方法で設定することができます。, NOTE MyBatis を Spring や Guice といった依存性注入(DI = Dependency Injection)フレームワークと組み合わせて使う場合、SqlSession は DI フレームワークによって作成・注入されます。SqlSessionFactoryBuilder や SqlSessionFactory を使う必要はありませんので、SqlSession の章まで飛ばして構いません。DIフレームワークとの組み合わせについては MyBatis-Spring および MyBatis-Guice のマニュアルを参照してください。, SqlSessionFactoryBuilder には5つの build() メソッドがあり、それぞれ異なるソースから SqlSessionFactory をビルドすることができるようになっています。, 良く使うのは、InputStream のインスタンスを引数に取って XML ファイル(具体的には mybatis-config.xml ファイル)を読み込む最初の4つのメソッドです。オプションの引数は environment と properties です。environment は、データソースやトランザクションマネージャーも含めて、どの environment を読み込むかを決定します。例:, 引数として environment を取る build メソッドを呼び出した場合、MyBatis はその environment の設定を使ってビルドを実行します。未定義の environment を指定した場合はエラーが発生します。引数に environment を取らない build メソッドを呼び出した場合はデフォルトの environment が使用されます(上記の例では default="development" と指定されています)。, 引数に properties のインスタンスを取る build メソッドを実行した場合、これらのプロパティは設定内でアクセスできるように読み込まれます。設定内では ${propName} のように記述することでプロパティを参照することができます。, このドキュメントの前の方で説明しましたが、プロパティは mybatis-config.xml ファイルからも参照される可能性があるので、優先順位について理解しておくことが重要です。再掲しておきます。, プロパティが複数の箇所で指定されていた場合、MyBatis は次の順序で読み込みます。, 従って、メソッド引数として渡されたプロパティが最も優先度が高く、次に resource/url 属性、最も優先度が低いのは properties 要素のボディで指定された値ということになります。, まとめると、最初の4つの build メソッドはだいたい同じで、必要に応じて environment と properties をオーバーライドできるメソッドを選択することができます。mybatis-config.xml ファイルから SqlSessionFactory をビルドする例を挙げておきます。, ここでは org.apache.ibatis.io パッケージに含まれている Resources ユーティリティクラスを利用しています。このクラスは名前からも分かるように、クラスパスやファイルシステムあるいはウェブ上の URL からリソースを読み込むためのメソッドを提供します。分かりやすい実装なので、ソースを読めばどのようなメソッドが用意されているか分かると思いますが、シグネチャだけリストアップしておきます。, もう一つの build メソッドは Configuration のインスタンスを引数に取ります。Configuration クラスには、SqlSessionFactory のインスタンスについて必要とされる設定が全てが含まれています。Configuration クラスを使うと、設定を調べたり、SQL マップの検索、変更を行うこともできます(アプリケーションがリクエストを受け付けた後で SQL マップを操作するのは避けるべきですが)。Configuration クラスは Java API からのみ利用可能で、これまでに出てきた全ての設定にアクセスすることができます。コード内で生成した Configuration のインスタンスを build() メソッドに渡して SqlSessionFactory を作成する簡単な例を挙げておきます。, SqlSessionFactory が手に入ったので、SqlSession のインスタンスを生成することができます。, SqlSessionFactory には、SqlSession のインスタンスを作成するためのメソッドが6つ用意されています。一般的には、以下のような条件を考慮してメソッドを選ぶことになると思います。, 上記の判定によって渡すべき引数が決まれば適切な openSession() メソッドを選択することができるはずです。, 引数を取らないデフォルトの openSession() メソッドは次のような性質を持った SqlSession を生成します。, ほとんどのメソッドは見たままです。auto-commit を有効にするには、オプションの引数 auto-commit に対して true を指定します。自前の接続を使う場合は、Connection のインスタンスを引数として渡します。auto-commit と Connection を両方引数に持つメソッドはありませんが、これは MyBatis が渡された Connection のモードをそのまま利用するからです。トランザクション分離レベルを指定する場合、MyBatis が提供する enum 型のラッパー TransactionIsolationLevel を引数として渡します。JDBC によって提供される5つのトランザクション分離レベル(NONE, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE) が用意されています。, もう一つの引数 ExecutorType は列挙型で、3つの値が定義されています。, NOTE 説明しませんでしたが、SqlSessionFactory にはもう一つ getConfiguration() というメソッドがあります。このメソッドは、MyBatis の実行時設定についての情報を保持する Configuration のインスタンスを返します。, NOTE 旧バージョンの MyBatis では、セッション、トランザクション、バッチは互いに独立していました。MyBatis 3 では、これら3つは全てセッションのスコープに含まれているので、それぞれを別々に扱う必要はありません。, 以前説明したように、SqlSession は MyBatis でも最も強力なクラスで、ステートメントの実行、トランザクションのコミットまたはロールバック、Mapper インスタンスの取得を行うメソッドが全て含まれています。, SqlSession には 20 を超えるメソッドが定義されていますので、いくつかのグループに分けて説明します。, これらは、SQL Mapper で定義されている SELECT, INSERT, UPDATE, DELETE の各メソッドを実行するためのメソッドです。ほとんど自明ですが、それぞれ引数としてステートメントの ID とステートメントの引数オブジェクト(プリミティブ、JavaBean、POJO、Map のいずれか)を取ります。, selectOne と selectList の違いは、selectOne は1つのオブジェクトまたは null を返さなくてはならないということです。複数のオブジェクトが返されると例外が発生します。結果のオブジェクト数が未知の場合は selectList を使用してください。オブジェクトが存在するかどうかを確認したいのなら、カウント結果(0 or 1)を返すようにした方が良いでしょう。selectMap は、結果のリストを mapKey で指定したプロパティに基づいたマップに格納して返す特殊なメソッドです。ステートメントの引数は不要な場合もあるので、parameter オブジェクトの引数を持たないオーバーロードメソッドも用意されています。, insert, update, delete の各メソッドは、ステートメントの実行によって影響を受けた行数を返します。. Why not register and get more from Qiita? MyBatis設定ファイル内の typeHandler 要素の属性値として指定; @org.apache.ibatis.type.MappedTypes アノテーションと @org.apache.ibatis.type.MappedJdbcTypes アノテーションに指定; MyBatis3から提供されているTypeHandlerの基底クラス(org.apache.ibatis.type.BaseTypeHandler)を継承することで指定 Java版(src/main/java/com/example/mybatisdemo/mapper/TodoMapper.java), "INSERT INTO todo (title, details, finished) VALUES (#{title}, #{details}, #{finished})", "SELECT id, title, details, finished FROM todo WHERE id = #{id}", Groovy版(src/main/groovy/com/example/mybatisdemo/mapper/TodoMapper.groovy), ''' IDEとしてEclipse系を使う場合は、Groovy-Eclipseプラグイン + M2E Connectorをインストールしておくことで簡単にプロジェクトをインポートすることができます。ちなみに・・・IDEとしてIntelliJ IDEA‎を使う場合は標準でGroovyがサポートされているため、プラグインなどのインストールなどは不要です!!, なお、本投稿では以前投稿した「mybatis-spring-boot-starterの使い方」で作成したプロジェクトをGroovy化する方法を紹介します。IDEへのインポート方法は説明しませんが、いまくいかなければコメントください!ベストエフォートでサポートします。, 「mybatis-spring-boot-starterの使い方」を参照して、Java版のプロジェクトを作ってみてください。作るのが面倒な方は、以下に完成品が置いてあります。, まず、pom.xmlにGroovy-Eclipse Maven Pluginの定義しましょう。, TodoMapper.groovyをsrc/main/groovy配下に格納します。なお、Java版のTodoMapper.javaはこのタイミングで削除してください。, Lombokを使う場合は、通常のdependencyの定義に加えてmaven-compiler-pluginの設定変更が必要になります。, MapperインタフェースをGroovy化することで、快適なアノテーション駆動のSQL開発ができそうです。個人的には基本はアノテーションを使い、アノテーションで実現できない機能を利用したいときだけXMLを利用すればよい気がしています。, Javaエンジニアで、SpringやMyBatisらへんにそれなりに詳しいです。お仕事のつながりで「Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発」を共著させてもらいました!. VALUES MyBatisでは、SQLやマッピング定義を記載する方法として以下の2つの方法が用意されています。 XMLファイル(サブプロジェクトからVelocityとFreeMarkerの提供もあり) アノテーション(@Select, @Insert, @Update, @Delete, etc..) Mapper アノテーション. INSERT INTO todo By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. Xmlベースで結合SQLによ […][…], 目次 1. test-context.xmlにてAOPの設定を行った後に、テストを実行しようとした時 […][…], 目次 1. 以上が、「MyBatis(MyBatis Generator)」を利用した基本的なDBアクセスの説明となります。 DBアクセス部分のみ掻い摘んでの説明となってしまい、分かりづらい箇所も多数あったかと思いますが、非常に便利なフレームワークかと思います。 A Cursor offers the same results as a List, except it fetches data lazily using an Iterator. アノテーションを付加したネームスペース(=クラス)に対するキャッシュを設定します。属性: 別のネームスペースに対して定義されているキャッシュの設定を参照します。XML マッパーで宣言されているキャッシュは、namespace に同一 FQCN が指定されていても独立したキャッシュとして扱われます。属性: ある結果列とプロパティまたはフィールドのマッピング情報を定義する Results のリストです。属性: このアノテーションは Map を返すメソッドに付加します。結果オブジェクトのリストを Map として返すことができます。単一値, このアノテーションを使うと、通常マップドステートメントの属性として指定される多様なスイッチや設定オプションにアクセスすることができます。, これらのアノテーションは、それぞれ実行対象の SQL に対応しています。各アノテーションは String の配列(単一の String でも OK)を引数に取ります。 Spring FrameworkのUnitテスト実装方法 1-3.Repositoryテ […][…], 次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。, DemoMapperXmlSepaleteがXmlベースで単一SQLのネストによるマッピング実装, 【Spring Boot】【Mybatis】Xmlベースで単一SQLのネストによるマッピング実装, 【Spring Boot】【Mybatis】Xmlベースで結合SQLによるマッピング実装, test-context.xmlにてAOPの設定を行った後に、テストを実行しようとした時に以下のエラーが発生, Spring FrameworkのUnitテスト実装方法 1-3.Repositoryテスト(Junit4, spring-test, DBUnit), STS(eclipse)からmavenビルドでjarファイルを作ろうとしたらエラーになった話, mybatisでstring型を動的パラメータ(${ })で渡そうとしたらエラー MyBatisSystemException, Windows10のwindows updateが失敗する「Service Registration is Missing or Corrupt」, 【SpringBoot】InterceptorでHeader情報を受け取り、Service層などで使用する, 【Spring Boot】【MyBatis】【DBSetup】Repository層(Mapper)の単体Test実装方法, 【SpringBoot】【MyBatis】SQLのシーケンスで自動生成されるデータをEntitiyに格納する方法, 【Spring Boot】【MyBatis】SQL実行時のlogging出力設定(一番お手軽なやつ).