添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

MyBatisでforeachを使用して動的SQLを生成する

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 {