插入一条记录后想要立刻获取其数据表中的主键的值。这个主键是自增 1 的,我想到有两种办法: 再进行一次查询,获取出来。或者在插入数据之前取出最大值,在最大值上面加一 , 但这样不能解决并发性。当多人同一时间提交的时候就出问题了。哪个高手帮我谢谢SQL语句!!!
解决方案 »
- 关于structs2 date型数据截取问题
- 关于上传文件的问题
- tomcat如何对响应头进行编码的,是ISO8859_1还是别的什么?高人请指点!
- 这段jsp代码原文是什么啊
- jsp上传图片
- 求助:关于调试java qq出现异常的问题
- jsp 的这个文本框的属性如何设置呀 急 请帮助
- 关于取得记录总数, select count(*) as bb from ....的问题,急,在线等。
- JSP中Bean的可见性(急得不行
- 您的SQL语法有一个错误;检查对应于MySQL服务器版本的手册,以便使用正确的语法以接近“结束”怎么解决?
- myeclipse怎样设置能自动编译javabean
- 关于一个网站设计的问题
<selectKey resultClass="long" keyProperty="id">
select last_insert_id()
</selectKey>
如果纯用jdbc,考虑到并发性的问题,建议写个存储过程,或者单独一张表维护sequence
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()) {
// 如果使用 rs.getInt("ID") 会报错,奇怪的 Oracle JDBC 驱动!
System.out.println("ID: " + rs.getInt(1));
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(rs, ps, con);
}
}
}
public int UpdateReturnID(String sqlStr)
{
int id=0;
if(sqlStr==null||sqlStr.equals(""))
{
return 0;
}
try {
this.getConnection();
this.stmt =conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
if(stmt.executeUpdate(sqlStr)>0){
String sql="select @@IDENTITY as id";
ResultSet rs=stmt.executeQuery(sql);
if(rs.next()){
id=rs.getInt("id");
}
}
} catch (java.sql.SQLException e) {
e.printStackTrace();
return 0;
}finally{
try{
if(this.stmt!=null)
{
this.stmt.close();
}
}catch(java.sql.SQLException e)
{
e.printStackTrace();
}
try{
if(this.conn!=null)
{
this.conn.close();
}
}catch(java.sql.SQLException e)
{
e.printStackTrace();
}
}
return id;
}
其实就是你自己的方法,
先插入记录然后取最大的id号
记住你的这段代码块必须加上同步哦
代码块上加个synchronized
这样会安全一点