목록 수집 객체는 프로그램에 캡슐화 된 다음 컬렉션의 엔티티를 데이터베이스에 삽입해야합니다. 프로젝트는 Spring+Mybatis 구성을 사용하므로 Mybatis 배치 삽입을 사용할 계획입니다. 이전에 배치 삽입이 없었기 때문에 인터넷에서 일부 정보를 검색 한 후에는이를 구현하고 자세한 프로세스를 게시했습니다.
엔티티 클래스 TRAINRECORD 구조는 다음과 같습니다.
공개 클래스 TRAINRECORD는 시리얼이즈 가능 {Private STATIC FINST LONG SERIALVERSIONUID = -1206960462117924923L; 개인 긴 ID; 사적인 긴 활동; 사적인 긴 엠파이드; 개인 int 플래그; 개인 문자열 추가 시간; // Setter and Getter} 해당 Mapper.xml은 다음과 같이 정의됩니다.
<resultmap type = "trainrecord"id = "trainrecordresultMap"> <id column = "id"property = "id"property = "id"jdbctype = "bigint" /> <result column = "add_time"property = "addtime"jdbctype = "varchar" /> <result column = "empl_id"propert "jdbctype ="big genate " />. 열 = "activity_id"property = "activityId"jdbctype = "bigint" /> <result column = "activity_id"property = "activityId"jdbctype = "bigint" /> <result column = "flag"propertion = "status"jdbctype = "varchar" /> < /resultmap>
Mapper.xml의 배치 삽입 방법의 정의는 다음과 같습니다.
<insert id = "addTrainRecordBatch"useGeneratedKeys = "true"parametertype = "java.util.list"> <selectkey resulttype = "long"keyproperty = "id"order = "at at at at hone _insert_id () </selectkey> t_train _record (add_time, activity, extive, emporeach, emporeach). item = "item"index = "index"separator = ","> (#{item.addtime},#{item.AmpId},#{item.ActivityId},#{item.flag}) </foreach> </insert>Foreach 태그에 대한 설명은 다음과 같이 온라인 정보를 참조합니다.
Foreach는 주로 조건을 구축하는 데 사용되며 SQL 문의 컬렉션을 반복 할 수 있습니다. Foreach 요소의 속성에는 주로 항목, 인덱스, 수집, 개방형, 분리기 및 닫기가 포함됩니다. 항목은 컬렉션의 각 요소가 반복 될 때 별칭을 나타냅니다. 색인은 반복 프로세스 중에 각 반복에 도달하는 위치를 나타내는 이름을 지정합니다. Open은 문으로 시작하는 것을 나타내고, 분리기는 각 반복 사이의 분리기로 사용되는 기호를 나타내며, 닫기는 끝을 나타냅니다. Foreach를 사용할 때 가장 중요하고 오류가 발생하기 쉬운 것은 수집 속성입니다. 이 속성은 지정되어야하지만 다른 경우 속성의 값이 다릅니다. 세 가지 주요 상황이 있습니다.
1. 단일 매개 변수로 전달되고 매개 변수 유형이 목록 인 경우 수집 속성 값이 목록입니다.
2. 단일 매개 변수로 전달되고 매개 변수 유형이 배열 인 경우 컬렉션의 속성 값은 배열입니다.
3. 여러 매개 변수가 전달되면 맵을지도로 캡슐화해야합니다. 물론 단일 매개 변수를 맵으로 캡슐화 할 수도 있습니다.
Foreach에 대한 구체적인 예를 나열하지는 않습니다. 앞으로 기회가 있다면 각 상황의 예를 제시 할 수 있습니다.
mysqlbasedao :
공개 클래스 mysqlbasedao는 sqlsessiondaosupport { /*** 삽입 : 삽입 작업을 확장합니다. <br/> * * @author chenzhou * @param 메소드 삽입 작업의 이름 * @param 엔티티 쿼리 매개 변수 또는 엔티티 클래스 * @return 영향을받는 행 수 * @since jdk 1.6 */ public insert (문자열 메소드, 개체 엔티티) {return this.getsqlsession (). } // 다른 방법이 생략 됨} Trainrecord Entity 클래스에 해당하는 Trainrecorddao는 다음과 같이 정의됩니다.
Public Class Trainrecorddao는 MySQLBASEDAO { /*** ADDTRAINRECORDBATCH : 배치 삽입 교육 레코드를 확장합니다. <br/> * * @author Chenzhou * @param trainrecordlist training record list collection * @return 행에 영향을받는 행 수 * @since jdk 1.6 */ public int addtrainrecordbatch (list <trainrecord> trainrecordlist) {return this.insert ( "addtrainrecordbatch", trainrecordlist); } // 나머지 방법을 생략} 그런 다음 TrainreCorddao에서 addTrainRecordbatch 메서드를 직접 호출하면 배치로 삽입 할 수 있습니다.
내가 시도했을 때 말이없는 실수를 겪었다는 것이 특히 주목되며, 그것을 해결하는 데 거의 한 시간이 걸렸습니다. mapper.xml에서 삽입 메소드를 정의 할 때 일반적으로 <! [cdata []]> 태그를 사용하여 아래와 같이 기본적으로 SQL 문을 동봉합니다.
<! [cdata [선택 *에서 t_train_record t에서 t.activity_id =#{activityId}]> 이것은 주로 XML 요소에서 "<"및 "&"가 불법이기 때문입니다. "<"는 파서가 캐릭터를 새로운 요소의 시작으로 해석하기 때문에 오류가 발생합니다. "&"는 또한 파서가 캐릭터를 캐릭터 엔티티의 시작으로 해석하기 때문에 오류가 발생합니다. "<"또는 "&"문자는 SQL 문 또는 스크립트 문에 존재할 수 있습니다. 오류를 피하기 위해 SQL 문을 CDATA로 정의 할 수 있습니다. CDATA 섹션의 모든 것은 파서에 의해 무시됩니다.
그 당시 AddTrainRecordbatch 메소드 에서이 사용법을 사용했습니다.
<! [cdata [t_train_record에 삽입, add_time, emp_id, activity_id, flag) 값 <foreach collection = "list"item = "item"index "index ="index "separator =", "> (#{item.addtime},#{item.empid},#{item.activitiveId},#{{ait.flag})) </foreach>.결과적 으로이 프로그램은 com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception을 실행할 때 항상 오류를보고합니다. 오류 메시지를 볼 때 전달 된 매개 변수는 NULL입니다. 오랜 시간이 지남에 따라 <! [cdata []]>이 XML에 <foreach> 태그를 포함시키고 태그를 문자열로 직접 처리했다는 것을 깨달았습니다. 외부 <! [cdata []]>을 제거한 후에는 정상적으로 실행할 수 있습니다.