接手一個舊系統改造的過程,要插入后立即返回自增值,不能重構guid類型主鍵,Spring提供了很優美的機制。
Spring利用GeneratedKeyHolder,提供了一個可以返回新增記錄對應主鍵值的方法 :KeyHolder接口指代了一個通用的實現類GeneratedKeyHolder,該類返回新增記錄時的自增長主鍵值
代碼:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Date; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import javax.sql.DataSource; public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("TemporaryVenue-test.xml"); DataSource dataSource = (DataSource)context.getBean("dataSource"); JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String insert_sql = "insert into SYS_USERTV(username,password) values(?,?)"; //調用,獲取插入后的自增值,其中"id"是自增字段名稱 System.out.println("方法調用獲取當前自增int主鍵值" + insert(insert_sql,jdbcTemplate,"id")); } /** * 插入后返回自增主鍵值 * @param jdbcTemplate * @return */ private static Number insert(final String sql, JdbcTemplate jdbcTemplate, final String keyName) { KeyHolder keyHolder = new GeneratedKeyHolder(); int lines=jdbcTemplate.update(new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { PreparedStatement ps = PreStatement(sql, connection,keyName); return ps; } }, keyHolder); return keyHolder.getKey(); } /** * 裝載參數 * @param sql * @param connection * @param keyName:自增字段名稱 * @return * @throws SQLException */ private static PreparedStatement PreStatement(final String sql, Connection connection,String keyName) throws SQLException { PreparedStatement ps = connection.prepareStatement(sql, new String[] { keyName }); ps.setString(1, new Date().toString()); ps.setString(2, "aa"); return ps; } }