zoukankan      html  css  js  c++  java
  • spring jdbc获取插入记录的主键id

    在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利用这一技术,提供了一个可以返回新增记录对应主键值的方法;

      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实现:

    public int insert(String sql,Object[] values)
    {
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator(){
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
                for(int i=0;i<values.length;i++)
                {
                    ps.setObject(i+1, values[i]);
                }
                return ps;
            }
        }, keyHolder);
        return keyHolder.getKey().intValue();
        //return keyHolder.getKey().longValue();
    }
  • 相关阅读:
    hdu1231 最大连续子序列
    Android 大众点评的接入
    Android Volley分析(一)——结构
    数字签名与数字证书技术简单介绍(一)
    HDU-3681-Prison Break(BFS+状压DP+二分)
    TNS-01201: Listener cannot find executablen 错误
    Android学习笔记(20)————利用ListView制作带竖线的多彩表格
    ListView美化:去阴影、底色、选中色
    android 用ListView实现表格样式
    Android播播放完SD卡指定文件夹音乐之后,自动播放下一首
  • 原文地址:https://www.cnblogs.com/sprinkle/p/6094402.html
Copyright © 2011-2022 走看看