MyBatis에서의 배치 처리

XML 배치 쿼리

collection: 반복할 컬렉션 지정 (list, array, map 세 가지 경우) !!!!주석으로 SQL을 사용하는 경우, 여기에 mapper 메서드의 컬렉션 이름을 입력하세요. item: 현재 반복되는 요소를 지정된 변수에 할당 (for 루프의 i와 동일) separator: 각 요소 사이의 구분자 open: 모든 결과를 연결하는 시작 문자 close: 모든 결과를 연결하는 종료 문자 index: 인덱스. list를 반복할 때 index는 인덱스이고 item은 현재 값입니다. #{변수명}으로 변수 값을 가져올 수 있습니다.

List를 XML 방식으로 사용

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
TestDAO.getItemsByList(list);

xml에서의 SQL:
<select id="getItemsByList" resultType="java.util.HashMap">
   SELECT id, display_name as name FROM t_recommendation_info WHERE id IN
   <foreach item="item" index="index" collection="list"
            open="(" separator="," close=")">
      #{item}
   </foreach>
</select>

Map을 XML 방식으로 사용

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("mapList", list);
TestDAO.getItemsByList(params);

xml에서의 SQL:
<select id="getItemsByList" resultType="java.util.HashMap">
   SELECT id, display_name as name FROM t_recommendation_info WHERE id IN
   <foreach item="item" index="index" collection="mapList"
            open="(" separator="," close=")">
      #{item}
   </foreach>
</select>

객체를 XML 방식으로 사용

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

// TestModel 클래스 구현
public class TestModel {
    private List<Integer> searchList;

    public List<Integer> getSearchList() {
        return searchList;
    }

    public void setSearchList(List<Integer> searchList) {
        this.searchList = searchList;
    }
}

TestModel tm = new TestModel();
tm.setSearchList(list);
TestDAO.getItemsByList(tm);

xml에서의 SQL:
<select id="getItemsByList" resultType="java.util.HashMap">
   SELECT id, display_name as name FROM t_recommendation_info WHERE id IN
   <foreach item="item" index="index" collection="searchList"
            open="(" separator="," close=")">
      #{item}
   </foreach>
</select>

XML 배치 insert -- MySQL

<!-- 배치 삽입 테스트 -->
<insert id="insertList" parameterType="java.util.List">
   INSERT INTO t_enterprise_water_ele
   (
   <include refid="Base_Column_List"/>
   )
   VALUES
   <foreach collection="list" item="item" index="index" separator=",">
      (
         #{item.waterEleId, jdbcType=VARCHAR},
         #{item.enterpriseId, jdbcType=VARCHAR},
         #{item.enterpriseUscc, jdbcType=VARCHAR},
         #{item.enterpriseName, jdbcType=VARCHAR},
         #{item.yearmonth, jdbcType=VARCHAR},
         #{item.waterSize, jdbcType=DECIMAL},
         #{item.waterAmount, jdbcType=VARCHAR},
         #{item.eleSize, jdbcType=DOUBLE},
         #{item.eleAmount, jdbcType=VARCHAR},
         #{item.status, jdbcType=INTEGER},
         #{item.operator, jdbcType=VARCHAR},
         #{item.operateTime, jdbcType=TIMESTAMP}
      )
   </foreach>
</insert>

foreach 태그에 대한 설명은 다음과 같습니다: foreach는 주로 in 조건을 구성할 때 사용되며, SQL 문에서 컬렉션을 반복합니다. foreach 요소의 속성에는 item, index, collection, open, separator, close가 있습니다.

  • item: 컬렉션의 각 요소를 반복할 때 사용되는 별칭
  • index: 반복 중인 위치를 나타내는 이름
  • open: 문장이 어떻게 시작되는지
  • separator: 각 반복 사이에 어떤 기호를 분리자로 사용할 것인지
  • close: 문장이 어떻게 끝나는지
  • collection: 필수적으로 지정해야 하며, 다양한 상황에서 값이 다릅니다.
  1. 단일 매개변수이며 그 타입이 List일 때, collection 속성 값은 list입니다.
  2. 단일 매개변수이며 그 타입이 배열일 때, collection 속성 값은 array입니다.
  3. 여러 매개변수가 있을 때, 이를 Map으로 래핑해야 합니다. 단일 매개변수도 Map으로 래핑할 수 있습니다.

XML 배치 insert -- Oracle

<insert id="insertForeach" parameterType="java.util.List" useGeneratedKeys="false">
   INSERT INTO m_db_task_step
   ( STEP_ID, COMP_NO, TASK_NO, STEP_NAME, STEP_SN, PRE_STEP_ID )
   SELECT A.*
   FROM(
   <foreach collection="list" item="item" index="index" separator="UNION ALL">
      SELECT
      #{item.stepId} AS STEP_ID,
      #{item.compNo} AS COMP_NO,
      #{item.taskNo} AS TASK_NO,
      #{item.stepName} AS STEP_NAME,
      #{item.stepSn} AS STEP_SN,
      #{item.preStepId} AS PRE_STEP_ID
      FROM dual
   </foreach>
   )A
</insert>

XML 배치 삭제

<delete id="deleteByBatch" parameterType="java.lang.String">
   DELETE FROM t_enterprise_output_value
   WHERE OUTPUT_ID IN
   <foreach collection="array" item="outputId" open="(" separator="," close=")">
      #{outputId}
   </foreach>
</delete>

XML 배치 업데이트

<update id="WHOLESALE-UPDATE-REBATE-CONFIG-BY-PRODUCTCODE">
   UPDATE rebate_config
   SET rebate_type = 'BY_RATE', rebate_config_value = #rebateConfigValue#
   WHERE
   <iterate property="list" conjunction="or" open="(" close=")">
      product_code = #list[]#
   </iterate>
</update>

태그 설명:

  1. prepend: SQL 문의 앞부분에 추가할 부분 (선택사항)
  2. property: java.util.List 타입의 반복 요소 (필수)
  3. open: 전체 반복 내용의 시작 문자열 (선택사항)
  4. close: 전체 반복 내용의 종료 문자열 (선택사항)
  5. conjunction: 각 반복 내용 사이의 문자열 (AND 또는 OR, 선택사항)

주의사항

  1. 여기서 전달되는 매개변수는 Map<string, object>입니다.
Map<String, Object> conditions = new HashMap<String, Object>();
conditions.put("rebateConfigValue", rebateValue); // rebateValue는 고정된 값
conditions.put("list", productCodeList);
  1. List 요소 이름 뒤에 괄호 []를 포함하는 것이 중요합니다. 괄호 []는 객체를 List로 표시하여 파서가 단순히 String으로 출력하지 않도록 합니다.

주석 방식의 배치 처리

@Select({
   "<script>"
      + "SELECT "
      + "orders.orderId, product_sku.productId, product_sku.skuName, "
      + "orders.number, orders.orderPrice, product_sku.skuPrice, "
      + "orders.orderCreate, customer.mobile, shop_keeper.mobile1 as shopKeeperMobile, "
      + "shop.name, orders.shopId, shop.address, shop.cityCode "
      + "FROM orders, product_sku, customer, shop, shop_keeper "
      + "WHERE orders.skuId=product_sku.skuId "
      + "AND orders.customerId = customer.customerId "
      + "<if test='orderStatus != null'>"
      + "AND orders.orderStatus IN "
      + "<foreach item='status' index='index' collection='orderStatus' open='(' separator=',' close=')'>"
      + "#{status} "
      + "</foreach>"
      + "</if>"
      + "AND orders.shopId = shop.shopId "
      + "AND orders.shopId = shop_keeper.shopId "
      + "ORDER BY customer.mobile DESC, orders.shopId DESC ,orders.orderCreate DESC"
   + "</script>"
})
List<Map<String, Object>> selectOrders(@Param(value="orderStatus") List<Short> orderStatus);

@Update({
   "<script>"
      + "UPDATE orders SET orderStatus = #{orderStatus} WHERE orderId IN "
      + "<foreach item='item' index='index' collection='orderId' open='(' separator=',' close=')'>"
      + "#{item}"
      + "</foreach>"
   + "</script>"
})
int updateOrderStatus(@Param("orderStatus") Short orderStatus, @Param("orderId") String[] orderList);

태그: MyBatis XML SQL Batch Processing java

8월 20일 11:28에 게시됨