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

为JdbcTemplate扩展获得插入数据的主键功能[转]

package com.lianai88.common.access;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ParameterDisposer;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

/**
 * 数据存取适配器
 * @author David Day
 */
public class JdbcTemplateAdapter extends JdbcTemplate {
	
	public JdbcTemplateAdapter() {
		super();
	}
	
	public JdbcTemplateAdapter(DataSource ds) {
		super(ds);
	}
	
	/**
	 * 增加并且获取主键
	 * @param sql sql语句
	 * @param params 参数列表
	 * @return 主键
	 */
	public Object insertAndGetKey(final String sql, final Object... params) {
		logger.debug("Executing SQL update and returning generated keys");
		
		final KeyHolder key = new GeneratedKeyHolder();

		update(new PreparedStatementCreator() {

			public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
				PreparedStatement ps = con.prepareStatement(sql, 
						PreparedStatement.RETURN_GENERATED_KEYS);
				PreparedStatementSetter pss = new ArgPreparedStatementSetter(params);
				try {
					if (pss != null) {
						pss.setValues(ps);
					}
				} finally {
					if (pss instanceof ParameterDisposer) {
						((ParameterDisposer) pss).cleanupParameters();
					}
				}
				return ps;
			}
			
		}, key);
		
		return key.getKey();
	}

}