目的
現場で触る機会のあるMybatisのMapperXMLファイルの書き方について備忘のため
Mybatisの特徴
①SQLとJavaコードを分離する
SQL文をJavaコードから切り離し、XMLファイルに一元管理します。これにより、SQLの変更がJavaコードに影響を与えにくくなり、保守性が向上します。
②SQLの柔軟性
JDBCよりもはるかに柔軟なSQL記述が可能です。動的なSQLを組み立てるための強力な機能(if, foreach, whereなど)を提供します。
③シンプルなマッピング
SQLの結果をPOJO(Plain Old Java Object)に簡単にマッピングできます。
備忘録
適宜追記していきます。
$と#の使い分け
MybatisにはPreparedStatementという、SQL文をあらかじめコンパイルし後からパラメータを安全にバインドするための仕組みがある。
#{id}
のような形で記載すると、プレースホルダとして扱われ、パラメータがバインドされる対象となる。
これによってSQLインジェクションを防ぐことが出来るというメリットがある。
基本的にこちらを使用すればOK
一方で、${group}
のような形で記載すると、プレースホルダとして扱われることなく、直接SQL文に埋め込まれることとなる。
使いどころ:テーブル名やカラム名などのメタ情報を動的に埋め込みたいとき
テーブルで自動採番されるカラムの取り扱い
ステートメントの属性として以下を指定する。
・useGeneratedKeys
・keyProperty
useGeneratedKeysをtrueとすることで自動採番ということを示し、DBで生成された値がKeyPropertyで示されたフィールドにマッピングされる。
また、自動採番のカラムはSQLに含める必要はない。
※insert時にNULL制約のエラーが出たらDB側で自動採番設定が出来ているか確認しましょう
<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>
ドキュメント