国庆假期抽时间学习一下,在看spring的过程中,看到
KeyHolder
,我有点惊讶,这种设计模式真是的太巧妙了,平时为什么想不到,也运用不上,所以在此记录下来,也分享一下
KeyHolder
你觉得这个接口很奇怪,全都是get方法,我们通过源码看到,使用的时候都是内部final用
spring有对KeyHolder的默认实现GeneratedKeyHolder
源码:JdbcTemplate.java
@Override public int update(final PreparedStatementCreator psc, final KeyHolder generatedKeyHolder) throws DataAccessException { Assert.notNull(generatedKeyHolder, "KeyHolder must not be null"); logger.debug("Executing SQL update and returning generated keys"); return execute(psc, new PreparedStatementCallback() { @Override public Integer doInPreparedStatement(PreparedStatement ps) throws SQLException { int rows = ps.executeUpdate(); List
重点代码12、19行
List<Map<String, Object>> generatedKeys = generatedKeyHolder.getKeyList();
获取生成数据generatedKeys.addAll(rse.extractData(keys));
设置数据
使用:
final KeyHolder keyHolder = new GeneratedKeyHolder(); if (this.tableMetaDataContext.isGetGeneratedKeysSupported()) { getJdbcTemplate().update( new PreparedStatementCreator() { @Override public PreparedStatement createPreparedStatement(Connection con) throws SQLException { PreparedStatement ps = prepareStatementForGeneratedKeys(con); setParameterValues(ps, values, getInsertTypes()); return ps; } }, keyHolder); }
设计模式重点:
在
匿名内部类
中修改外围实例
数据
什么时候使用该设计模式:
数据提供需要交给另外的实例处理后提供出来,用于后续处理
spring在这里使用的要点是:
当插入(或修改)数据时,一般需要返回的是受影响数,但在开发项目的时候,插入数据后,一般要返回id,这个时候就用到这种方法了,如果把受影响数和id每次都返回,有缺点,并不是每次都要求返回id,这样会增加服务器负担