同学们在对数据进行新增操作时,通常我们是执行如下代码:
public int Insert(UserPo t) {
// TODO Auto-generated method stub
int count=0;
try {
con = DbUtil.getConnection();
ps=con.prepareStatement(Insert);
ps.setString(1, t.getUser_name());
ps.setString(2, t.getUser_password());
ps.setInt(3, t.getUser_sex());
ps.setInt(4, t.getUser_age());
count = ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
DbUtil.close(con, ps, rs);
}
return count;
}
count
是个int型的数据,executeUpdate
方法返回的是数据库数据更新数,然后我们就可以通过count
的值来判断插入数据是否成功。那如果我们想要得到刚刚INSERT插入后生成的主键ID来进行下一步操作呢?
在INSERT插入数据后,想要获得刚插入记录的ID,可以利用JDBC的getGeneratedKeys
获得该主键ID。这里我用MySQL数据库为例,使用的是int类型的主键。
public int Insert(UserPo t) {
int id=0;
try {
con = DbUtil.getConnection();
ps=con.prepareStatement(Insert,Statement.RETURN_GENERATED_KEYS);
这里要注意一下,有没有发现和之前的方法有不一样的地方?在con.prepareStatement方法中写sql语句的时候,需要在sql后面加上 Statement.RETURN_GENERATED_KEYS ,Statement引用的是java.sql.Statement
ps.setString(1, t.getUser_name());
ps.setString(2, t.getUser_password());
ps.setInt(3, t.getUser_sex());
ps.setInt(4, t.getUser_age());
ps.execute();
然后就是这里执行的是execute()方法,而不是executeUpdate()
rs=ps.getGeneratedKeys();
while(rs.next()){
id=rs.getInt(1);
}
使用getGeneratedKeys()方法取得ResultSet对象,之后就可以得到返回的主键ID了。
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
DbUtil.close(con, ps, rs);
}
return id;
}
那么就会有同学发现问题了,这个方法好像SQL Server不可用?出现了方法不支持的错误提示:
java.lang.UnsupportedOperationException
SQL Server的sql语句是可以自带返回新产生的主键ID
果然是这样,接下来就可以依葫芦画瓢,在sql语句后面拼接 select @@indentity
ps=con.prepareStatement(Insert+" select @@identity");
之后用ResultSet
接收返回的结果集,按照刚才的测试,结果集里应该就只有一个字段,那就是主键ID。然后通过getInt(1)
来得到这个主键ID
rs=ps.executeQuery();
while(rs.next()){
id=rs.getInt(1);
System.out.println(id);
}