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: 필수적으로 지정해야 하며, 다양한 상황에서 값이 다릅니다.
- 단일 매개변수이며 그 타입이 List일 때, collection 속성 값은 list입니다.
- 단일 매개변수이며 그 타입이 배열일 때, collection 속성 값은 array입니다.
- 여러 매개변수가 있을 때, 이를 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>
태그 설명:
- prepend: SQL 문의 앞부분에 추가할 부분 (선택사항)
- property: java.util.List 타입의 반복 요소 (필수)
- open: 전체 반복 내용의 시작 문자열 (선택사항)
- close: 전체 반복 내용의 종료 문자열 (선택사항)
- conjunction: 각 반복 내용 사이의 문자열 (AND 또는 OR, 선택사항)
주의사항
- 여기서 전달되는 매개변수는 Map<string, object>입니다.
Map<String, Object> conditions = new HashMap<String, Object>();
conditions.put("rebateConfigValue", rebateValue); // rebateValue는 고정된 값
conditions.put("list", productCodeList);
- 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);