1。因为公司项目工程使用的是NamedParameterJdbcTemplate,所以对其进行研究
NamedParameterJdbcTemplate实现了接口NamedParameterJdbcOperations
NamedParameterJdbcTemplate.java
/** The JdbcTemplate we are wrapping */
//封装的jdbc模板
private final JdbcOperations classicJdbcTemplate;
/** Map of original SQL String to ParsedSql representation */
//对原始sql的一个缓存集合
private final Map parsedSqlCache = new HashMap();
//
public Object execute(String sql, SqlParameterSource paramSource, PreparedStatementCallback action)
throws DataAccessException {
return getJdbcOperations().execute(getPreparedStatementCreator(sql, paramSource), action);
}
说明:在这里参数sqlParameterSource是一个接口 ,抽象类AbstractSqlParameterSource 实现了SqlParameterSource 中的部分方法
public abstract class AbstractSqlParameterSource implements SqlParameterSource
setvalue抽象方法供用户自己去实现处理相关参数
protected abstract void setValues(PreparedStatement ps, LobCreator lobCreator)
AbstractSqlParameterSource 下有两个实现类BeanPropertySqlParameterSource和MapSqlParameterSource
你也可以不适用其子类,通过内部匿名类实现setValues方法处理参数就行,下面介绍其两个子类
1。BeanPropertySqlParameterSource通过一个普通的javabean对象构造BeanPropertySqlParameterSource对象
传进来的bean必须与参数名称相同
2。MapSqlParameterSource 通过传入一个hashMap构造一个参数源,或者通过调用其AddValue形成参数源
参数2abstractLobCreatingPreparedStatementCallback 实现了PreparedStatementCallback 回调接口
2abstractLobCreatingPreparedStatementCallback 通过 lobHandler构造实例
类如下
public abstract class AbstractLobCreatingPreparedStatementCallback implements PreparedStatementCallback {
并接也提供了 abstract void setValues(PreparedStatement ps, LobCreator lobCreator)抽象方法
第二个excute方法介绍
public Object execute(String sql, Map paramMap, PreparedStatementCallback action) throws DataAccessException {
return execute(sql, new MapSqlParameterSource(paramMap), action);
}
与第一个不同的是execute方法时第二个参数是一个map 他内不是通过调用第一个excute方法传递MapSqlParameterSource 也就是SqlParameterSource 的子类;
接下来看一下查询通过功能划分
第一组:
根据要查询的sql,参数源,结果集提取器进行查询下面这俩个第二个参数只不过是父子关系而已
接口ResultSetExtractor 中void processRow(ResultSet rs) throws SQLException;是为了获取结果集,对其进行处理
public Object query(String sql, SqlParameterSource paramSource, ResultSetExtractor rse)
throws DataAccessException {
return getJdbcOperations().query(getPreparedStatementCreator(sql, paramSource), rse);
}
public Object query(String sql, Map paramMap, ResultSetExtractor rse) throws DataAccessException {
return query(sql, new MapSqlParameterSource(paramMap), rse);
}
第二组:前俩个参数不在做介绍 只对第三个参数做介绍接口RowCallbackHandler
接口RowCallbackHandler 中只有一个
void processRow(ResultSet rs) throws SQLException;是为了获取结果集,对其进行处理
个人感觉RowCallbackHandler 与ResultSetExtractor 接口中的方法一样,这里可能实际使用中对其子类用的比较多吧
public void query(String sql, SqlParameterSource paramSource, RowCallbackHandler rch)
throws DataAccessException {
getJdbcOperations().query(getPreparedStatementCreator(sql, paramSource), rch);
}
public void query(String sql, Map paramMap, RowCallbackHandler rch) throws DataAccessException {
query(sql, new MapSqlParameterSource(paramMap), rch);
}
第三组 主要介绍一下第三个参数接口RowMapper 他的方法 bject mapRow(ResultSet rs, int rowNum)
处理完成后悔返回一个对象
public List query(String sql, SqlParameterSource paramSource, RowMapper rowMapper)
throws DataAccessException {
return getJdbcOperations().query(getPreparedStatementCreator(sql, paramSource), rowMapper);
}
public List query(String sql, Map paramMap, RowMapper rowMapper) throws DataAccessException {
return query(sql, new MapSqlParameterSource(paramMap), rowMapper);
}