【问题标题】:How to return generated UUID primary key如何返回生成的 UUID 主键
【发布时间】:2019-06-25 20:09:01
【问题描述】:

我正在使用 mySQL 数据库,并且该表具有由数据库引擎生成的 UUID 格式的主键。我正在使用 Spring 框架 JdbcTemplate (https://docs.spring.io/spring/docs/current/javadoc-api/index.html?org/springframework/jdbc/core/JdbcTemplate.html) 来执行所有操作。但是在插入时,我确实需要将主键返回给调用者。 JdbcTemplate 有方法 public int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) 但它只返回整数键。 KeyHolder 接口也只允许数字键。 有人知道如何克服这个缺陷吗?我应该使用 JdbcTemplate 以外的东西吗?这是不可取的,但可能的。 请给我一个提示。

【问题讨论】:

    标签: java spring uuid jdbctemplate


    【解决方案1】:

    这对我有用!

    public String save(SysUser sysUser) {
        String SQL = "INSERT INTO sys_user(id,account_number,telephone,email,real_name) VALUES (?,?,?,?,?);";
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(connection -> {
            PreparedStatement preparedStatement = connection.prepareStatement(SQL, new String[]{"id"});
            preparedStatement.setString(1, sysUser.getId());
            preparedStatement.setString(2, sysUser.getAccountNumber());
            preparedStatement.setString(3, sysUser.getTelephone());
            preparedStatement.setString(4, sysUser.getEmail());
            preparedStatement.setString(5, sysUser.getRealName());
            return preparedStatement;
        }, keyHolder);
        return String.valueOf(keyHolder.getKeyList().get(0).get("id"));
    }
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    【解决方案2】:

    你可以这样用它来获取一个非数字键

    GeneratedKeyHolder gendKey = new GeneratedKeyHolder();
    jdbcTemplate.update(new PreparedStatementCreator() {
        @Override
        public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
            PreparedStatement stmt = con.prepareStatement("INSERT INTO MY_TABLE(col1, col2) VALUES (?, ?) ", Statement.RETURN_GENERATED_KEYS);
            stmt.setString(1, "val1");
            stmt.setString(2, "val2");
            return stmt;
        }
    }, gendKey);
    
    // If multiple rows updated, use getKeys()
    String uuid = (String) gendKey.getKey().get("UUID-COL-NAME");
    

    【讨论】:

    • 我不是在谈论更新函数的返回。方法调用中使用的 KeyHolder 只允许数值。 docs.spring.io/spring/docs/current/javadoc-api/index.html?org/… 方法 getKey 返回一个数字。我的主键不是数字而是 UUID。
    • 我的查询如下所示:插入 ITEM_SPECS (ITEM_ID, ITEM_NAME, ITEM_VERSION, ITEM_LOCATION, ITEM_OWNER) 值(UUID(), ?, ?, ?, ?);查询执行后 keyHolder 不包含任何键。当我开始编写这段代码时,我计划使用 UUID() 函数作为键列的默认值。 MySQL 5.7 不支持它。只有 MySQL 8 可以。公司尚未升级。
    【解决方案3】:

    一种方法是提前在您的 java 中创建 UUID,然后将其传递给 (SQL/DB),因此在这种情况下,您已经知道什么是您的主键。因为理论上 UUID 是唯一的,所以应该没有冲突。

    UUID uuid = UUID.randomUUID();
    jdbcTemplate.update("INSERT INTO users ( user_uuid , first_name , last_name) VALUES (?,?,?)",
                    "admin", uuid, user.getFirstName(), user.getLastName());
    //uuid: you already have the PrimeryKey in advance
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 2020-10-27
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      相关资源
      最近更新 更多