prepareStatement(String sql, String[] columnNames) 
prepareStatement(String sql, int[] columnIndexes)   
int[] columnIndexes 和 String[] columnNames 这是什么东东  JDK讲的不详细

解决方案 »

  1.   

    int[] columnIndexes 和 String[] columnNames 一个整型数组和一个字符串数组
      

  2.   

    如果 DatabaseMetaData#supportsGetGeneratedKeys() 方法返回的 true 的话,
    那表明 JDBC 驱动程序支持 insert 之后返回自动生成的值。而 String[] columnNames 表示的是自动生成值的列名,int[] 表示列的索引号。MySQL 的话可以使用下面的程序:
    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Timestamp;public class OracleTest {    public static void main(String[] args) {
            Connection con = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                con = MysqlConnectionFactory.getConnection();
                DatabaseMetaData dmd = con.getMetaData();
                System.out.println("database product name: " + dmd.getDatabaseProductName());
                System.out.println("database product version: " + dmd.getDatabaseProductVersion());
                System.out.println("supports generate keys? " + dmd.supportsGetGeneratedKeys());
                String sql = "INSERT INTO t_mt_stat (mt_time, stat, stat_time) " +
                 "VALUES (?, ?, ?)";
                ps = con.prepareStatement(sql);
                ps.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
                ps.setString(2, "Y");
                ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
                ps.executeUpdate();
                
                if(dmd.supportsGetGeneratedKeys()) {
                    rs = ps.getGeneratedKeys();
                    while(rs.next()) {
                        System.out.println("ID: " + rs.getInt(1));
                        // System.out.println("ID: " + rs.getInt("GENERATED_KEY"));
                    }
                }
                
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(rs, ps, con);
            }
        }
    }
    Oracle 的话比较麻烦,因为 Oracle 是采用序列方式产生主键的,在返回时需要使用 String[] columnNames 指定所返回的列名。
    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Timestamp;public class OracleTest {    public static void main(String[] args) {
            Connection con = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                con = OracleConnectionFactory.getConnection();
                
                DatabaseMetaData dmd = con.getMetaData();
                System.out.println("database product name: " + dmd.getDatabaseProductName());
                System.out.println("database product version: " + dmd.getDatabaseProductVersion());
                System.out.println("supports generate keys? " + dmd.supportsGetGeneratedKeys());
                String sql = "INSERT INTO t_mt_stat (id, mt_time, stat, stat_time) " +
                 "VALUES (s_mt_stat.nextval, ?, ?, ?)";
                
                ps = con.prepareStatement(sql, new String[]{ "id" });  // 后面一个参数表示需要返回的列
                
                ps.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
                ps.setString(2, "Y");
                ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
                ps.executeUpdate();
                
                if(dmd.supportsGetGeneratedKeys()) {
                    rs = ps.getGeneratedKeys();
                    while(rs.next()) {
                        // 我用的 Oracle JDBC 好像不能直接使用 rs.getInt("id"); 奇怪了 :-(
                        System.out.println("ID: " + rs.getInt(1)); 
                    }
                }
                
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(rs, ps, con);
            }
        }
    }