博主介绍:✌全网粉丝24W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌
技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。
感兴趣的可以先关注收藏起来,在工作中、生活上等遇到相关问题都可以给我留言咨询,希望帮助更多的人。
技术扩展 :最近发现了一个特别好用的人工智能学习网站,通俗易懂,风趣幽默,忍不住想分享一下给大家,进入传送门:https://www.captainbed.cn/no8g/。
SpringBoot3 + 人大金仓 V8+MyBatis-Plus 获取新增自增 ID
- 一、核心配置(主键自增回显)
-
- [1.1 实体类主键注解](#1.1 实体类主键注解)
- [1.2 application.yml 数据源](#1.2 application.yml 数据源)
- [二、插入后直接获取 ID](#二、插入后直接获取 ID)
-
- [2.1 方式 1:mapper.insert 直接拿 ID](#2.1 方式 1:mapper.insert 直接拿 ID)
- [2.2 方式 2:service 层调用(常用)](#2.2 方式 2:service 层调用(常用))
- [三、 关键说明](#三、 关键说明)
- 四、依赖参考
- 五、扩展
-
- [5.1 在xml中使用useGeneratedKeys=true无效](#5.1 在xml中使用useGeneratedKeys=true无效)
- [5.2 其他可能产生问题的原因](#5.2 其他可能产生问题的原因)
-
- [5.2.1 没写 keyColumn](#5.2.1 没写 keyColumn)
- [5.2.2 表不是自增主键](#5.2.2 表不是自增主键)
- [5.2.3 实体类注解冲突](#5.2.3 实体类注解冲突)
- [5.2.4 全局配置被覆盖](#5.2.4 全局配置被覆盖)
一、核心配置(主键自增回显)
1.1 实体类主键注解
金仓数据库自增主键配置:
bash
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
public class Entity {
// 金仓自增序列主键,插入后自动回填ID
@TableId(type = IdType.AUTO)
private Long id;
}
1.2 application.yml 数据源
bash
yaml
spring:
datasource:
driver-class-name: com.kingbase8.Driver
url: jdbc:kingbase8://127.0.0.1:54321/dbname
username: system
password: password
mybatis-plus:
configuration:
# 开启主键回填
use-generated-keys: true
二、插入后直接获取 ID
2.1 方式 1:mapper.insert 直接拿 ID
bash
// 新建实体
User user = new User();
user.setName("测试");
// 插入数据
int rows = userMapper.insert(user);
// 插入成功后,实体自动赋值主键ID
Long newId = user.getId();
2.2 方式 2:service 层调用(常用)
bash
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public Long saveUser(User user) {
userMapper.insert(user);
// 直接返回回填ID
return user.getId();
}
}
三、 关键说明
- 金仓表必须设置主键自增:
id bigserial primary key IdType.AUTO适配人大金仓自增主键- 插入成功后原实体对象自动回填 ID,无需额外查询
- SpringBoot3 + Kingbase8 驱动依赖正常引入即可生效
四、依赖参考
bash
<!-- 人大金仓驱动 -->
<dependency>
<groupId>cn.com.kingbase</groupId>
<artifactId>kingbase8</artifactId>
<version>8.6.0</version>
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
五、扩展
5.1 在xml中使用useGeneratedKeys=true无效
XML 正确写法(KingbaseV8 可用)
bash
<insert id="insert" parameterType="com.example.User"
useGeneratedKeys="true"
keyProperty="id" <!-- 实体类属性 -->
keyColumn="id"> <!-- 数据库列名,Kingbase/PG 必须写 -->
INSERT INTO user (name) VALUES (#{name})
</insert>
useGeneratedKeys="true":开启 JDBC 回填主键keyProperty="id":回填到实体的 id 字段keyColumn="id":Kingbase/PG 必须指定,否则可能拿不到
5.2 其他可能产生问题的原因
5.2.1 没写 keyColumn
MySQL 可省略,但 Kingbase/PG 必须写 keyColumn,否则驱动不返回主键。
5.2.2 表不是自增主键
KingbaseV8 要这样建表:
bash
-- 方式1:SERIAL(底层绑定序列)
CREATE TABLE user (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
-- 方式2:IDENTITY(推荐,V8/V9 支持)
CREATE TABLE user (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
name VARCHAR(50)
);
没绑定序列 IDENTITY,useGeneratedKeys 肯定无效。
5.2.3 实体类注解冲突
用了 MP 的 @TableId(type = IdType.NONE) 或 INPUT,会覆盖 XML 行为,导致不回填。
正确写法:
bash
@TableId(type = IdType.AUTO) // 适配数据库自增
private Long id;
5.2.4 全局配置被覆盖
application.yml 里的 mybatis-plus.configuration.use-generated-keys=true 对 XML 无效,XML 必须自己写 useGeneratedKeys。
- XML 中
useGeneratedKeys对 Kingbase 有效,但必须配合keyColumn - 最稳组合:
IdType.AUTO + XML三属性齐全(useGeneratedKeys+keyProperty+keyColumn)。 - 不想写 XML:直接用 MP 的 insert 方法,零配置即可回填。
好了,今天分享到这里。希望你喜欢这次的探索之旅!不要忘记 "点赞" 和 "关注" 哦,我们下次见!🎈
本文完结!
祝各位大佬和小伙伴身体健康,万事如意,发财暴富,扫下方二维码与我一起交流!!!