java JdbcTemplate源码
package com.wl.filter;
package org.javaresearch.jerch;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
/**
* JDBC的模板定义,包含所有支持的方法。
* 这个类是这个类库的核心,所有的实际功能差不多都是这个定义并完成的。
* 最后更新日期:2005年5月7日
* @author cherami
*/
public class JDBCTemplate {
/**
* 数据源。
*/
private DataSource datasource;
/**
* 构造一个空的JDBCTemplate。
*/
protected JDBCTemplate() {
}
/**
* 以指定的数据源构造一个JDBCTemplate。
* @param datasource 数据源
*/
protected JDBCTemplate(DataSource datasource) {
this.datasource = datasource;
}
/**
* 设置当前JDBCTemplate的数据源。
* @param datasource 数据源
*/
protected void setDataSource(DataSource datasource) {
this.datasource = datasource;
}
/**
* 得到当前JDBCTemplate的数据源。
* @return 当前JDBCTemplate的数据源
*/
protected DataSource getDataSource() {
return datasource;
}
/**
* 使用psc创建PreparedStatement并使用pss设置相关的参数最后调用action执行。
* @param psc PreparedStatement的创建器
* @param pss PreparedStatement的参数设置器
* @param action PreparedStatement执行的回掉实现
* @return 执行后的结果
*/
public Object execute(PreparedStatementCreator psc,
PreparedStatementSetter pss, PreparedStatementCallback action) {
Connection con = Utils.getConnection(datasource);
PreparedStatement ps = null;
try {
ps = psc.createPreparedStatement(con);
pss.setValues(ps);
Object result = action.doInPreparedStatement(ps);
return result;
}
catch (SQLException ex) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", ex);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR",ex);
} finally {
Utils.closeStatement(ps);
Utils.closeConnection(con);
}
}
/**
* 执行指定的sql并返回更新的记录数。
* @param sql SQL语句
* @return 更新的记录数
*/
public int update(String sql) {
return update(sql, nullPSS);
}
/**
* 执行指定的sql并返回更新的记录数。
* @param sql SQL语句
* @param args 参数中的值
* @return 更新的记录数
*/
public int update(String sql, Object[] args) {
return update(sql, new ArgPreparedStatementSetter(args));
}
/**
* 执行指定的sql并返回更新的记录数。
* @param sql SQL语句
* @param args 参数中的值
* @param types 参数类型
* @return 更新的记录数
*/
public int update(String sql, Object[] args, int[] types) {
return update(sql, new ArgTypePreparedStatementSetter(args, types));
}
/**
* 执行指定的sql并返回更新的记录数。
* @param sql SQL语句
* @param pss PreparedStatement的参数设置器
* @return 更新的记录数
*/
public int update(String sql, PreparedStatementSetter pss) {
Integer result = (Integer) execute(new SimplePreparedStatementCreator(sql),
pss, new PreparedStatementCallback() {
public Object doInPreparedStatement(PreparedStatement stmt)
throws SQLException {
return new Integer(stmt.executeUpdate());
}
});
return result.intValue();
}
/**
* 批量执行更新并返回每次的更新记录数
* @param sql SQL语句
* @param args 每次执行时的参数值
* @return 每次执行更新的记录数数组
*/
public int[] batchUpdate(String sql, Object[][] args) {
return batchUpdate(sql, new ArgBatchPreparedStatementSetter(args));
}
/**
* 批量执行更新并返回每次的更新记录数
* @param sql SQL语句
* @param args 每次执行时的参数值
* @param types 参数类型
* @return 每次执行更新的记录数数组
*/
public int[] batchUpdate(String sql, Object[][] args, int[] types) {
return batchUpdate(sql,
new ArgTypeBatchPreparedStatementSetter(args, types));
}
/**
* 批量执行更新并返回每次的更新记录数
* @param sql SQL语句
* @param bpss PreparedStatement的批量参数设置器
* @return 每次执行更新的记录数数组
*/
public int[] batchUpdate(String sql, BatchPreparedStatementSetter bpss) {
return batchUpdate(sql, new BatchPreparedStatementSetterConverter(bpss));
}
/**
* 批量执行更新并返回每次的更新记录数
* @param sql SQL语句
* @param pss PreparedStatement的参数设置器
* @return 每次执行更新的记录数数组
*/
public int[] batchUpdate(String sql, PreparedStatementSetter pss) {
return (int[]) execute(new SimplePreparedStatementCreator(sql), pss,
new PreparedStatementCallback() {
public Object doInPreparedStatement(PreparedStatement stmt)
throws SQLException {
return stmt.executeBatch();
}
});
}
/**
* 查询一个整型结果。
* @param sql SQL语句
* @return 查询的第一行的第一个字段的整型值。
*/
public int queryForInt(String sql) {
return queryForInt(sql, nullPSS);
}
/**
* 查询一个整型结果。
* @param sql SQL语句
* @param args 参数中的值
* @return 查询的第一行的第一个字段的整型值。
*/
public int queryForInt(String sql, Object[] args) {
return queryForInt(sql, new ArgPreparedStatementSetter(args));
}
/**
* 查询一个整型结果。
* @param sql SQL语句
* @param args 参数中的值
* @param types 参数类型
* @return 查询的第一行的第一个字段的整型值。
*/
public int queryForInt(String sql, Object[] args, int[] types) {
return queryForInt(sql, new ArgTypePreparedStatementSetter(args, types));
}
/**
* 查询一个整型结果。
* @param sql SQL语句
* @param pss PreparedStatement的参数设置器
* @return 查询的第一行的第一个字段的整型值。
*/
public int queryForInt(String sql, PreparedStatementSetter pss) {
Number result = (Number) queryObject(sql, pss,
new ObjectResultRowExtractor());
if (result==null) {
return 0;
}
return result.intValue();
}
/**
* 查询一个长整型结果。
* @param sql SQL语句
* @return 查询的第一行的第一个字段的长整型值。
*/
public long queryForLong(String sql) {
return queryForLong(sql, nullPSS);
}
/**
* 查询一个长整型结果。
* @param sql SQL语句
* @param args 参数中的值
* @return 查询的第一行的第一个字段的长整型值。
*/
public long queryForLong(String sql, Object[] args) {
return queryForLong(sql, new ArgPreparedStatementSetter(args));
}
/**
* 查询一个长整型结果。
* @param sql SQL语句
* @param args 参数中的值
* @param types 参数类型
* @return 查询的第一行的第一个字段的长整型值。
*/
public long queryForLong(String sql, Object[] args, int[] types) {
return queryForLong(sql, new ArgTypePreparedStatementSetter(args, types));
}
/**
* 查询一个长整型结果。
* @param sql SQL语句
* @param pss PreparedStatement的参数设置器
* @return 查询的第一行的第一个字段的长整型值。
*/
public long queryForLong(String sql, PreparedStatementSetter pss) {
Number result = (Number) queryObject(sql, pss,
new ObjectResultRowExtractor());
if (result==null) {
return 0;
}
return result.longValue();
}
/**
* 查询一个字符串结果。
* @param sql SQL语句
* @return 查询的第一行的第一个字段的字符串值。
*/
public String queryString(String sql) {
return queryString(sql, nullPSS);
}
/**
* 查询一个字符串结果。
* @param sql SQL语句
* @param args 参数中的值
* @return 查询的第一行的第一个字段的字符串值。
*/
public String queryString(String sql, Object[] args) {
return queryString(sql, new ArgPreparedStatementSetter(args));
}
/**
* 查询一个字符串结果。
* @param sql SQL语句
* @param args 参数中的值
* @param types 参数类型
* @return 查询的第一行的第一个字段的字符串值。
*/
public String queryString(String sql, Object[] args, int[] types) {
return queryString(sql, new ArgTypePreparedStatementSetter(args, types));
}
/**
* 查询一个字符串结果。
* @param sql SQL语句
* @param pss PreparedStatement的参数设置器
* @return 查询的第一行的第一个字段的字符串值。
*/
public String queryString(String sql, PreparedStatementSetter pss) {
return (String) queryObject(sql, pss, new StringResultRowExtractor());
}
/**
* 查询一个对象结果。
* @param sql SQL语句
* @param rre 单行结果提取器
* @return 查询的第一行的结果并使用rre转换为结果对象。
*/
public Object queryObject(String sql, ResultRowExtractor rre) {
return queryObject(sql, nullPSS, rre);
}
/**
* 查询一个对象结果。
* @param sql SQL语句
* @param args 参数中的值
* @param rre 单行结果提取器
* @return 查询的第一行的结果并使用rre转换为结果对象。
*/
public Object queryObject(String sql, Object[] args, ResultRowExtractor rre) {
return queryObject(sql, new ArgPreparedStatementSetter(args), rre);
}
/**
* 查询一个对象结果。
* @param sql SQL语句
* @param args 参数中的值
* @param types 参数类型
* @param rre 单行结果提取器
* @return 查询的第一行的结果并使用rre转换为结果对象。
*/
public Object queryObject(String sql, Object[] args, int[] types,
ResultRowExtractor rre) {
return queryObject(sql, new ArgTypePreparedStatementSetter(args, types),
rre);
}
/**
* 查询一个对象结果。
* @param sql SQL语句
* @param pss PreparedStatement的参数设置器
* @param rre 单行结果提取器
* @return 查询的第一行的结果并使用rre转换为结果对象。
*/
public Object queryObject(String sql, PreparedStatementSetter pss,
final ResultRowExtractor rre) {
Object result = (Object) execute(new SimplePreparedStatementCreator(sql),
pss, new PreparedStatementCallback() {
public Object doInPreparedStatement(PreparedStatement ps)
throws SQLException {
ResultSet rs = null;
try {
rs = ps.executeQuery();
if (rs.next()) {
return rre.extractRow(rs);
} else {
return null;
}
}
catch (SQLException e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR", e);
} finally {
Utils.closeResultSet(rs);
}
}
});
return result;
}
/**
* 查询一个对象列表结果。
* @param sql SQL语句
* @param rre 单行结果提取器
* @return 查询所有结果并使用rre将每行结果转换为结果对象元素。
*/
public List query(String sql, ResultRowExtractor rre) {
return (List) execute(new SimplePreparedStatementCreator(sql), nullPSS,
new ResultRowListPreparedStatementCallback(rre));
}
/**
* 查询结果。
* @param sql SQL语句
* @param rse 全部结果提取器。
* @return 查询结果并根据自定义的结果提取器提取数据并返回。
*/
public Object query(String sql, final ResultSetExtractor rse) {
return (Object) execute(new SimplePreparedStatementCreator(sql), nullPSS,
new ResultSetPreparedStatementCallback(rse));
}
/**
* 查询一个对象列表结果。
* @param sql SQL语句
* @param args 参数中的值
* @param types 参数类型
* @param rre 单行结果提取器
* @return 查询所有结果并使用rre将每行结果转换为结果对象元素。
*/
public List query(String sql, Object[] args, int[] types, ResultRowExtractor rre) {
return (List) execute(new SimplePreparedStatementCreator(sql),
new ArgTypePreparedStatementSetter(args,types),
new ResultRowListPreparedStatementCallback(rre));
}
/**
* 查询结果。
* @param sql SQL语句
* @param args 参数中的值
* @param types 参数类型
* @param rse 全部结果提取器。
* @return 查询结果并根据自定义的结果提取器提取数据并返回。
*/
public Object query(String sql, Object[] args, int[] types, ResultSetExtractor rse) {
return (Object) execute(new SimplePreparedStatementCreator(sql),
new ArgTypePreparedStatementSetter(args,types),
new ResultSetPreparedStatementCallback(rse));
}
/**
* 查询一个对象列表结果。
* @param sql SQL语句
* @param args 参数中的值
* @param rre 单行结果提取器
* @return 查询所有结果并使用rre将每行结果转换为结果对象元素。
*/
public List query(String sql, Object[] args, ResultRowExtractor rre) {
return (List) execute(new SimplePreparedStatementCreator(sql),
new ArgPreparedStatementSetter(args),
new ResultRowListPreparedStatementCallback(rre));
}
/**
* 查询结果。
* @param sql SQL语句
* @param args 参数中的值
* @param rse 全部结果提取器。
* @return 查询结果并根据自定义的结果提取器提取数据并返回。
*/
public Object query(String sql, Object[] args, ResultSetExtractor rse) {
return (Object) execute(new SimplePreparedStatementCreator(sql),
new ArgPreparedStatementSetter(args),
new ResultSetPreparedStatementCallback(rse));
}
/**
* 查询一个对象列表结果。
* @param sql SQL语句
* @param pss PreparedStatement的参数设置器
* @param rre 单行结果提取器
* @return 查询所有结果并使用rre将每行结果转换为结果对象元素。
*/
public List query(String sql, PreparedStatementSetter pss,
ResultRowExtractor rre) {
return (List) execute(new SimplePreparedStatementCreator(sql), pss,
new ResultRowListPreparedStatementCallback(rre));
}
/**
* 查询结果。
* @param sql SQL语句
* @param pss PreparedStatement的参数设置器
* @param rse 全部结果提取器。
* @return 查询结果并根据自定义的结果提取器提取数据并返回。
*/
public Object query(String sql, PreparedStatementSetter pss,
ResultSetExtractor rse) {
return (Object) execute(new SimplePreparedStatementCreator(sql), pss,
new ResultSetPreparedStatementCallback(rse));
}
/**
* 查询并返回第一行的结果并根据字段名自动转换为bean的对应属性。
* @param sql SQL语句
* @param bean 结果Bean的类型
* @return 第一行的结果并转换为Bean实例。
*/
public Object queryForBean(String sql, Class bean) {
try {
Object obj = bean.newInstance();
if (obj instanceof Mappable) {
return queryObject(sql, nullPSS, new MappableResultRowExtractor(obj,
(Mappable) obj));
} else {
return queryObject(sql, nullPSS, new MappableResultRowExtractor(obj,
new NameMatchMappable()));
}
}
catch (Exception e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR", e);
}
}
/**
* 查询并返回第一行的结果并根据字段名自动转换为bean的对应属性。
* @param sql SQL语句
* @param args 参数中的值
* @param bean 结果Bean的类型
* @return 第一行的结果并转换为Bean实例。
*/
public Object queryForBean(String sql, Object[] args, Class bean) {
try {
Object obj = bean.newInstance();
if (obj instanceof Mappable) {
return queryObject(sql, new ArgPreparedStatementSetter(args),
new MappableResultRowExtractor(obj, (Mappable) obj));
} else {
return queryObject(sql, new ArgPreparedStatementSetter(args),
new MappableResultRowExtractor(obj, new NameMatchMappable()));
}
}
catch (Exception e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR", e);
}
}
/**
* 查询并返回第一行的结果并根据字段名自动转换为bean的对应属性。
* @param sql SQL语句
* @param args 参数中的值
* @param types 参数类型
* @param bean 结果Bean的类型
* @return 第一行的结果并转换为Bean实例。
*/
public Object queryForBean(String sql, Object[] args, int[] types, Class bean) {
try {
Object obj = bean.newInstance();
if (obj instanceof Mappable) {
return queryObject(sql, new ArgTypePreparedStatementSetter(args,types),
new MappableResultRowExtractor(obj, (Mappable) obj));
} else {
return queryObject(sql, new ArgTypePreparedStatementSetter(args,types),
new MappableResultRowExtractor(obj, new NameMatchMappable()));
}
}
catch (Exception e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR", e);
}
}
/**
* 查询并返回第一行的结果并根据字段名自动转换为bean的对应属性。
* @param sql SQL语句
* @param pss PreparedStatement的参数设置器
* @param bean 结果Bean的类型
* @return 第一行的结果并转换为Bean实例。
*/
public Object queryForBean(String sql, PreparedStatementSetter pss, Class bean) {
try {
Object obj = bean.newInstance();
if (obj instanceof Mappable) {
return queryObject(sql, pss,
new MappableResultRowExtractor(obj, (Mappable) obj));
} else {
return queryObject(sql, pss,
new MappableResultRowExtractor(obj, new NameMatchMappable()));
}
}
catch (Exception e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR", e);
}
}
/**
* 查询并返回第一行的结果并使用m将其转换为bean。
* @param sql SQL语句
* @param bean 结果Bean的类型
* @param m 字段-属性映射器
* @return 第一行的结果并使用m将其转换为Bean实例。
*/
public Object queryForBean(String sql, Class bean, Mappable m) {
try {
return queryObject(sql, nullPSS, new MappableResultRowExtractor(bean
.newInstance(), m));
}
catch (Exception e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR", e);
}
}
/**
* 查询并返回第一行的结果并使用m将其转换为bean。
* @param sql SQL语句
* @param args 参数中的值
* @param bean 结果Bean的类型
* @param m 字段-属性映射器
* @return 第一行的结果并使用m将其转换为Bean实例。
*/
public Object queryForBean(String sql, Object[] args, Class bean, Mappable m) {
try {
return queryObject(sql, new ArgPreparedStatementSetter(args),
new MappableResultRowExtractor(bean.newInstance(), m));
}
catch (Exception e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR", e);
}
}
/**
* 查询并返回第一行的结果并使用m将其转换为bean。
* @param sql SQL语句
* @param args 参数中的值
* @param types 参数类型
* @param bean 结果Bean的类型
* @param m 字段-属性映射器
* @return 第一行的结果并使用m将其转换为Bean实例。
*/
public Object queryForBean(String sql, Object[] args, int[] types, Class bean, Mappable m) {
try {
return queryObject(sql, new ArgTypePreparedStatementSetter(args,types),
new MappableResultRowExtractor(bean.newInstance(), m));
}
catch (Exception e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR", e);
}
}
/**
* 查询并返回第一行的结果并使用m将其转换为bean。
* @param sql SQL语句
* @param pss PreparedStatement的参数设置器
* @param bean 结果Bean的类型
* @param m 字段-属性映射器
* @return 第一行的结果并使用m将其转换为Bean实例。
*/
public Object queryForBean(String sql, PreparedStatementSetter pss,
Class bean, Mappable m) {
try {
return queryObject(sql, pss, new MappableResultRowExtractor(bean
.newInstance(), m));
}
catch (Exception e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR",e);
}
}
/**
* 无任何参数的PreparedStatement设置器实例。
*/
private static final PreparedStatementSetter nullPSS = new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) {
}
};
/**
* 将参数数组转换为PreparedStatement的设置器的简单适配器。
*/
private static class ArgPreparedStatementSetter implements
PreparedStatementSetter {
private final Object[] args;
public ArgPreparedStatementSetter(Object[] args) {
this.args = args;
}
public void setValues(PreparedStatement ps) throws SQLException {
if (this.args != null) {
for (int i = 0; i < this.args.length; i++) {
ps.setObject(i + 1, this.args[i]);
}
}
}
}
/**
* 将参数数组和其类型转换为PreparedStatement的设置器的简单适配器。
*/
private static class ArgTypePreparedStatementSetter implements
PreparedStatementSetter {
private final Object[] args;
private final int[] types;
public ArgTypePreparedStatementSetter(Object[] args, int[] types) {
if ((args != null && types == null)
|| (args == null && types != null)
|| (args != null && args.length != types.length)) {
throw new JerchException("ArgTypePreparedStatementSetter.ARG_NOT_MATCH");
}
this.args = args;
this.types = types;
}
public void setValues(PreparedStatement ps) throws SQLException {
if (this.args != null) {
for (int i = 0; i < this.args.length; i++) {
ps.setObject(i + 1, this.args[i], this.types[i]);
}
}
}
}
/**
* 将sql语句转换为PreparedStatement的创建器的简单适配器。
*/
private static class SimplePreparedStatementCreator implements
PreparedStatementCreator {
private final String sql;
public SimplePreparedStatementCreator(String sql) {
this.sql = sql;
}
public PreparedStatement createPreparedStatement(Connection con)
throws SQLException {
return con.prepareStatement(this.sql);
}
}
/**
* 将第一个字段作为String类型提取的单行结果提取器。
*/
private static class StringResultRowExtractor implements ResultRowExtractor {
public Object extractRow(java.sql.ResultSet rs) throws SQLException {
return rs.getString(1);
}
}
/**
* 将第一个字段作为Object类型提取的单行结果提取器。
*/
private static class ObjectResultRowExtractor implements ResultRowExtractor {
public Object extractRow(java.sql.ResultSet rs) throws SQLException {
return rs.getObject(1);
}
}
/**
* 将BatchPreparedStatement设置其转换为PreparedStatement设置器的适配器。
*/
private static class BatchPreparedStatementSetterConverter implements
PreparedStatementSetter {
BatchPreparedStatementSetter bpss;
public BatchPreparedStatementSetterConverter(
BatchPreparedStatementSetter bpss) {
this.bpss = bpss;
}
public void setValues(PreparedStatement ps) throws SQLException {
for (int i = 0; i < bpss.getBatchSize(); i++) {
bpss.setValues(ps, i);
ps.addBatch();
}
}
}
/**
* 将批量参数数组转换为PreparedStatement设置器的适配器。
*/
private static class ArgBatchPreparedStatementSetter implements
PreparedStatementSetter {
private final Object[][] args;
public ArgBatchPreparedStatementSetter(Object[][] args) {
this.args = args;
}
public void setValues(PreparedStatement ps) throws SQLException {
if (this.args != null) {
for (int i = 0; i < this.args.length; i++) {
Object[] arg = args[i];
for (int j = 0; j < arg.length; j++) {
ps.setObject(j + 1, arg[j]);
}
ps.addBatch();
}
}
}
}
/**
* 将批量参数数组和对应类型转换为PreparedStatement设置器的适配器。
*/
private static class ArgTypeBatchPreparedStatementSetter implements
PreparedStatementSetter {
private final Object[][] args;
private final int[] types;
public ArgTypeBatchPreparedStatementSetter(Object[][] args, int[] types) {
if ((args != null && types == null)
|| (args == null && types != null)
|| (args != null && args.length != types.length)) {
throw new JerchException("ArgTypePreparedStatementSetter.ARG_NOT_MATCH");
}
this.args = args;
this.types = types;
}
public void setValues(PreparedStatement ps) throws SQLException {
if (this.args != null) {
for (int i = 0; i < this.args.length; i++) {
Object[] arg = args[i];
for (int j = 0; j < arg.length; j++) {
ps.setObject(j + 1, arg[j], types[j]);
}
ps.addBatch();
}
}
}
}
/**
* 使用ResultRowExtractor提取单行结果并将全部结果添加到List的PreparedStatement回调实现。
*/
private static class ResultRowListPreparedStatementCallback implements
PreparedStatementCallback {
ResultRowExtractor rre;
public ResultRowListPreparedStatementCallback(ResultRowExtractor rre) {
this.rre = rre;
}
public Object doInPreparedStatement(PreparedStatement ps)
throws SQLException {
ResultSet rs = null;
List result = new ArrayList();
try {
rs = ps.executeQuery();
while (rs.next()) {
result.add(rre.extractRow(rs));
}
}
catch (SQLException e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR",e);
} finally {
Utils.closeResultSet(rs);
}
return result;
}
}
/**
* 使用ResultSetExtractor提取全部结果的PreparedStatement回调实现。
*/
private static class ResultSetPreparedStatementCallback implements
PreparedStatementCallback {
ResultSetExtractor rse;
public ResultSetPreparedStatementCallback(ResultSetExtractor rse) {
this.rse = rse;
}
public Object doInPreparedStatement(PreparedStatement ps)
throws SQLException {
ResultSet rs = null;
try {
rs = ps.executeQuery();
return rse.extractSet(rs);
}
catch (SQLException e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR",e);
} finally {
Utils.closeResultSet(rs);
}
}
}
/**
* 使用Mappable将单行结果转换为对象实例的ResultRow提取器实现。
*/
private static class MappableResultRowExtractor implements ResultRowExtractor {
private Mappable map;
private Object obj;
public MappableResultRowExtractor(Object obj, Mappable map) {
this.obj = obj;
this.map = map;
}
public Object extractRow(ResultSet rs) throws SQLException {
Class c = obj.getClass();
ResultSetMetaData metaData = rs.getMetaData();
int count = metaData.getColumnCount();
try {
for (int i = 0; i < count; i++) {
String fieldName = metaData.getColumnName(i + 1);
int type = metaData.getColumnType(i + 1);
Class[] types = { map.getMethodParameterType(fieldName, type) };
Method m = c.getMethod(map.getMapMethod(fieldName), types);
Object[] args = { ValueConverterFactory.convert(rs
.getObject(fieldName), types[0]) };
m.invoke(obj, args);
}
}
catch (Exception e) {
Utils.error("JDBCTemplate.EXECUTE_ERROR", e);
throw new JerchException("JDBCTemplate.EXECUTE_ERROR",e);
}
return obj;
}
}
}
java JdbcTemplate源码的更多相关文章
- spring jdbcTemplate源码剖析
本文浅析 spring jdbcTemplate 源码,主要是学习其设计精髓.模板模式.巧妙的回调 一.jdbcTemplate 类结构 ①.JdbcOperations : 接口定义了方法,如 &l ...
- Java集合源码分析(四)Vector<E>
Vector<E>简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长. Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是 ...
- Java集合源码分析(三)LinkedList
LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...
- Java集合源码分析(二)ArrayList
ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...
- Java集合源码学习(一)集合框架概览
>>集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Array ...
- 编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码
转自:编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码 JDK:java version “1.8.0_31”Java(TM) SE Runtime Environment ( ...
- 【转】Java HashMap 源码解析(好文章)
.fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wra ...
- Java Reference 源码分析
@(Java)[Reference] Java Reference 源码分析 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...
- Eclipse Java 关联源码
今天打代码的时候打算看看Java的源码是怎么实现的 没想到还没关联源码 遇到上面的情况只需要关联下源码就可以对着方法按F3查看JAVA的开源代码. 解决上面如下: 找到jdk的安装目录 找到src.z ...
随机推荐
- javascript 中caller,callee,call,apply 的概念[转载]
在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments : 该对象代表正在执行的函数和调用它的函数的参数. [function.]argument ...
- zoj 1649 Rescue (BFS)(转载)
又是类似骑士拯救公主,不过这个是朋友拯救天使的故事... 不同的是,天使有多个朋友,而骑士一般单枪匹马比较帅~ 求到达天使的最短时间,杀死一个护卫1 units time , 走一个格子 1 unit ...
- Linux的前世今生
Linux的起源 说到Linux[/ˈlɪnəks/],想必大家也会自然而然地想到他的创始人——被称为“Linux之父”的林纳斯·托瓦兹(Linus Torvalds).其实,在Linux出现之前,还 ...
- leetcode342——Power of Four(C++)
Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example:Giv ...
- 利用Xlinix SDK 建立Linux程序以及对该程序进行调试
一.创建Linux程序 1. 点击File > New > Application Project .并参照下图设置. 2. 输入工程名,并选择存储路径. 3. 选择所需的操作系统平台(O ...
- 在.NET 应用程序设计中如何选择Class, Abstract Class and Interface
关键字: Type– 类型 Class - 类 Abstract - 抽象的 Interface - 接口 Member - 成员 Method - 方法 Property - 属性 预备知识:在阅读 ...
- 【DP_背包专题】 背包九讲
这段时间看了<背包九讲>,在HUST VJUDGE上找到了一个题单,挑选了其中16道题集中做了下,选题全部是HDU上的题,大多是简单题.目前做了点小总结,大概提了下每道题的思路重点部分,希 ...
- Linux网络应用编程之Packet Tracer安装及界面介绍
Packet Tracer入门 一,Packet Tracer介绍 packet tracer 是由Cisco公司发布的一个辅助学习工具,为学习思科网络课程的初学者去设计.配置.排除网络故障提供了网络 ...
- 4MLinux7.0 服务器配置详解 别名TheSSS
TheSSS download 特性:thttp,php5.5.1,mysql,vsftp,proxy,firewall,带rpm管理器.更新频繁. 官方帮助文件:View (新窗口打开) 发现国内4 ...
- DOS命令中出现空格问题
1.DOS命令中路径出现空格时如何处理? 在DOS命令中,如果路径中出现空格,可能为报错:如参数错误 如: xcopy C:\ABC CD\txt.txt C:\ , 由于路径中包含空格,执行后 ...