hacking/java2009/01/18 01:17
크리에이티브 커먼즈 라이선스
Creative Commons License
JDBC 코딩할 때 골치아픈 것 중의 하나가 generate key(오라클의 sequence, MS SQL의 identity, MySQL의 auto_increment 등)을 다루는 것이다.

아 글쎄~ 요즘세상에 JDBC를 날로 쓰는 경우가 어딨냐고-.-;

대부분의 ORM(JPA, Hibernate, iBATIS 등)에서는 여기에 대한 별도의 처리방법이 존재하지만,
ORM까지 동원하기엔 좀 그렇고-.-, 그렇다고 JDBC를 날로 쓰기도 좀 그렇고...
이럴 땐, commons-dbutilsspring-jdbc를 사용하게 된다.

commons-dbutils를 사용하는 경우는 사실상 JDBC를 날로 쓸 때와 큰 차이가 없으니 넘어가고...

spring-jdbc을 사용하는 경우, 그 중에서도 스프링 2.5부터 추가된 SimpleJdbcInsert의 경우를 알아보면:
SimpleJdbcInsert insert = new SimpleJdbcInsert(dataSource).withTableName("contacts").usingGeneratedKeyColumns("id");
SqlParameterSource paramSource = new BeanPropertySqlParameterSource(contact);
long generatedKey = insert.executeAndReturnKey(paramSource).longValue();
contact.setId(generatedKey);

"와~~ 깔끔하게 끝나네~"라고 기뻐하려는 찰라... 이게 derby에서(만!) 안된다. ㅠ.ㅠ

좀 뒤져봤더니 버그만 올라와 있고 해결책은 안 나와 있다. 그래서... 이렇게 구질구질한 코드를 만들었다:
KeyHolder keyHolder = new GeneratedKeyHolder();
JdbcTemplate template = new JdbcTemplate(dataSource);
template.update(new PreparedStatementCreator() {
  public PreparedStatement createPreparedStatement(Connection connection)
      throws SQLException {
    PreparedStatement pstmt = connection.prepareStatement("INSERT INTO contacts(name,email,address) VALUES(?,?,?)", Statement.RETURN_GENERATED_KEYS);
    pstmt.setString(1, contact.getName());
    pstmt.setString(2, contact.getEmail());
    pstmt.setString(3, contact.getAddress());
    return pstmt;
  }
}, keyHolder);
Long generatedKey = new Long(keyHolder.getKey().longValue());
book.setId(generatedKey); 

혹시, 더 깔끔한 방법을 알고 있는 분 계시면 공유 좀 해주셈~~

Posted by iolo
hacking/web2008/11/16 14:56
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Offline Ajax with Apache Derby
번역: 아파치 더비를 이용한 오프라인 Ajax

자바로 만든 작고 가벼운, 그래서 너무나도 유용한  RDB인 아파치 더비
"headless 애플릿"으로 실행하여, Ajax를 위한 오프라인 저장소로 사용하는 방법을 설명한다.

그런데... 애플릿 스타트업 타임을 고려하면... 이게 과연 쓸모가 있을지는 의문... 그냥 구글 Gears를 쓰는 편이... -.-;;;

아무튼 그런걸 떠나서 더비를 이렇게 활용하겠다는 아이디어 자체는 대단히 훌륭~
LiveConnect(애플릿과 자바스크립트를 연결하는 기술)를 다시 돌아보는 것도 재미있지만, 이거 조만간 사라질거라는...



Posted by iolo