正常情况下mybatis 使用last_insert_id()就可以了,但为了防止同时插入多条产生的不正确的情况,还是用独立的sequence表好 全局用一个还能隐藏,不会被人猜到。 注意: 字段一定要用无符号的:bigint,以免溢出。 mysql 数据大小 int 4294967295 ,bigint 18446744073709551615 附配置文件: <table tableName="%"> <!--只生成model文件,如果mapper做过修改了就这样生成--> <!--<property name="modelOnly" value="true"/>--> <!--todo 这样的写法有问题的。因为last_insert_id()返加第一条插入的数据的id,如果一次插入多条数据,返回的id就是错的了。--> <!--所以,最好独立建一个sequence来处理,如下 参考:https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0); mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); mysql> SELECT LAST_INSERT_ID(); 表建好后不能直接用,要先建一个function,再用 select seq() 来替代 select LAST_INSERT_ID()就行了。 下面是建function步骤: 第一步drop DROP FUNCTION IF EXISTS seq 第二步:定义 delimiter $$ CREATE FUNCTION seq() RETURNS INT BEGIN DECLARE RETID int; UPDATE sequence SET id=LAST_INSERT_ID(id+1); SELECT LAST_INSERT_ID() INTO RETID ; RETURN RETID; END$$ 第三步:提交定义 delimiter ; 第五步:调用 select seq() --> <!--insert语句如果要返回自动生成的key值,一般会在insert里加入useGeneratedKeys属性,如下配置可以实现.用对象的getId()来获得数据--> <generatedKey column="id" sqlStatement="SELECT seq()" identity="true" type="post"/> <!--<generatedKey column="id" sqlStatement="SELECT LAST_INSERT_ID()" />--> </table> 参考:http://blog.haohtml.com/archives/15222 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100428.html原文链接: