1. queryForMap() 方法,结果集必须 有且仅有一条结果集 ,其他情况会抛出异常:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
at org.springframework.dao.support.DataAccessUtils.requiredSingleResult(DataAccessUtils.java:71) ~[spring-tx-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:795) ~[spring-jdbc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.queryForMap(JdbcTemplate.java:828) ~[spring-jdbc-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at com.test.data.jdbcdao.impl.JdbcDaoImpl.selectOne(JdbcDaoImpl.java:293) ~[classes/:?]
2. 插入一条数据,并且返回其主键:
KeyHolder keyHolder = new GeneratedKeyHolder();
String[] paramsArr = new String[params.size()];
for(int i = 0; i < params.size(); i++){
paramsArr[i] = params.get(i);
}
jdbcTemplate.update(new PreparedStatementCreator(){
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement ps = con.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);
for(int i = 0; i < paramsArr.length; i++){
ps.setString(i + 1 , paramsArr[i]);
}
return ps;
}
}, keyHolder);
return keyHolder.getKey().longValue();
注意:(1)在JdbcTemplate 中只有这一个接口是与KeyHolder (返回主键的接口)相关的:
public int update(final PreparedStatementCreator psc, final KeyHolder generatedKeyHolder)
throws DataAccessException;
(2)返回的PreparedStatement ,推荐使用设个接口:
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
throws SQLException;
autoGeneratedKeys 使用Statement.RETURN_GENERATED_KEYS, 表示数据库自动生成主键(我用的mysql)