【问题标题】:How to get generated ID after I inserted into a new data record in database using Spring JDBCTemplate?使用 Spring JDBCTemplate 插入数据库中的新数据记录后如何获取生成的 ID?
【发布时间】:2013-01-10 08:18:12
【问题描述】:

我在使用 Spring JDBCTemplate 时遇到一个很常见的问题,我想在将新的数据记录插入数据库后获取 ID 值,该 ID 值将引用到另一个相关表。我尝试了以下方式来插入它,但我总是返回 1 而不是它真正的唯一 ID。 (我使用 MySQL 作为数据库)

public int insert(BasicModel entity) {
    String insertIntoSql = QueryUtil.getInsertIntoSqlStatement(entity);

    log.info("SQL Statement for inserting into: " + insertIntoSql);

    return this.jdbcTemplate.update(insertIntoSql);
}

【问题讨论】:

    标签: database spring unique jdbctemplate persistent


    【解决方案1】:

    JdbcTemplate.update() 返回:

    受影响的行数

    对于INSERT 语句,始终为1。不同的数据库以不同的方式支持生成的密钥提取,但大多数 JDBC 驱动程序对此进行了抽象,JdbcTemplate 支持这一点。引用12.2.8 Retrieving auto-generated keys

    update() 便捷方法支持检索数据库生成的主键。这种支持是 JDBC 3.0 标准的一部分;详见规范第 13.6 章。

    基本上你需要这个更详细的声明:

    final String insertIntoSql = QueryUtil.getInsertIntoSqlStatement(entity);
    KeyHolder keyHolder = new GeneratedKeyHolder();
    
    jdbcTemplate.update(
      new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
          return connection.prepareStatement(insertIntoSql, new String[] {"id"});
        }
      }, keyHolder);
    
    return keyHolder.getKey().intValue();
    

    【讨论】:

    【解决方案2】:

    @panadol-chong,@tomasz-nurkiewicz 的代码需要稍作修改才能在这里工作。

    final String SQL = "INSERT INTO ... RETUNING id";
    
    KeyHolder keyHolder = new GeneratedKeyHolder();
    
    jdbcTemplate.update(connection -> {
        PreparedStatement ps = connection.prepareStatement(SQL, 
                               Statement.RETURN_GENERATED_KEYS);
    
        return ps;
    }, keyHolder);
    
    return keyHolder.getKey().intValue();
    

    主要区别在于Statement.RETURN_GENERATED_KEYS

    【讨论】:

      【解决方案3】:

      您可以使用@Tomasz Nurkiewicz 的答案,它肯定有效,但您不需要: Spring 提供 SimpleJdbcInsert,它“提供元数据处理以简化构造基本插入语句所需的代码”。

      @Repository
      public class UserDao {
      
          private JdbcTemplate jdbcTemplate;
          private SimpleJdbcInsert insertIntoUser;
      
          @Autowired
          public UserDao(DataSource datasource) {
              jdbcTemplate = new JdbcTemplate(datasource);
              insertIntoUser = new SimpleJdbcInsert(jdbcTemplate).withTableName("user").usingGeneratedKeyColumns("id_user");
          }
      
          public Number insertUser(User u) {
              final Map<String, Object> parameters = new HashMap<>();
              parameters.put("name", u.getName());
      
              return insertIntoUser.executeAndReturnKey(parameters);
          }
      }
      
      

      insertUser返回的“Number”是为用户插入生成的id_user。

      【讨论】:

        猜你喜欢
        • 2018-04-16
        • 2016-07-07
        • 2013-12-06
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-29
        相关资源
        最近更新 更多