2009-11-03 36 views

Trả lời

65

Phương thức JDBCTemplate.update bị quá tải để lấy đối tượng được gọi là GeneratedKeyHolder mà bạn có thể sử dụng để truy xuất khóa được tạo tự động. Ví dụ (mã lấy từ here):

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 
+0

Đó sẽ là "một lớp lót" mà tôi đang tìm kiếm ở đây. Tốt đẹp. Điều đáng buồn là tôi đã nhìn thấy liên kết nhưng đã vượt qua nó do điều này: "một phần của tiêu chuẩn JDBC 3.0". (Tôi không nghĩ rằng chúng tôi sử dụng JDBC 3.0, nhưng tôi cũng không nghĩ rằng điều này là có liên quan). – javamonkey79

+1

Nó nhận được một lớp lót thực sự trong Java 8 với lambdas \ m/ – fabwu

3

Tôi không biết nếu có một "one-liner" nhưng điều này dường như làm các trick (đối với MSSQL ít nhất):

// -- call this after the insert query... 
this._jdbcTemplate.queryForInt("select @@identity"); 

Decent bài viết here.

+0

Trang không tìm thấy với các liên kết. – Ruslan

43

Làm thế nào về SimpleJdbcInsert.executeAndReturnKey?

+2

Wow, tôi đã không thực sự biết về lớp đó - kinda gọn gàng. Cảm ơn. +1 – javamonkey79

+0

Tôi thích phiên bản này hơn phiên bản với PreparedStatementCreator. – ruslanys

16

Thêm ghi chú chi tiết/mẫu mã để todd.pierzina trả lời

jdbcInsert = new SimpleJdbcInsert(jdbcTemplate); 
     jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
       "Primary_key"); 
     Map<String, Object> parameters = new HashMap<String, Object>(); 
     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(); 
+0

Tôi đang đối mặt với ngoại lệ này: org.springframework.dao.InvalidDataAccessResourceUsageException: Tính năng getGeneratedKeys không được hỗ trợ bởi cơ sở dữ liệu này –

+0

@ Az.MaYo - Vấn đề của bạn có thể liên quan đến phiên bản trình điều khiển JDBC. –

Các vấn đề liên quan