在Spring JDBC 中获取自动生成的Key

1. 引言

在这个快速教程中,我们将探讨在使用Spring JDBC时在插入实体后获取自动生成的密钥的可能性。

2. 专家依赖关系

首先,我们需要在我们的 pom 中定义弹簧启动器 jdbc 和 H2 依赖项.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

我们可以查看 Maven Central 上这两个依赖项的最新版本:弹簧启动启动器 jdbc 和 h2

3. 获取自动生成的密钥

3.1. 场景

让我们定义一个sys_message表,其中包含 2 列:id(自动生成的键)和消息

CREATE TABLE IF NOT EXISTS sys_message (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    message varchar(100) NOT NULL,
    PRIMARY KEY (id)
);

3.2. 使用 Jdbc 模板

现在,让我们实现一个方法,该方法将使用 JDBCTemplate 插入新记录并返回自动生成的 id。

因此,我们将使用 JDBC 模板更新() 方法,该方法支持检索数据库生成的主键。此方法将准备语句创建器接口的一个实例作为第一个参数,另一个参数是密钥持有者。

由于准备语句创建器接口是一个功能接口,其方法接受 java.sql.连接的实例并返回一个 java.sql.准备语句对象,为简单起见,我们可以使用 lambda 表达式:

String INSERT_MESSAGE_SQL 
  = "insert into sys_message (message) values(?) ";
    
public long insertMessage(String message) {    
    KeyHolder keyHolder = new GeneratedKeyHolder();

    jdbcTemplate.update(connection -> {
        PreparedStatement ps = connection
          .prepareStatement(INSERT_MESSAGE_SQL);
          ps.setString(1, message);
          return ps;
        }, keyHolder);

        return (long) keyHolder.getKey();
    }
}

值得注意的是键持有者对象将包含从 JDBCTemplate 更新() 方法自动生成的密钥返回

我们可以通过调用密钥持有者.getKey() 来检索该密钥。

此外,我们可以验证该方法:

@Test
public void 
  insertJDBC_whenLoadMessageByKey_thenGetTheSameMessage() {
    long key = messageRepositoryJDBCTemplate.insert(MESSAGE_CONTENT);
    String loadedMessage = messageRepositoryJDBCTemplate
      .getMessageById(key);

    assertEquals(MESSAGE_CONTENT, loadedMessage);
}

3.3. 使用简单Jdbc插入

除了 JDBC 模板之外,我们还可以使用简单的 Jdbc 导入来实现相同的结果。

因此,我们需要初始化简单 Jdbc 插入的实例:

@Repository
public class MessageRepositorySimpleJDBCInsert {

    SimpleJdbcInsert simpleJdbcInsert;

    @Autowired
    public MessageRepositorySimpleJDBCInsert(DataSource dataSource) {
        simpleJdbcInsert = new SimpleJdbcInsert(dataSource)
          .withTableName("sys_message").usingGeneratedKeyColumns("id");
    }
    
    //...
}

因此,我们可以调用简单Jdbc插入执行和返回键方法,以插入一条新记录来sys_message表并取回自动生成的密钥

public long insert(String message) {
    Map<String, Object> parameters = new HashMap<>(1);
    parameters.put("message", message);
    Number newId = simpleJdbcInsert.executeAndReturnKey(parameters);
    return (long) newId;
}

此外,我们可以非常简单地验证该方法:

@Test
public void 
  insertSimpleInsert_whenLoadMessageKey_thenGetTheSameMessage() {
    long key = messageRepositorySimpleJDBCInsert.insert(MESSAGE_CONTENT);
    String loadedMessage = messageRepositoryJDBCTemplate.getMessageById(key);

    assertEquals(MESSAGE_CONTENT, loadedMessage);
}

4. 结论

我们已经探索了使用 JDBC 模板简单 Jdbc插入插入新记录并取回自动生成的密钥的可能性。

与往常一样,我们可以在Github上找到本文的实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值