在项目开发过程中,经常会遇到要由数据库返回编号给用户的情况。如用户访问时,判断该用户是否为没有编号的用户,如果没有,则需要插入用户表一第记录,并将用户编号返回给客户端。
基于这种情况,就需要用到getGeneratedKeys()方法了。
下面是我写的一个测试类:
package com.snowfish;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SequenceTest {
private static String dbURL = "jdbc:postgresql://127.0.0.1:5433/test";
private static String userName = "postgres";
private static String password = "postgres";
public static void main(String[] args) throws SQLException {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sqlStr = "insert into c (typeid) values (1002);";
try {
Class.forName("org.postgresql.Driver");
conn = DriverManager.getConnection(dbURL, userName, password);
conn.setAutoCommit(true);
stmt = conn.createStatement();
stmt.executeUpdate(sqlStr, stmt.RETURN_GENERATED_KEYS);
rs = stmt.getGeneratedKeys();
if (rs.next()) {
System.out.println("ID: " + rs.getInt(1));
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
}
我的数据库使用的是PostgreSQL:
CREATE SEQUENCE user_info_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 25
CACHE 1
CYCLE;
ALTER TABLE user_info_seq
OWNER TO postgres;
CREATE TABLE c
(
cid integer NOT NULL DEFAULT nextval('user_info_seq'::regclass),
typeid integer NOT NULL,
CONSTRAINT pk_c_aid PRIMARY KEY (cid )
)
WITH (
OIDS=FALSE
);
ALTER TABLE c
OWNER TO postgres;
要注意的是,主键字段的值不能由Java代码中的SQL语句去插入,必需是自动生成的。