[英]How can I get the autoincremented id when I insert a record in a table via jdbctemplate
private void insertIntoMyTable (Myclass m) {
String query = "INSERT INTO MYTABLE (NAME) VALUES (?)";
jdbcTemplate.update(query, m.getName());
}
當上述查詢插入一條記錄時,表中的ID
列自動遞增。
有沒有辦法在插入時取回這個自動遞增的 ID。 所以在這個例子中,我的方法的返回值是int
檢查此參考。 您可以將 jdbcTemplate.update 用作:
編輯按要求添加了導入
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
以下是代碼用法:
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
我在插入后得到數據庫(MSSQL)生成的id,如下所示,導入:
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.SqlReturnResultSet;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
和代碼片段:
final String INSERT_SQL = "INSERT INTO [table]\n"
+ " ([column_1]\n"
+ " ,[column_2])\n"
+ " VALUES\n" +
" (?, ?)";
Connection connection = jdbcTemplate.getDataSource().getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(INSERT_INVOICE_SQL, Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, "test 1");
preparedStatement.setString(2, "test 2");
preparedStatement.executeUpdate();
ResultSet keys = preparedStatement.getGeneratedKeys();
if (keys.next()) {
Integer generatedId = keys.getInt(1); //id returned after insert execution
}
JdbcTemplate 是 Spring 的核心。 另一種選擇是使用SimpleJdbcInsert 。
SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
simpleJdbcInsert
.withTableName("TABLENAME")
.usingGeneratedKeyColumns("ID");
SqlParameterSource params = new MapSqlParameterSource()
.addValue("COL1", model.getCol1())
.addValue("COL2", model.getCol2());
Number number = simpleJdbcInsert.executeAndReturnKey(params);
你仍然可以@Autowire jdbcTemplate。 對我來說,這比使用 jdbcTemplate.update() 方法和 KeyHolder 獲取實際 id 更方便。
示例代碼片段使用Apache Derby進行了測試,應該可以與常用數據庫一起使用。
使用Spring JPA是另一種選擇 - 如果 ORM 適合您。
@Component
public class PersonDao {
private final JdbcTemplate jdbcTemplate;
@Autowired
public PersonDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<Person> index() {
return jdbcTemplate.query("SELECT * FROM person", new BeanPropertyRowMapper<>(Person.class));
}
public Person show(int id){
return jdbcTemplate.query("SELECT * FROM person WHERE id=?", new Object[]{id}, new BeanPropertyRowMapper<>(Person.class))
.stream().findAny().orElse(null);
}
public void save(Person person){
jdbcTemplate.update("INSERT INTO person (name, age, email) VALUES (?, ?, ?)", person.getName(), person.getAge(), person.getEmail());
}
public void edit(Integer id, Person person) {
jdbcTemplate.update("UPDATE person SET name = ?, age = ?, email = ? WHERE id = ?", person.getName(), person.getAge(), person.getEmail(), id);
}
public void delete(Integer id) {
jdbcTemplate.update("DELETE FROM person WHERE id = ?", id);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.