2017-02-22 1 views
1

와 MySQL의에 삽입 문에서 CURRENT_TIMESTAMP에 기본값 필드의 값을 얻을하는 방법은 아래의 MySQL의 테이블이 : 나는 아래로 MyBatis로 매퍼가는 MyBatis로

CREATE TABLE `mytable` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `phone` VARCHAR(128) NULL DEFAULT NULL, 
    `createTime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB 
AUTO_INCREMENT=25 
; 

@Mapper 
public interface MyMapper { 
    Integer insertRecord(List<PhoneModel> list); 
} 


<insert id="insertRecord" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 
    insert into mytable(phone) values 
    <foreach item="item" index="index" collection="list" separator=","> 
     (#{item.phone}) 
    </foreach> 
</insert> 

PhoneModel에는 id, phone, createTime의 세 가지 속성이 있습니다. 이제 insertRecord을 호출 한 후 id을 얻을 수 있지만 createTime도 받고 싶습니다.

나는 Mybatis에서 documents을 읽었습니다. 여러 개의 속성 이름 (예 : createTime)을 keyPropertykeyColumn에 추가 할 수 있습니다.

keyProperty (삽입 및 업데이트 전용) getGeneratedKeys 또는 insert 문의 childKey 요소에서 반환 한 키 값을 MyBatis가 설정할 등록 정보를 식별합니다. 기본값 : 설정 해제. 생성 된 열이 여러 개있을 것으로 예상되는 경우 쉼표로 구분 된 속성 이름 목록을 사용할 수 있습니다.

keyColumn (삽입 및 업데이트 만 해당) 생성 된 키를 사용하여 테이블의 열 이름을 설정합니다. 키 열이 테이블의 첫 번째 열이 아닌 경우 특정 데이터베이스 (예 : PostgreSQL)에서만 필요합니다. 생성 된 열이 여러 개일 경우 쉼표로 구분 된 열 목록의 이름은입니다.

나는 쉼표 부동산/열 이름 수단의 구분 된 목록 대해 명확하지 않다. keyProperty = "id, createTime"시도했지만 작동하지 않는 것.

감사합니다.

답변

1

keyProperty="id, createTime"이 코드의 복사본이면 쉼표 다음의 공백을 지우십시오. 어쨌든 (유일한) 범인이 아닐 수도 있습니다.

auto_increment는 내부적으로 시퀀스처럼 작동합니다. 반면에 CURRENT_TIMESTAMP는 함수입니다. 그런 다음 여러 keyProperty 지원 동작을 검사 할 수 있습니다. 테스트 목적을 위해 생성 된 키를 얻을 수 있는지 확인하도록 다른 열 (auto_increment, serial?)을 추가 할 수 있습니까?

삽입에서 PostgreSQL allows RETURNING 값을 얻었지만 MySQL에서 이에 상응하는 값을 찾지 못했습니다.

CURRENT_TIMESTAMP가 작동하는 방식으로 하나의 다중 행 삽입 문을 실행합니까? 모든 레코드에 똑같은 타임 스탬프가 삽입됩니까? 또는 가치가 진화 하는가? 이것은 1 초 이상 걸리는 많은 수의 레코드를 삽입 할 때 관찰 될 수 있습니다.

왜 타임 스탬프를 직접 삽입하지 않으시겠습니까? 다중 행 삽입 대신 대량 삽입을 수행하고 Java에서 목록을 반복하며 세션은 ExecutorTYPE.REUSE을 사용하여 명령문을 한 번만 준비해야합니다.

for(PhoneModel model : list) { 
    model.setCreateTime(new Date()); 
    mapper.insertRecord(model); 
}