prepareStatement(String sql, String[] columnNames)
prepareStatement(String sql, int[] columnIndexes)
int[] columnIndexes 和 String[] columnNames 这是什么东东 JDK讲的不详细
prepareStatement(String sql, int[] columnIndexes)
int[] columnIndexes 和 String[] columnNames 这是什么东东 JDK讲的不详细
那表明 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);
}
}
}