최근에 배치 가져 오기 요구 사항을 만들고 배치는 여러 레코드를 데이터베이스에 삽입했습니다.
솔루션 : 프로그램에서 목록 수집 객체를 캡슐화 한 다음 컬렉션의 엔티티를 데이터베이스에 삽입하십시오. 이 프로젝트는 mybatis를 사용하기 때문에 배치 삽입에 Mybatis 'foreach 함수를 사용할 계획입니다. 이 기간 동안 나는 "SQL 명령이 올바르게 끝나지 않았다"는 오류를 발견하고 마침내 그것을 해결하고 향후 검토 및 학습을 위해 그것을 기록했습니다.
먼저, MyBatis의 Foreach Insert Online에 대한 정보를 다음과 같이 참조했습니다.
Foreach는 주로 조건을 구축하는 데 사용되며 SQL 문의 컬렉션을 반복 할 수 있습니다.
Foreach 요소의 속성에는 주로 항목, 인덱스, 수집, 개방형, 분리기 및 닫기가 포함됩니다.
항목은 컬렉션의 각 요소가 반복 될 때 별칭을 나타냅니다. 색인은 반복 프로세스 중에 각 반복에 도달하는 위치를 나타내는 이름을 지정합니다. Open은 문으로 시작하는 것을 나타내고, 분리기는 각 반복 사이의 분리기로 사용되는 기호를 나타내며, 닫기는 끝을 나타냅니다. Foreach를 사용할 때 가장 중요하고 오류가 발생하기 쉬운 것은 수집 속성입니다. 이 속성은 지정되어야하지만 다른 경우 속성의 값이 다릅니다. 세 가지 주요 상황이 있습니다.
1. 단일 매개 변수로 전달되고 매개 변수 유형이 목록 인 경우 수집 속성 값이 목록입니다.
2. 단일 매개 변수로 전달되고 매개 변수 유형이 배열 인 경우 컬렉션의 속성 값은 배열입니다.
3. 여러 매개 변수가 전달되면 맵을지도로 캡슐화해야합니다. 물론 단일 매개 변수를 맵으로 캡슐화 할 수도 있습니다.
그런 다음 다음 XML 파일이 사본에 따라 작성되었습니다.
xxxmapper.xml 파일 :
<insert id = "addsupcity"parametertype = "java.util.list"> <selectkey keyproperty = "cityId"order = "everence"resultType = "String"> <! Area_desc, sup_id, stat) 값 <foreach collection = "list"item = "item"index = "index"separator = ","> (#{item.cityid, jdbctype = varchar},#{item.citycode, jdbctype = varchar},#{item.cityname, jdbctype = varchar},#{item .Areadesc, jdbctype = varchar},#{item.supid, jdbctype = varchar},#{item.stat, jdbctype = varchar}) </foreach> </insert>그러나 실행 후보고 오류가 계속되고 오류 메시지는 다음과 같습니다.
### sql : t_ocl_supcity (city_id, city_code, city_name, city_name, area_desc, sup_id, stat) 값 (?,?,?,?,?), (?), (?, ?, ?, ?,?
PL/SQL에서 SQL을 복사하고 실행하면 동일한 오류도보고됩니다. 위에서 볼 수 있듯이 배치 인서트를 사용하여 실행 된 SQL 문은 다음과 같습니다. t_ocl_supcity (city_id, city_code, city_name, area_desc, sup_id, stat) 값 (?,? 비교할 수없는. 이 기사를 되돌아 보면 Oracle이 아닌 MySQL에 적합하다는 것을 알았으므로 XML 파일을 수정했습니다.
<insert id = "addsupcity"parametertype = "java.util.list"> t_ocl_supcity (city_id, city_code, city_name, area_desc, sup_id, stat) 삽입에 삽입 모든 "> select#{item.citycode, jdbctype = varchar} city_code,#{item.cityname, jdbctype = varchar} city_name,#{item.areadesc, jdbctype = varchar} area_desc,#{item.supid, jdbctype} sup_id,#{item.stat, jdbctype = varchar} statfrom dual </foreach>) a </insert>통과합니다.
Oracle의 버전에는 몇 가지 주목할 사항이 있습니다.
1. SQL에는 값이 없습니다.
2. (셀렉 ... 듀얼에서);
3. <foreach> 태그의 분리기의 속성은 "Union all"이며 쿼리는 결과 세트에 병합됩니다.
위의 것은 Oracle+Mybatis foreach 삽입 기능의 배치 삽입 오류에 대한 빠른 솔루션입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!