2013-06-05 9 views
5

Trước khi tái cấu trúc, tôi đã chèn một hàng vào db bằng cách sử dụng jdbcTemplate, prepareStatementCreator và GeneratedKeyHolder để lưu trữ id đã tạo của hàng được chèn.Không chắc chắn cách trả về giá trị id cột được tạo bằng cách sử dụng Spring jdbcTemplate và PreparedStatementSetter

jdbcTemplate.update(SomePreparedStatementCreator, generatedKeyHolder) 

Tuy nhiên, bây giờ tôi đang cố gắng thực hiện cập nhật bằng cách sử dụng jdbcTemplate nhưng bây giờ với một readyStatementSetter. Phương pháp duy nhất tôi có thể thấy cho chúng tôi jdbcTemplate.update (String sql, PreparedStatementSetter) nhưng bây giờ tôi không chắc chắn làm thế nào để trả về id của cột được tạo ra.

PreparedStatementSetter pss = new PreparedStatementSetter() { 
     @Override 
     public void setValues(PreparedStatement preparedStatement) 
       throws SQLException { 
      preparedStatement.setString(1, pupil.getFirstname()); 
      preparedStatement.setString(2, pupil.getSurname()); 
      preparedStatement.setString(3, pupil.getGivenName()); 
      preparedStatement.setDate(4, pupil.getDob()); 
     } 
    };  


    jdbcTemplate.update("INSERT INTO STUDENTS "+ "(FIRSTNAME, SURNAME, GIVEN_NAME, DOB) VALUES (?,?,?,?)",pss); 

Giả sử cách tiếp cận của tôi để chuẩn bịBáo cáo là chính xác, có ai biết cách tôi có thể trả về giá trị của id được tạo không?

Trả lời

5

Khóa được tạo có thể được trả lại bằng phương pháp JdbcTemplate#update(PreparedStatementCreator,KeyHolder). Nhưng để đạt được điều này, bạn cần thay đổi yêu cầu của mình, dựa trên org.springframework.jdbc.core.PreparedStatementCreatorFactory.

Thay vào đó, tôi khuyên bạn nên sử dụng để chèn lớp tiện ích SimpleJdbcInsert.

Nếu lĩnh vực DB của bạn là rất tương tự như các lĩnh vực tổ chức của bạn, sau đó bạn có thể chỉ cần làm như sau:

Number key = jdbcInsert.executeAndReturnKey(new BeanPropertySqlParameterSource(entity)); 
//set generated key 
if (key != null){ 
    entity.setId(key.longValue()); 
} 

Nếu nó không phải là (như trong trường hợp của bạn), sau đó

//define parameters 
Map<String, Object> parameters = new HashMap<String, Object>(); 
parameters.put("FIRSTNAME", pupil.getFirstname()); 
parameters.put("SURNAME", pupil.getSurname()); 
parameters.put("GIVEN_NAME", pupil.getGivenName()); 
parameters.put("DOB", pupil.getDob()); 
//execute insert 
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters)); 
//set generated key 
if (key != null){ 
    pupil.setId(key.longValue()); 
} 

jdbcInsert tham số bạn cần phải xác định một lần cho từng đối tượng, và nó sẽ trông giống như sau:

SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(getJdbcTemplate()); 

jdbcInsert.withTableName(entityName); //e.g. "STUDENTS" 

jdbcInsert.setGeneratedKeyName(idColumn); //e.g. "ID" 

jdbcInsert.setColumnNames(columnNames); //e.g. Arrays.asList("FIRSTNAME", "SURNAME", "GIVEN_NAME", "DOB") 
+0

Thank rất nhiều! – PolyglotPiglet

+0

@ user1724882 xin vui lòng xem xét chấp nhận câu trả lời này nếu nó là những gì bạn cần. – n1ckolas