使用JDBC如何获取数据库自动生成的主键
这部分内容用在哪里呢?例如,老公表和老婆表
老公表
id | name |
|
… | … |
|
4 | 张三 |
|
|
|
|
老婆表
id | name | h_id |
1 | aaa | 4 |
|
|
|
|
|
|
老公表中id是自动增长的,向老公表中插入一条记录,姓名为“张三”,id自动增长为4。这时向老婆表中插入一条记录,姓名为“aaa”,她老公为“张三”,这时我们就需要获取老公表中自动增长的id值去更新老婆表中的记录。
案例:
create database jdbc character set utf8 collate utf8_general_ci;
use jdbc;
create table users(
id int primary key auto_increment,
name varchar(40),
password varchar(40),
email varchar(60),
birthday date
)
现在向该表中插入一行记录,然后得到自动增长的id。
insert into users(name,password,email,birthday) values('zs','1234','zs@sina.com','1990-1-1');
insert into users(name,password,email,birthday) values('lisi','1234','lisi@sina.com','1990-3-1');
编写Java代码:Demo4.java
Connection conn = JdbcUtil.getConnection();
String sql = "insert into user(name,password,email,birthday)
values('abc','123','abc@sina.com','1978-08-08')";
PreparedStatement st = conn.
prepareStatement(sql,Statement.RETURN_GENERATED_KEYS );
//该Statement.RETURN_GENERATED_KEYS参数可带可不带,不带该参数时也可得到自动增长的id,因为MySQL的驱动默认就是可以返回自动增长的id的。如果得不到自动增长的id,你就要小心了,就需要传递该参数。该参数的取值还可以是Statement.NO_GENERATED_KEY,意思相反。但是当我们真的设置为NO_GENERATED_KEY时,还是可以返回自动增长的id,这时因为JDBC只是一种规范,mysql有没有按照规范去实现?从这里可以看出mysql根本没有安装规范去实现。
st.executeUpdate();
//上面的语句执行完,就向数据库的表中添加了一条记录,我们想获得刚添加的记录自动增长的id,方法:
ResultSet rs = st.getGeneratedKeys(); //得到插入行的主键,结果集中只有一条记录
if(rs.next())
System.out.println(rs.getObject(1)); //rs.getInt(1)
注意:prepareStatement(sql,Statement.RETURN_GENERATED_KEYS );
此参数仅对insert操作有效。