배경 설명 : 일반적으로 한 번에 여러 데이터를 업데이트 해야하는 경우 하나씩 업데이트하는 두 가지 방법이 있습니다. (1) 비즈니스 코드를 통해 하나씩 업데이트하기 위해 루핑. (2) 모든 데이터를 한 번에 업데이트하십시오 (보다 정확하게 보려면 모든 데이터를 업데이트하는 것은 SQL 문입니다. 업데이트 작업을 데이터베이스 측면에 하나씩 올리며 비즈니스 코드 측면은 모든 데이터를 한 번에 업데이트하는 것입니다). 두 가지 방법에는 장단점이 있습니다. 다음은 두 가지 방법의 장단점을 간단히 분석하고 주로 Mybatis에서 두 번째 방법의 구현을 소개합니다.
하나씩 업데이트하십시오
이 방법은 분명히 가장 단순하고 가장 적은 오류입니다. 오류가 발생하더라도 오류 데이터에만 영향을 미칩니다. 각 데이터에 의해 제어 될 수 있습니다. 업데이트가 실패하거나 성공하면 어떤 컨텐츠가 업데이트되는지에서 어떤 콘텐츠로 업데이트 될 수 있습니다. 코드는 다음과 같습니다.
updatebatch (list <mydata> datas) {for (mydata data : datas) {try {mydatadao.update (data); // 데이터 업데이트, myBatis에서 아래 XML 파일의 업데이트} catch (예외 e) {... // 업데이트가 실패하면 오류 로그와 같은 다른 작업을 수행 할 수 있습니다. MyData 세트를 업데이트 ... 여기서 ... </update>이 방법의 가장 큰 문제는 효율성 문제입니다. 그것은 하나씩 업데이트하고 매번 데이터베이스에 연결 한 다음 업데이트 한 다음 연결 리소스를 출시합니다 (자주 연결된 데이터의 효율성은 연결 풀을 통해 크게 개선 될 수 있지만 많은 양의 데이터를 견딜 수 없습니다). 이 손실은 데이터 양이 클 때 효율성 문제를 반영합니다. 이것은 또한 비즈니스 요구를 충족시킬 때, 위에서 언급 한 두 번째 배치 업데이트 구현은 일반적으로 사용됩니다 (물론이 방법에는 데이터 척도 제한도 있습니다. 나중에 언급됩니다).
SQL 배치 업데이트
SQL 문은 모든 데이터를 배치로 업데이트하는 데 사용됩니다. mybatis로 일반적으로 쓰여진 방법을 살펴 보겠습니다 (Mybatis 구문을 제거하는 것은 기본 SQL 명령문이므로 SQL로 작성된 방법에 대해서는 이야기하지 않습니다).
<Update id = "updatebatch"parametertype = "java.util.list"> 업데이트 myData_table status = <foreach collection = "list"item = "item"index = "index"separator = ""case id "cose" "end"> #{item.id} 그런 다음 #{item.status} < ""indine = "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" Separator = ","Open = "("close = ")"> #{item.id, jdbctype = bigint} </foreach> </update>언제 ... 그런 다음 ... "스위치"구문은 SQL입니다. 여기서 Mybatis의 <foreach> 구문은 배치 업데이트 SQL을 함께 조각하는 데 사용됩니다. 위의 것은 Updatebatch 매개 변수의 ID 목록에 전달 된 데이터의 상태 필드가 배치 업데이트되었음을 의미합니다. <trim>을 사용하여 동일한 함수를 구현할 수도 있습니다. 코드는 다음과 같습니다.
<update id = "updatebatch"parametertype = "java.util.list"> update mydata_table <trim prefix = "set"set "set"set "tripixoverrides =", "> <trim prefix ="case "subsix ="end, "> <foreach collection ="list = "item"index = "index"> when quem.id} </trim> </trim> id in <foreach collection = "list"index = "index"item = "item"exparator = ","open = "("close = ")" "> #{item.id, jdbctype = bigint} </foreach> </update><trim> 속성 설명
1. prefix, 접미사는 트림 태그에 래핑 한 부분을 앞뒤에 컨텐츠를 추가하는 것을 의미합니다.
2. 접두사 오버 리드가 동시에있는 경우, 접근 방식은 접두사의 내용이 접두사와 접미사로 덮어 쓰는 것을 의미합니다.
3. 접두사 만있는 경우, 접미사 오버 리드는 시작 또는 끝에서 xxxoverides로 지정된 내용을 삭제하는 것을 의미합니다.
위의 코드는 다음과 같이 SQL로 변환됩니다.
mydata_table set status = case id = #{item.id} 그런 다음 #{item.status} // <foreach> 확장 값 ... id in in (...);물론 이것은 가장 쉬운 배치 업데이트 구현입니다. 때로는 여러 필드를 업데이트해야 할 수도 있으므로
<trim prefix = "status = case"suffix = "end,"> <foreach collection = "list"item = "item"index = "index"> id = #{item.id} #{item.status} </foreach> </trim>여러 번 복사하고 접두사의 내용을 변경하고 언제 ... 그리고 ... 그리고 ... 그리고 특정 필드의 기본값을 설정 해야하는 경우 다른 것을 사용할 수 있습니다.
<trim prefix = "status = case"suffix = "end,"> <foreach collection = "list"item = "item"index "> id = #{item.id} #{item.status} </foreach> else default_value </trim>또한 업데이트 할 데이터를 판단 해야하는 더 일반적인 상황이 있으며 조건을 충족하는 데이터 만 업데이트 할 수 있습니다. 이 상황은 다음과 같습니다.
<trim prefix = "status = case"suffix = "end,"> <foreach collection = "list"item = "item"index = "index"> <extatus! = null and item.status! = -status! = -11 "> id = #{item.id} #{item.status} </foreach> </foreach> 이 경우 status != null && status != -1 업데이트 될 목록의 데이터 만 업데이트 할 수 있습니다. 원래 데이터를 변경하지 않고 기본값으로 업데이트됩니다. 원래 데이터를 변경하지 않으려면 어떻게해야합니까? 즉, 조건을 충족하는 업데이트와 조건을 충족하지 않는 업데이트는 변경되지 않았습니다. 간단한 방법은 Mybatis에 ... 다른 ... 구문이 없기 때문에 다른 <if>를 추가하는 것입니다.
<trim prefix = "status = case"suffix = "end,"> <foreach collection = "list"item = "item"index = "index"> <if test = "initem.status! = null 및 item.status! = -11"> 언제 id = #{item.id} #{item.status} </if> <initem.Status = "if test =" id =#{item.id} 그런 다음 mydata_table.status // 이것은 원래 데이터입니다 </if> </foreach> </trim>입니다전체 배치 업데이트는 다음과 같이 작성됩니다.
<Update id = "updatebatch"parametertype = "java.util.list"> update mydata_table <trim prefix = "set"set "set"set "tripixoverrides =", <trim prefix = "ritip"astix = "end,"> foreach collection = "item"index = "index"> emptatus! id =#{item.id} 그런 다음#{item.status} </if> <if test = "item.status == null 또는 item.status == -1"> id =##{item.id} 때 mydata_table.status // 원본 데이터 </if> </foreach> </trim> < "index =" "" "" "" "" "" "" "" "" "" "" "index =" " Separator = ","Open = "("close = ")"> #{item.id, jdbctype = bigint} </foreach> </update>이 배치 및 핵심 데이터베이스 방법은 데이터베이스 연결에서 모든 데이터를 업데이트하여 빈번한 데이터베이스 설정 및 단절의 오버 헤드를 피하고 데이터 업데이트 효율성을 크게 향상시킬 수 있습니다. 그러나 문제는이 프로세스에서 업데이트 오류가 발생하면 어떤 데이터가 잘못되었는지 알기가 어렵다는 것입니다. 데이터의 자체 트랜잭션 보증이 사용되면 오류가 발생하면 모든 업데이트가 자동으로 롤백됩니다. 그리고이 방법은 종종 오류가 발생하기 쉽습니다. 따라서 일반적인 솔루션은 타협, 즉 배치로 IT의 일부를 업데이트하는 것입니다 (예 : 총 1,000 개의 데이터가 있으며 한 번에 100 개의 데이터가 업데이트됩니다). 오류 확률을 공유 할 수 있으며 오류를 찾는 것이 더 쉽습니다.
물론, 데이터의 양이 실제로 크면이 배치 업데이트는 비효율적 인 업데이트로 이어질 것입니다 (예 : 한 번에 100 개 항목이 업데이트되면 100 억 개의 데이터가 업데이트되면 천만 번 업데이트가 1 천만 배, 1 천만 번 데이터베이스가 설정되어 연결이 끊어 지면서도 불가능합니다). 현재 캐싱 메커니즘을 도입하는 것과 같은 다른 솔루션 만 고려할 수 있습니다.
요약
위는 Mybatis에서 Updatebatch를 사용하여 편집기가 소개 한 배치 업데이트 배치입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!