반응형
http://dev.mysql.com/tech-resources/articles/autoincrement-with-connectorj.html
http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/jdbc.html
MySQL 에는 AUTO_INCREMENT(이하 AI)라는 것이 있습니다. 오라클 디비의 시퀀스와 같이 자동으로 값이 증가하게 됩니다.
AI를 적용하려는 칼럼은 기본키K(Primary Key)여야 합니다.
Before JDBC API 3.0
JDBC API 3.0 이전에서는 INSERT 이후에 "select last_insert_id()" 쿼리를 날려서 추가된 AI 값을 가져와야 합니다.
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
// auto increment value
int generatedKey = -1;
try {
conn = dataSource.getConnection();
// query
String sql = "insert into sample_user (name, age) values (?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getName());
pstmt.setInt(2, user.getAge());
// execute query
pstmt.executeUpdate();
// query
sql = "select last_insert_id()";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()) {
// auto increment value
generatedKey = rs.getInt(1);
}
return generatedKey;
} catch (Exception e) {
throw e;
} finally {
// release rs, pstmt, conn
}
After JDBC API 3.0
3.0 부터서는 "getGeneratedKeys()" 메소드를 이용하면 됩니다.
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int generatedKey = -1;
try {
conn = dataSource.getConnection();
// query
String sql = "insert into sample_user (name, age) values (?, ?)";
pstmt = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
pstmt.setString(1, user.getName());
pstmt.setInt(2, user.getAge());
// execute query
pstmt.executeUpdate();
rs = pstmt.getGeneratedKeys();
if (rs.next()) {
generatedKey = rs.getInt(1);
}
return generatedKey;
} catch (Exception e) {
throw e;
} finally {
// release rs, pstmt, conn;
}
Spring + JdbcDaoSupport
스프링과 연동하여 사용할 때에는 KeyHolder 인터페이스를 이용하면 됩니다.
@Override public int create(User user) throws Exception { // query String sql = "insert into sample_user (name, age) values (:name, :age)"; // parameter SqlParameterSource paramSource = new BeanPropertySqlParameterSource(user); // key holder KeyHolder generatedKeyHolder = new GeneratedKeyHolder(); // execute query getNamedParameterJdbcTemplate().update(sql, paramSource, generatedKeyHolder); // auto increment return generatedKeyHolder.getKey().intValue(); }※ KeyHolder 기능을 사용하려면 JDBC 드라이버가 JDBC 3.0을 지원해야 합니다.
샘플 소스입니다. (이클립스 Java Project 폴더 통째로 압축했씁니다. Buil Path 설정 해줘야 할지도...)
Spring 3.0 으로 되어있습니다. 간단한 DI만 이용...
kr/nerv/antop/config/spring.xml 파일에서 디비 설정 해줘야합니다.
테스트 클래스는 app.TestUserDao 입니다.
sample_mysql_ai.zip
반응형
'Java+ > Example' 카테고리의 다른 글
LOGBack Configurator with JMX (0) | 2014.07.20 |
---|---|
현지어로 언어명 보여주기 (0) | 2014.02.09 |
2014년 도로명 주소 사용에 따른 우편번호 준비 (2) | 2013.12.22 |
JSTL Custom Tag using Spring Beans (0) | 2013.12.01 |
Spring Message Source from Database (1) | 2013.03.03 |
Infinite Routing DataSource (1) | 2013.01.13 |
Mybatis Type Handler (1) | 2012.09.30 |