JDBCTEMPLATE를 통해 SQL 삽입의 ID
-
13-09-2019 - |
문제
스프링 JDBC 템플릿 호출에서 SQL 삽입물에서 @@ Identity를 얻을 수 있습니까? 그렇다면 어떻게?
해결책
그만큼 JDBCTemplate.update
메소드는자가 생성 키를 검색하는 데 사용할 수있는 GeneratedKeyholder라는 객체를 가져 오도록 과부하되어 있습니다. 예를 들어 (코드에서 가져온 코드 여기):
final String INSERT_SQL = "insert into my_test (name) values(?)";
final String name = "Rob";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps =
connection.prepareStatement(INSERT_SQL, new String[] {"id"});
ps.setString(1, name);
return ps;
}
},
keyHolder);
// keyHolder.getKey() now contains the generated key
다른 팁
어때 SimpleJdbcInsert.executeAndReturnKey
? 입력에 따라 두 가지 형태가 필요합니다.
(1) 입력은 a Map
public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)
설명 인터페이스에서 복사 :
SimpleJdbcInsertOperations
전달 된 값을 사용하여 삽입물을 실행하고 생성 된 키를 반환하십시오. 이를 위해서는 자동 생성 키가있는 열의 이름을 지정해야합니다. 이 방법은 항상 a를 반환합니다
KeyHolder
그러나 발신자는 실제로 생성 된 키가 포함되어 있는지 확인해야합니다.지정 :
executeAndReturnKey
인터페이스에서SimpleJdbcInsertOperations
매개 변수 :
args - Map containing column names and corresponding value
보고:
the generated key value
(2) 입력은 a SqlParameterSource
public java.lang.Number executeAndReturnKey(
SqlParameterSource
parameterSource)
설명 인터페이스에서 복사 :
SimpleJdbcInsertOperations
전달 된 값을 사용하여 삽입물을 실행하고 생성 된 키를 반환하십시오. 이를 위해서는 자동 생성 키가있는 열의 이름을 지정해야합니다. 이 방법은 항상 a를 반환합니다
KeyHolder
그러나 발신자는 실제로 생성 된 키가 포함되어 있는지 확인해야합니다.지정 :
executeAndReturnKey
인터페이스에서SimpleJdbcInsertOperations
매개 변수 :
parameterSource - SqlParameterSource containing values to use for insert
보고:
생성 된 키 값.
Todd.pierzina 답변에 자세한 메모/샘플 코드 추가
jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
"Primary_key");
Map<String, Object> parameters = new HashMap<>();
parameters.put("Column_NAME1", bean.getval1());
parameters.put("Column_NAME2", bean.getval2());
// execute insert
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(
parameters));
// convert Number to Int using ((Number) key).intValue()
return ((Number) key).intValue();
"원 라이너"가 있는지 모르겠지만 이것은 트릭을 수행하는 것 같습니다 (적어도 MSSQL에 대한).
// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );
괜찮은 기사 여기.