功能篇:mybatis 插入数据并且返回Id

news/2025/1/11 1:14:10 标签: java

在使用 MyBatis 框架插入数据并返回新插入记录的主键(通常是Id)时,可以通过以下几种方式来实现。

 

### 1. 使用 `<insert>` 元素的 `useGeneratedKeys` 和 `keyProperty` 属性

 

如果数据库支持自动生成主键(例如 MySQL 的 `AUTO_INCREMENT`),那么可以在 MyBatis 的映射文件中设置 `<insert>` 元素的 `useGeneratedKeys` 属性为 `true` 并指定 `keyProperty` 属性为实体类中的属性名。这样 MyBatis 就会使用 JDBC 的 `getGeneratedKeys` 方法来获取插入后的主键值,并将其赋给实体对象。

 

#### 示例:

 

```xml

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">

    INSERT INTO users (username, password)

    VALUES (#{username}, #{password})

</insert>

```

 

在这个例子中,假设 `users` 表有一个自增的 `id` 字段,MyBatis 会在插入操作完成后自动将生成的 `id` 值设置到传入的对象中对应的 `id` 属性上。

 

### 2. 使用 `selectKey` 元素

 

对于不支持自动生成主键的数据库,或者你需要在插入之前就确定主键的情况,可以使用 `<selectKey>` 元素来明确地定义如何获取主键值。`<selectKey>` 可以配置在 `<insert>` 语句内部,并且需要指明结果应该存储到实体对象的哪个属性中。

 

#### 示例:

 

```xml

<insert id="insertUser">

    <selectKey keyProperty="id" resultType="int" order="BEFORE">

        SELECT SEQ_USER.NEXTVAL AS id FROM dual

    </selectKey>

    INSERT INTO users (id, username, password)

    VALUES (#{id}, #{username}, #{password})

</insert>

```

 

在这个例子中,`SEQ_USER` 是一个序列对象,它用来生成新的主键值。`order="BEFORE"` 表示在执行插入语句之前先执行这个查询来获取主键值。

 

### 注意事项

 

- 确保你的数据库和表结构支持你所选择的获取主键的方法。

- 如果是使用 `useGeneratedKeys`,则确保数据库驱动程序支持此功能。

- 当使用 `selectKey` 时,注意它的 `order` 属性,这决定了是在插入前还是插入后执行获取主键的语句。

- 在 Java 代码中调用插入方法时,记得传递一个可变的参数对象(如 Java Bean 或 Map),以便它可以接收返回的主键值。

 

以上就是利用 MyBatis 插入数据并返回主键 Id 的基本方法。根据你的具体需求和技术栈的不同,可能还需要做一些额外的配置或调整。


http://www.niftyadmin.cn/n/5819275.html

相关文章

flask-admin 在modelview 默认视图下重写create_model_actions来实现列表数据的批量处理actions

背景&#xff1a; 在使用flask-admin 中modelview默认的视图时&#xff0c;有时需要扩展额外的action来实现特定效果&#xff0c;如添加基于列表的批量处理事件。 材料&#xff1a; 略 制作&#xff1a; 先来效果&#xff1a; 再上代码&#xff1a; # 通过重写create_mode…

银河麒麟服务器操作系统桌面任务栏网络图标消失问题

前段时间在银河麒麟系统上遇到一些问题&#xff0c;服务器上桌面任务栏上的网络图标消失了&#xff0c;网络连接也打不开&#xff0c;最后使用nmtui命令才打开了网络连接配置界面&#xff0c;并成功连接到网络。&#xff08;我的系统&#xff1a;Kylin Advanced Server V10 SP3…

2025 最新React面试题

1、组件通信的方式 父组件传子组件&#xff1a;通过props 的方式 子组件传入父组件&#xff1a;父组件将自身函数传入&#xff0c;子组件调用该函数&#xff0c;父组件在函数中拿到子组件传递的数据 兄弟组件通信&#xff1a;找到共同的父节点&#xff0c;用父节点转发进行通…

C语言——文件IO 【文件IO和标准IO区别,操作文件IO】open,write,read,dup2,access,stat

1.思维导图 2.练习 1&#xff1a;使用C语言编写一个简易的界面&#xff0c;界面如下 1&#xff1a;标准输出流 2&#xff1a;标准错误流 3&#xff1a;文件流 要求&#xff1a;按1的时候&#xff0c;通过printf输出数据&#xff0c;按2的时候&#xff0c;通过p…

初学stm32 --- ADC单通道采集

目录 ADC寄存器介绍&#xff08;F1&#xff09; ADC控制寄存器 1(ADC_CR1) ADC控制寄存器 2(ADC_CR2) ADC采样时间寄存器1(ADC_SMPR1) ADC采样时间寄存器2(ADC_SMPR2) ADC规则序列寄存器 1(ADC_SQR1) ADC规则序列寄存器 2(ADC_SQR2) ADC规则序列寄存器 3(ADC_SQR3) AD…

ZYNQ初识10(zynq_7010)UART通信实验

基于bi站正点原子讲解视频&#xff1a; 系统框图&#xff08;基于串口的数据回环&#xff09;如下&#xff1a; 以下&#xff0c;是串口接收端的波形图&#xff0c;系统时钟和波特率时钟不同&#xff0c;为异步时钟&#xff0c;&#xff0c;需要先延时两拍&#xff0c;将时钟同…

【集成学习】Boosting算法详解

文章目录 1. 集成学习概述2. Boosting算法详解3. Gradient Boosting算法详解3.1 基本思想3.2 公式推导 4. Python实现 1. 集成学习概述 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过结合多个模型的预测结果来提高整体预测性能的技术。相比于单个模型&#xf…

关于easyui select多选下拉框重置后多余显示了逗号

问题 select选项卡回显&#xff0c;再次选择时&#xff0c;最前面多余了逗号。 分析&#xff1a; 这里主要问题是 var likes; $("#formDiv").form(clear); $("#like").combobox("setValues",likes); $("#formDiv").dialog("o…