JSP里是否有mysql_insert_id()或类似功能的函数?(解决就给分)
CREATE TABLE `message` (
`msgPID` int(10) NOT NULL auto_increment,
`msgType` varchar(10) default NULL,
`msgSubject` varchar(100) default NULL,
`msgBody` blob,
`msgSender` varchar(100) default NULL,
`fileList` blob,
`sendDate` varchar(20) default NULL,
PRIMARY KEY (`msgPID`)
) TYPE=MyISAM
CREATE TABLE `personalmsg` (
`personalMsg` int(10) NOT NULL auto_increment,
`msgPID` int(10) NOT NULL default '0',
`userPID` int(10) default NULL,
`msgType` int(1) default NULL,
`statusMsg` int(1) default NULL,
PRIMARY KEY (`personalMsg`)
) TYPE=MyISAM
在做消息发布的时候遇到的问题,记得在PHP中有一个mysql_insert_id能取到最近一次执行insert语句生成记录的ID,但在我JSP里一直没找到这个或有类似功能的函数,请高手指点,不胜感激。
问题点数:100、回复次数:7Top
1 楼funcreal(为中华之崛起而编程)回复于 2005-12-22 19:40:28 得分 10
以我的经验,没有这个东西。
你在事务里做一下吧,要记着加个锁Top
2 楼bluemoon0001(小天--追梦浪子)回复于 2005-12-23 09:05:57 得分 40
为什么非要用系统自动增量做ID呢?这种做法有很多蔽端,我想只要你是长写程序的都应该能体会到的。
另外提供两种做ID的方式:
1、用一张表(autoTableId)专门用来记录其它表中的ID,改表的字段为 tabelname maxid
在jsp中写个函数,或者是类,专门用来提取其它表的最大ID
当你在另一个表(例如:user表)中插入数据前 先用user做为tabelname的搜索条件在表autoTableId中搜索
如果的不到那就在表autoTableId 插入一条tabelname为user 、maxid为1的记录,这时你的取ID的函数反回的就是1,也就是user表中要用到的ID
如果找到了那就先把原maxid加1保存到autoTableId表中,在把加1后的maxid作为函数的返回值,也就是也就是user表中要用到的ID
用这种方式作ID应该说绝没有问题,这样同时也就解决了,你取不到新插入记录ID的问题,这种方式在我用asp做的OA中用到过。
2、用字符串作表的ID:
自己写个函数用来生成一个永不重复的字段串,原理,你可以用日期时间 再加上随机数,这样ID重复的机率几乎为0
例:2005-12-23 8:56:23 此时再加上一个0~9 a~z的5位或6位随机组合(或者是1到1000的一个随机数),这样生成的ID就可能是:2005122385623a4b8zx 等,这样重复的可能性几乎为0,我用asp做一般网站,用的就是这种方法生ID的。
用这种方法同样也能解决你说的那个问题了。
总结:自己生成ID比数据库自动生成ID要灵活方便的多。Top
3 楼dduyong(polestar)回复于 2005-12-23 09:35:32 得分 10
晕。这么傻的问题。hibernate会在每save一条的记录的时候返回一个主键的对象给你。
在你这里就是一个Integer的msgPIDTop
4 楼nonamexz(无名小卒)回复于 2005-12-23 11:31:57 得分 0
我已经找到解决方法了。
用mysql自带的select last_insert_id()就可以了。Top
5 楼bluemoon0001(小天--追梦浪子)回复于 2005-12-23 12:55:41 得分 20
这种方法是可以,但是有没有考虑到,同时性噢,如果恰好,在你插入一条记录之后,提取最新ID之间,刚好这个时候别人又插入一条件的数据,这时候提取的就是别人插入记录的ID噢,不过也许用事务处理可以解决这个问题噢。Top
6 楼nonamexz(无名小卒)回复于 2005-12-23 16:38:30 得分 0
last_insert_id()最后产生的 ID 是以每个连接为基础在服务器端被维护的。它不可能被其它的客户端连接改变。所以,bluemoon0001(小天--追梦浪子)所说的问题是不会出现的。Top
7 楼ChDw(米)回复于 2005-12-23 17:03:27 得分 20
你也可以在调用executeUpdate时候增加参数 Statement.RETURN_GENERATED_KEYS
然后getGeneratedKeys() 获得Top