Java 通过jdbctemplate从sql insert获取标识
是否可以在Spring jdbc模板调用中从SQL插入中获取@标识?如果是这样,怎么做?我不知道是否有“一行程序”,但这似乎起到了作用(至少对于MSSQL):Java 通过jdbctemplate从sql insert获取标识,java,sql-server,spring,jdbc,jdbctemplate,Java,Sql Server,Spring,Jdbc,Jdbctemplate,是否可以在Spring jdbc模板调用中从SQL插入中获取@标识?如果是这样,怎么做?我不知道是否有“一行程序”,但这似乎起到了作用(至少对于MSSQL): 体面的文章。JDBCTemplate.update方法被重载,以获取一个名为GeneratedKeyHolder的对象,您可以使用该对象检索自动生成的密钥。例如(代码取自): 怎么样SimpleJdbcInsert.executeAndReturnKey?它有两种形式,具体取决于输入: public java.lang.Number ex
体面的文章。JDBCTemplate.update方法被重载,以获取一个名为GeneratedKeyHolder的对象,您可以使用该对象检索自动生成的密钥。例如(代码取自):
怎么样
SimpleJdbcInsert.executeAndReturnKey
?它有两种形式,具体取决于输入:
public java.lang.Number executeAndReturnKey(java.util.Map args)
从接口复制的说明:
使用传入的值执行insert并返回生成的键。
这需要指定具有自动生成键的列的名称。此方法将始终返回密钥持有者
,但调用方必须验证它是否确实包含生成的密钥
指定人:
接口内
参数:
args-包含列名和相应值的映射
返回:
生成的键值
public java.lang.Number executeAndReturnKey(
参数源)
从接口复制的说明:
使用传入的值执行insert并返回生成的键。
这需要指定具有自动生成键的列的名称。此方法将始终返回密钥持有者
,但调用方必须验证它是否确实包含生成的密钥
指定人:
接口内
参数:
parameterSource-包含用于插入的值的SqlParameterSource
返回:
生成的键值
向todd.pierzina答案添加详细注释/示例代码
jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
"Primary_key");
Map<String, Object> parameters = new HashMap<>();
parameters.put("Column_NAME1", bean.getval1());
parameters.put("Column_NAME2", bean.getval2());
// execute insert
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(
parameters));
// convert Number to Int using ((Number) key).intValue()
return ((Number) key).intValue();
jdbinsert=newsimplejdbcinsert(jdbcTemplate);
jdbcInsert.withTableName(“TABLE_NAME”)。使用GeneratedKeyColumns(
“主键”);
映射参数=新的HashMap();
parameters.put(“Column_NAME1”,bean.getval1());
parameters.put(“Column_NAME2”,bean.getval2());
//执行插入
Number key=jdbciert.executeAndReturnKey(新的MapSqlParameterSource(
参数);
//使用((数字)键).intValue()将数字转换为Int
返回((数字)键).intValue();
这就是我在这里寻找的“一行”。美好的可悲的是,我看到了这个链接,但由于“JDBC3.0标准的一部分”而忽略了它。(我不认为我们使用JDBC 3.0,但我也不认为这与此相关)。它在Java 8中使用lambdas获得了一个真正的一行程序\m/如果生成的键不是一个数字,而是一个字符串呢?如果使用NEWID,这是一个哈希(字符串),您将如何返回它?KeyHolder不仅有getKey(),还有getKeys()和getKeyList()方法,将键值作为对象返回。哇,我真的不知道这个类-有点整洁。谢谢+1与PreparedStatementCreator版本相比,我更喜欢此版本。我面临此异常:org.springframework.dao.InvalidDataAccessResourceUsageException:此版本不支持getGeneratedKeys功能database@Az.MaYo-您的问题可能与JDBC驱动程序版本有关。找不到带有链接的页面。对于SQL Server,@@identity返回在当前会话中数据库中任何表上生成的最后一个id。例如,如果您的insert导致触发一个触发器,该触发器也会在某个表中生成一个新标识,那么您将获得该值。在大多数情况下,您永远不想使用@标识。
final String INSERT_SQL = "insert into my_test (name) values(?)";
final String name = "Rob";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps =
connection.prepareStatement(INSERT_SQL, new String[] {"id"});
ps.setString(1, name);
return ps;
}
},
keyHolder);
// keyHolder.getKey() now contains the generated key
jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
"Primary_key");
Map<String, Object> parameters = new HashMap<>();
parameters.put("Column_NAME1", bean.getval1());
parameters.put("Column_NAME2", bean.getval2());
// execute insert
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(
parameters));
// convert Number to Int using ((Number) key).intValue()
return ((Number) key).intValue();