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();
    }
  • 相关阅读:
    滚动计算基础知识
    Javascript继承
    提取URL字符串的搜索字符串中的参数
    C++编程练习(13)----“排序算法 之 堆排序“
    常见网络端口 和 常见网络协议
    TCP协议中的三次握手和四次挥手(图解)
    C++编程练习(14)-------“单例模式”的实现
    编程练习------C/C++分别实现字符串与整数的转换
    IPv4地址学习总结
    C/C++中的联合体
  • 原文地址:https://www.cnblogs.com/sprinkle/p/6094402.html
Copyright © 2011-2022 走看看