package cn.itcast.demo;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import org.junit.Test;import cn.itcast.utils.JdbcUtils;public class Demo4 {
/**
 * 获取自动生成的主键
 create table test1
 (
  id int primary key auto_increment,
  name varchar(20)
 );
 */
@Test
public void test(){
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;

try {
conn=JdbcUtils.getConnection();
String sql="insert into test1(name) values(?)";
st=conn.prepareStatement(sql);
st.setString(1,"aaa");
st.executeUpdate();

rs=st.getGeneratedKeys();
if(rs.next()){
System.out.println(rs.getInt(1));
//System.out.println(rs.getInt("id"));//为什么不能这样写呢???
}
} catch (Exception e) {

e.printStackTrace();
}

}
}java中对于id的值为什么不能这样取呢,System.out.println(rs.getInt("id"));
错误提示是:java.sql.SQLException: Column 'id' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:987)
at com.mysql.jdbc.ResultSet.getInt(ResultSet.java:2749)
at cn.itcast.demo.Demo4.test(Demo4.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
数据库sql

解决方案 »

  1.   

    通过getGeneratedKeys方法返回的只有一列,并且列名是GENERATED_KEYS,你可以通过
    rs.getInt(1)  或者  rs.getInt("GENERATED_KEYS")来获取,但是你用rs.getInt("id")肯定是不行的。
      

  2.   


    你也可以用rs.getMetaData()看看ResultSet里面的列的具体情况。
      

  3.   

    那你像上面说的调用rs.getMetaData()看看
      

  4.   

    System.out.println(rs.getInt("GENERATED_KEYS"));这样不行,报错: Column 'GENERATED_KEYS' not found.
      

  5.   

    那你用rs.getMetaData()看看啊,不就知道列名是什么了。
      

  6.   

    那你用rs.getMetaData()看看啊,不就知道列名是什么了。嗯 列名是GENERATED_KEY
      

  7.   

    那你用rs.getMetaData()看看啊,不就知道列名是什么了。
    还有一个,我在34行前面这样写: rs=st.getResultSet();

    if(rs!=null){
    System.out.println(rs.getMetaData().getColumnName(2));
    }
    结果if语句中的没有执行,说明rs是null,我就想问怎么是空的呢?我想获得第二列的列名怎么办呢?
      

  8.   


    我把if语句改为while了,为什么还是输出一项,不是遍历输出主键列所有值吗???
      

  9.   

    你自己先把对数据库的混乱概念理顺了再去看JDBC,就明白了。
      

  10.   

    我把if语句改为while了,为什么还是输出一项,不是遍历输出主键列所有值吗???
    还有一个,我在34行前面这样写: rs=st.getResultSet();if(rs!=null){
    System.out.println(rs.getMetaData().getColumnName(2));
    }
    结果if语句中的没有执行,说明rs是null,我就想问怎么是空的呢?我想获得第二列的列名怎么办呢?
      

  11.   

    st=conn.prepareStatement(sql,GENERATED_KEYS);