博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring KeyHolder
阅读量:5825 次
发布时间:2019-06-18

本文共 2099 字,大约阅读时间需要 6 分钟。

hot3.png

国庆假期抽时间学习一下,在看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
> generatedKeys = generatedKeyHolder.getKeyList(); generatedKeys.clear(); ResultSet keys = ps.getGeneratedKeys(); if (keys != null) { try { RowMapperResultSetExtractor
> rse = new RowMapperResultSetExtractor
>(getColumnMapRowMapper(), 1); generatedKeys.addAll(rse.extractData(keys)); } finally { JdbcUtils.closeResultSet(keys); } } if (logger.isDebugEnabled()) { logger.debug("SQL update affected " + rows + " rows and returned " + generatedKeys.size() + " keys"); } return rows; } }); }

重点代码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,这样会增加服务器负担

转载于:https://my.oschina.net/u/1983041/blog/754489

你可能感兴趣的文章
贪吃蛇
查看>>
EventSystem
查看>>
用WINSOCK API实现同步非阻塞方式的网络通讯
查看>>
玩一玩博客,嘿嘿
查看>>
P1352 没有上司的舞会
查看>>
ios11文件夹
查看>>
【HLOJ 559】好朋友的题
查看>>
Electric Fence(皮克定理)
查看>>
nvl 在mysql中如何处理
查看>>
MyEclipse 快捷键
查看>>
快速傅里叶变换FFT
查看>>
大数据常用基本算法
查看>>
JavaScript学习笔记(十三)——生成器(generator)
查看>>
hibernate保存失败
查看>>
MySQL增量订阅&消费组件Canal POC
查看>>
Sqlite多线程
查看>>
数据结构-时间复杂度
查看>>
对象与字符串相互转换
查看>>
[NOIp2017提高组]小凯的疑惑
查看>>
《C程序设计语言》练习1-5
查看>>