MyBatisでforeachを使用して動的SQLを生成する
MyBatisでforeachを使用して動的SQLを生成する事が出来ます。 よくIN句の中で使用されます。
<select id="selsectA" parameterType="java.util.List" resultType="String"> SELECT ITEM_NAME FROM TBL WHERE ITEM_CD in <foreach item="item" open="(" close=")" collection="dataList" separator=","> #{item} </foreach> </select>
foreachなのでそのまま、dataListをループします。
その際、openで「(」、closeで「)」、各リスト事の区切り文字は「,」なので以下のようなSQLコードが生成されます。
('01','02','03')
バッチなどならバルクインサートで使用したりします。Oracleの場合は、 INSERT ALL も参照してください。以下はDB2で確認した例です。
<insert id="insertA" parameterType="java.util.List"> INSERTT INTO テーブル名 (COL1,COL2) VALUES <foreach item="item" collection="list" open="" close="" separator=","> #{item.id, jdbcType=INTEGER}, #{item.name, jdbcType=VARCHAR} </foreach> </insert>
collection=”list”としていますが、java.util.Listを継承するクラスの場合は、collection=”list”と記述します。(インスタンス名がlistでなくても)
配列の場合は、collection=”array”と記述します。
foreachのindexの使い方は こちら を参照ください。ちなみにindexの基底値は0です。
引数にListを渡すのではなく、Beanを渡す場合、getterメソッドが勝手に呼ばれます。
<select id="SQLID" parameterType="jp.co.confrage.SampleBean" resultType="String"> SELECT ID FROM ${schema}.TBL WHERE YYYY <![CDATA[<=]]> #{yyyy} </select>
getSchemaメソッド、getYyyyメソッドが実行されます。
Beanを詰めたListをparameterTypeで渡した場合もgetterは実行されました。
List<Bean> list = new ArrayList<Bean>();
Beanのスーパークラスのプロパティのgetterも実行されました。
以下のようなBeanの構成の場合です。
public class Bean extends SuperBean {