up이라는 테이블이 존재하고 그에 맞는 간단한 모델 객체가 있다.

up이라는 테이블은 간단하게 id와 date가 존재하고, date 타입으로 update_at 이라는 필드가 있다고 가정하자.


public class Up {

public long id;

public long updateAt;

}



RowMapper를 정의한다. 유의할 점은 mysql date 타입을 java 객체에서 표현할 방법이 중요하다. Types.TIMESTAMP인지 메타데이터를 확인한다. Object로 먼저 읽은 후, TimeStamp 객체로 변경한 다음 getTime()을 호출하여 long 값으로 얻어내야 한다.

(String이나 그냥 Long 타입으로 받아들인후 Date 타입으로 쉽게 변환되지 않는다)

public class UpRowMapper implements RowMapper {

public Object mapRow(ResultSet rs, int rowNum) throws SQLException {

Up up = new Up();

up.id = rs.getLong("id");

ResultSetMetaData metadata = rs.getMetaData();

if (metadata.getColumnType(2) == Types.TIMESTAMP) {

Object updateAt = rs.getObject(2);


up. updateAt = ((Timestamp) updateAt).getTime();

}

return up;

}

}



실제 쿼리는 다음과 같이 사용한다.

List<Up> upList = jdbcTemplate.query("select id, updated_at from up", new UpRowMapper(), id);


jdbcTemplate에 배치성 데이터를 생성한다.  이 때 setTimestamp() 메소드를 사용한다.

jdbcTemplate.batchUpdate("INSERT IGNORE INTO up (id, updated_at) values (?, ?)  ", new BatchPreparedStatementSetter(){

@Override

public void setValues(PreparedStatement ps, int i) throws SQLException {

Up up = upList.get(i);

ps.setLong(1, up.id);

ps.setTimestamp(4, new Timestamp(up. updateAt));

}


@Override

public int getBatchSize() {

return upList.size();

}

});

Posted by '김용환'
,