MyBatis 대량 삽입(insert) 데이터 작업
엔티티 클래스 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의 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.