“SELECT LAST_INSERT_ID 总是为1”

问题

问题是发生在从 ibatis 升级到 mybatis 出现的,代码中使用 SELECT LAST_INSERT_ID 获取自增 id,原来在 ibatis 好用的代码,升级到了 mybatis 就总是返回 1 了。

linkedkeeper_sequence 表结构如下:

CREATE TABLE `linkedkeeper_sequence` (
  `seq_name` varchar(200) NOT NULL,
  `current_value` bigint(20) NOT NULL,
  `_increment` int(4) NOT NULL,
  PRIMARY KEY (`seq_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

ibatis 中获取自增 id 的 xml:

<insert timeout="30" id="update" parameterClass="java.lang.String">
    UPDATE linkedkeeper_sequence
    SET
    current_value = LAST_INSERT_ID(current_value + _increment)
    WHERE
    seq_name = #seqname#
    <selectKey resultClass="long">
        <![CDATA[SELECT LAST_INSERT_ID() ]]>
    </selectKey>
</insert>

Dao 的代码:

public long getSeq(final String seqName) throws Exception {
    return insert("Seq.update", seqName);
}

第一次修改成 mybatis 的 xml,但总是返回 1。

<insert timeout="30" id="update" parameterType="java.lang.String">
    UPDATE linkedkeeper_sequence
    SET
    current_value = LAST_INSERT_ID(current_value + _increment)
    WHERE
    seq_name = #{seqname}
    <selectKey resultClass="long">
        <![CDATA[SELECT LAST_INSERT_ID() ]]>
    </selectKey>
</insert>

原因

在 mybatis 中,insert 之后返回的是 1 是影响的行数,并不是自增 id。

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。