MyBatis 대량 삽입(insert) 데이터 작업

4754 단어 mybatis대량insert
프로그램에서 List 집합 대상을 봉인한 후에 이 집합의 실체를 데이터베이스에 삽입해야 한다. 프로젝트는 Spring+MyBatis의 설정을 사용하기 때문에 MyBatis를 대량으로 삽입하려고 한다. 이전에 대량으로 삽입한 적이 없기 때문에 인터넷에서 자료를 찾아서 최종적으로 실현하고 상세한 과정을 붙인다.
엔티티 클래스 TrainRecord 구조는 다음과 같습니다.

public class TrainRecord implements Serializable { 
private static final long serialVersionUID = -1206960462117924923L; 
private long id; 
private long activityId; 
private long empId; 
private int flag; 
private String addTime; 
//setter and getter 
} 
대응하는 마퍼.xml에는 다음과 같이 정의되어 있습니다.

<resultMap type="TrainRecord" id="trainRecordResultMap"> 
<id column="id" property="id" jdbcType="BIGINT" /> 
<result column="add_time" property="addTime" jdbcType="VARCHAR" /> 
<result column="emp_id" property="empId" jdbcType="BIGINT" /> 
<result column="activity_id" property="activityId" jdbcType="BIGINT" /> 
<result column="flag" property="status" jdbcType="VARCHAR" /> 
</resultMap> 
mapper.xml에서 대량 삽입 방법의 정의는 다음과 같습니다.

<insert id="addTrainRecordBatch" useGeneratedKeys="true" parameterType="java.util.List"> 
<selectKey resultType="long" keyProperty="id" order="AFTER"> 
SELECT 
LAST_INSERT_ID() 
</selectKey> 
insert into t_train_record (add_time,emp_id,activity_id,flag) 
values 
<foreach collection="list" item="item" index="index" separator="," > 
(#{item.addTime},#{item.empId},#{item.activityId},#{item.flag}) 
</foreach> 
</insert> 
Foreach 태그에 대한 설명은 다음과 같은 웹 자료를 참조합니다.
foreach는 주로 구축 in 조건에 사용되며, SQL 문장에서 하나의 집합을 교체할 수 있다.foreach 요소의 속성은 주로 item, index,collection,open,separator,close가 있습니다.item은 집합 중의 모든 요소가 교체될 때의 별명을 나타낸다. index는 하나의 이름을 지정한다. 교체 과정에서 매번 교체되는 위치를 나타낸다. open은 이 문장이 무엇으로 시작되는지,separator는 매번 교체될 때 어떤 기호를 구분자로 하는지,close는 무엇으로 끝날지 나타낸다. foreach를 사용할 때 가장 관건적이고 오류가 발생하기 쉬운 것은collection 속성이다.이 속성은 반드시 지정해야 하지만, 서로 다른 상황에서 이 속성의 값은 다르다. 주로 다음과 같은 세 가지 상황이 있다.
1. 매개 변수가 단일 매개 변수이고 매개 변수 형식이 List일 때,collection 속성 값은list
2. 단일 매개 변수와 매개 변수 형식이array 그룹일 때collection의 속성 값은array
3. 전송된 매개 변수가 여러 개일 때 우리는 그것들을 하나의 맵으로 봉인해야 한다. 물론 단일 매개 변수도 맵으로 봉인할 수 있다
foreach에 관한 구체적인 예는 여기에서 먼저 들지 않고 나중에 기회가 있으면 모든 상황을 하나의 예로 열거할 수 있다.
MysqlBaseDAO:

public class MySqlBaseDAO extends SqlSessionDaoSupport { 
/** 
* insert: . <br/> 
* 
* @author chenzhou 
* @param method   
* @param entity   
* @return   
* @since JDK 1.6 
*/ 
public int insert(String method,Object entity){ 
return this.getSqlSession().insert(method, entity); 
} 
//  
} 
TrainRecord 엔티티 클래스에 해당하는 TrainRecordDAO는 다음과 같이 정의됩니다.

public class TrainRecordDAO extends MySqlBaseDAO { 
/** 
* addTrainRecordBatch: . <br/> 
* 
* @author chenzhou 
* @param trainRecordList  list  
* @return   
* @since JDK 1.6 
*/ 
public int addTrainRecordBatch(List<TrainRecord> trainRecordList){ 
return this.insert("addTrainRecordBatch", trainRecordList); 
} 
//  
} 
그리고 TrainRecordDAO에 있는addTrainRecordBatch 방법을 직접 호출하면 대량으로 삽입할 수 있습니다.
특히 시도할 때 어이없는 실수를 당해 1시간도 안 걸려서 해결했다는 설명이다.내가 마퍼를 정의하고 있는 거야.xml의 삽입 방법은 기본적으로 태그는 다음과 같이 sql 문구를 포함합니다.

<![CDATA[ 
select * from t_train_record t where t.activity_id=#{activityId} 
]]> 
이렇게 하는 목적은 주로 XML 요소 중'<'와'&'가 불법이기 때문이다.해석기가 문자를 새 요소의 시작으로 해석하기 때문에 <\"\"에 오류가 발생합니다."&"도 오류가 발생할 수 있습니다. 해상도가 이 문자를 문자 실체의 시작으로 해석하기 때문입니다.반면 sql 문장이나 스크립트 문장에'<'또는'&'문자가 존재할 수 있습니다.오류를 피하기 위해 sql 문장을 CDATA로 정의할 수 있습니다.CDATA 섹션의 모든 컨텐트는 파서에서 무시됩니다.
당시에 나는addTrainRecordBatch 방법에서도 이런 용법을 사용했다.

<![CDATA[ 
insert into t_train_record (add_time,emp_id,activity_id,flag) 
values 
<foreach collection="list" item="item" index="index" separator="," > 
(#{item.addTime},#{item.empId},#{item.activityId},#{item.flag}) 
</foreach> 
]]> 
결과 프로그램이 실행될 때 항상 오류를 보고합니다:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException, 오류 정보를 보면 입력된 매개 변수가null입니다.오랫동안 고민하다가 뒤에 알고 보니 는 xml의 라벨을 묶어서 라벨을 문자열로 처리했습니다.뒤에 밖에 제거하면 정상적으로 실행됩니다.

좋은 웹페이지 즐겨찾기