日期:2014-05-16  浏览次数:20523 次

spring jdbctemple 获得自动生成的主键ID
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

public class TestRetrieveAutoGeneratedKeys {

	private static final String DRIVER_CLASSNAME = "oracle.jdbc.driver.OracleDriver";
	private static final String IP = "192.168.123.72";
	private static final int PORT = 1521;
	private static final String SID = "wmdw";
	private static final String USERNAME = "dss";
	private static final String PASSWORD = "dss";
	private static final String INSERT_SQL = "insert into testid(id,name) values(test_SEQ.Nextval,?)";

	/**
	 * <pre>
	 * @param args
	 * </pre>
	 */
	public static void main(String[] args) {
		int count = 10000;
		TestRetrieveAutoGeneratedKeys test = new TestRetrieveAutoGeneratedKeys();
		DataSource dataSource = createOracleDataSource(IP, PORT, SID, USERNAME,
				PASSWORD);
		JdbcTemplate jdbcTemplate = createJdbcTemplate(dataSource);
		for (int i = 0; i < count; i++) {
			Map<String, Object> map = test.getPKs(jdbcTemplate);
			System.out.println("id:"
					+ Integer.valueOf(map.get("id").toString()).intValue());

		}
	}

	/**
	 * <pre>
	 * 得到数据库自动生成的PK的id
	 * 这里使用 oracle 数据库做的例子,其他的数据库同样适用,例如:MySQL,MS SQLServer
	 * DB: Oracle database
	 * -- Create table
	 * create table testid(
	 *        id number(11),
	 *        name  varchar2(100),
	 *        primary key(id)
	 * )
	 * 
	 * -- Create sequence 
	 * create sequence test_SEQ
	 * minvalue 1
	 * maxvalue 9999999999999999999999999999
	 * start with 1
	 * increment by 1
	 * nocache;
	 *  @return
	 * </pre>
	 */
	private Map<String, Object> getPKs(JdbcTemplate jdbcTemplate) {

		KeyHolder keyHolder = createKeyHolder();
		jdbcTemplate.update(new PreparedStatementCreator() {
			public PreparedStatement createPreparedStatement(
					Connection connection) throws SQLException {
				PreparedStatement ps = connection.prepareStatement(INSERT_SQL,
						new int[] { 1 });
				ps.setString(1, "name-1");
				return ps;
			}
		}, keyHolder);
		return keyHolder.getKeys();
	}

	private static DataSource createOracleDataSource(String ip, int port,
			String sid, String username, String password) {
		String url = "jdbc:oracle:thin:@" + ip + ":" + port + ":" + sid;
		BasicDataSource dataSource = createBasicDataSource();
		dataSource.setDriverClassName(DRIVER_CLASSNAME);
		dataSource.setUrl(url);
		dataSource.setUsername(username);
		dataSource.setPassword(password);
		return dataSource;
	}

	private static BasicDataSource createBasicDataSource() {
		return new BasicDataSource();
	}

	private static KeyHolder createKeyHolder() {
		return new GeneratedKeyHolder();
	}

	private static JdbcTemplate createJdbcTemplate(DataSource dataSource) {
		return new JdbcTemplate(dataSource);
	}

}

?