java获取mysql插入数据后的主键

u=2385739129,3869063313&fm=23&gp=0

在数据库中插入一条数据,但是想要获得插入时的主键时,有以下几种办法:

1.最容易想到也是最笨的办法,在多线程多并发的情况下会不准确。那就是插入后执行一次查询。

 

2.使用java普通的PreparedStatement ,如果想要插入后获得插入时的主键,可以使用getGeneratedKeys()方法,执行完sql后直接取得主键值,简单易用。

 

 public int getMyQuery(final Test test){  
 
       Object obj=jdbctemp.execute(new ConnectionCallback(){  
 
           public Object doInConnection(Connection conn) throws SQLException, DataAccessException {  
              String sql="insert into test values(?,?,?)";  
              PreparedStatement pre=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);//返回主键自动  
              pre.setString(1, test.getSname());  
              pre.setString(2, test.getSurl());  
              pre.setDate(3, new java.sql.Date(test.getStime().getTime()));  
              pre.executeUpdate();  
              ResultSet rs=pre.getGeneratedKeys();  
              int m=0;  
              if(rs.next()){  
                  m=rs.getInt(1);  
              }  
              return m;    
           }        
       });  
       return (Integer)obj;  
    }

3.使用spring的话也是可以的,就是使用spring的GeneratedKeyHolder,提供了一个可以返回新增记录对应主键值的方法:

final String INSERT_SQL = "insert into gtable(username,callback) values(?,?)";  
        KeyHolder keyHolder = new GeneratedKeyHolder();  
        jdbcTemplate.update(new PreparedStatementCreator() {  
            public PreparedStatement createPreparedStatement(  
                    Connection connection) throws SQLException {  
                PreparedStatement ps = connection.prepareStatement(INSERT_SQL,  
                        new String[] { "id" });  
                ps.setString(1, request.getUsername());  
                ps.setString(2, request.getCallback());  
                return ps;  
            }  
        }, keyHolder);  
//keyHolder.getKey()就是主键
logger.debug("id:" + keyHolder.getKey()+"long:"+keyHolder.getKey().longValue());