ITPub博客

首页 > 架构设计 > 软件结构 > 使用Spring JDBC新增记录如何返回自增主键值

使用Spring JDBC新增记录如何返回自增主键值

原创 软件结构 作者:gung123 时间:2020-02-21 18:53:29 0 删除 编辑

在项目中,我们经常遇到这样的情况,表主键值设置为自增长,也就是主键值不在应用层产生,而是在新增记录时,由数据库产生。当我们新增加一条记录时,为了唯一定位到该记录,我们需要获得该记录的主键值,而这需要在数据库保存数据后才能从数据库中返回主键值。当我们使用Hibernate作为持久化框架时,新对象在持久化之后,主键值会自动绑定到对象上,但是当我们使用JDBC的时候要如何获得主键值。


在JDBC3.0规范中,当新增记录时,允许将数据库自动产生的主键值绑定到Statement或PreparedStatement中。使用Statement时,可以通过以下方法绑定主键值:


int executeUpdate(String sql,int autoGeneratedKeys)


也可以通过Connection创建绑定自增值的PreparedStatement:


PreparedStatement prepareStatement(String sql,int autoGeneratedKeys)


当autoGeneratedKeys参数设置为Statement.RETURN_GENERATED_KEYS值时即可绑定数据库产生的主键值,设置为Statement.NO_GENERATED_KEYS时,不绑定主键值。如下代码所示:

Statement stmt = conn.createStatement();
String sql = "insert into user(username,age) values('tom',22)";
stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if(rs.next()){
    int key = rs.getInt(0);
}

Spring利用这一技术,提供了一个可以返回新增记录对应主键值的方法;

了解springcloud架构可以加求求:三五三六二四七二五九

  int update(PreparedStatementCreator psc,KeyHolder generatedKeyHolder)


org.springframework.jdbc.support.KeyHolder是一个回调接口,Spring使用它保存新增记录对应的主键,该接口的接口方法描述为:


Number getKey() throws InvalidDataAccessApiUsageException

  当仅插入一行记录时,主键不是复合键而是数字类型时,通过该方法可以直接返回新的主键值。如果是复合主键,或者有多个主键返回时,该方法抛出InvalidDataAccessApiUsageException。


Map<String,Object> getKeys() throws InvalidDataAccessApiUsageException

  如果是复合主键,则列名和列值构成Map中的一个Entry。如果返回的是多个主键,则该方法抛出InvalidDataAccessApiUsageException异常。


List<Map<String ,Object>> getKeyList()

  如果返回多个主键,即PreparedStatement新增了多条记录,则每一个主键对应一个Map,多个Map构成一个List。


Spring为KeyHolder接口指代了一个通用的实现类GenerateKeyHolder,该类返回新增记录时的自增长主键值。我们可以修改上面的代码使用Spring jdbc实现:


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69952307/viewspace-2676684/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-11-01

  • 博文量
    99
  • 访问量
    40085