无法在这个位置找到: head2.htm
当前位置: 建站首页 > 新闻动态 > 行业新闻 >

java获得新insert数据信息自增id的完成方式

时间:2021-04-02 03:36来源:未知 作者:jianzhan 点击:
在MySQL中,应用auto_increment种类的id字段名做为表的主键,并且用它做为别的表的外键约束,产生“主从关系表构造”,它是数据信息库设计方案中常会见的使用方法。可是在实际转化成

在MySQL中,应用auto_increment种类的id字段名做为表的主键,并且用它做为别的表的外键约束,产生“主从关系表构造”,它是数据信息库设计方案中常会见的使用方法。可是在实际转化成id的情况下,大家的实际操作次序通常为:先在主表格中插进纪录,随后得到全自动转化成的id,以它为基本插进从表的纪录。

这儿布有个艰难,便是插进主表纪录后,怎样得到它相匹配的id。一般的作法,是根据“select max(id) from tablename”的作法,可是显而易见这类作法必须考虑到高并发的状况,必须在事务管理中对主表多方面“X锁“,待得到max(id)的值之后,再开启。这类作法必须的流程较为多,一些不便,并且高并发性都不好。有木有更简易的作法呢?

回答之一是根据select LAST_INSERT_ID()这一实际操作。乍一看,它和select max(id)很象,但具体上它是进程安全性的。换句话说它是实际于数据信息库联接的。下边根据试验表明:

1、在联接1中向A表插进一条纪录,A表包括一个auto_increment种类的字段名。

2、在联接2中向A表再插进一条纪录。

3、結果:在联接1中实行select LAST_INSERT_ID()获得的結果和联接2中实行select LAST_INSERT_ID()的結果不是同的;而在2个联接中实行select max(id)的結果是同样的。

实际上在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的差别和这儿是相近的。应用SCOPE_IDENTITY()能够得到插进某一IDENTITY字段名确当前对话的值,而应用IDENT_CURRENT()会得到在某一IDENTITY字段名上插进的较大值,而不区别不一样的对话。

注:应用select last_insert_id()时要留意,当一次插进好几条纪录时,仅仅得到第一次插进的id值,尽量留意!

自然,大家还能够应用另外一种更为方便快捷的方式:在JDBC追加纪录后,应用API得到新追加纪录的主键值。

这一完成应用了Statement的getGeneratedKeys方式,
当Statement追加了一条纪录后,能够立即启用getGeneratedKeys方式得到新追加纪录的key。

检测程序以下:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
public class GetGenerateKey { 
public static void main(String[] args) throws Exception { 
create(); 
public static void create()throws Exception { 
System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver"); 
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", ""); 
Statement st = conn.createStatement(); 
String sql = "insert into user (name, birthday, money) values ('beck', '1949-10-01', 60)"; 
st.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS); 
ResultSet rs = st.getGeneratedKeys(); 
if (rs.next()) { 
int id = rs.getInt(1); 
System.out.println ("转化成纪录的key为 :" + id); 
st.close(); 
conn.close(); 
} 

程序执行結果:

转化成纪录的key为 :9

数据信息库的纪录为:

+----+----------+------------+-------+
| id | name | birthday | money |
+----+----------+------------+-------+
| 9 | beck | 1949-10-01 | 60 |
+----+----------+------------+-------+

小结:这一API方式出示的益处便是无需再次再实行一次查寻得到新纪录的key值。降低了工作中量和网络服务器的压力。

留意点,在实行executeUpdate方式的情况下,要特定回到转化成key的选择项。

===========================================================

2种方式的java 编码

Java编码1

// 用这类方式能获得插进自增的id 非常好用 
PreparedStatement pstmt = conn.prepareStatement(sql.toString(),PreparedStatement.RETURN_GENERATED_KEYS); 
for (int i = 0; i pars.length; i++) { 
pstmt.setObject(i+1, pars[i]); 
pstmt.executeUpdate(); 
long autoIncKeyFromApi = -1; 
ResultSet rs = pstmt.getGeneratedKeys(); 
if (rs.next()) { 
autoIncKeyFromApi = rs.getInt(1); 
return autoIncKeyFromApi; 

Java编码2

qRunner.update(conn,sql.toString(),pars); 
Long zsysqID = (Long) qRunner.query(conn, "SELECT LAST_INSERT_ID()", new ScalarHandler(1)); 

之上便是文中的所有內容,期待对大伙儿的学习培训有一定的协助,也期待大伙儿多多的适用诺心互联网。

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
无法在这个位置找到: ajaxfeedback.htm
栏目列表
推荐内容


扫描二维码分享到微信