mybatis连接mysql删除多条数据时返回被删除的数据的主键
时间: 2024-10-09 14:15:31 浏览: 52
在MyBatis中,当你需要删除多行MySQL数据并且同时获取被删除记录的主键时,通常不会直接通过Delete操作返回具体的主键。因为Delete主要是用于数据库级别的批量删除,并不是设计用于查询结果。
不过,你可以结合事务和自增ID的方式来实现这个需求。首先,在执行Delete语句前,你可以开启一个事务;然后执行Delete操作;接着,如果需要返回被删除记录的主键,可以选择在事务提交之前执行一次查询,条件是你知道刚刚删除的数据的范围,比如通过删除时间戳或者其他唯一标识。
例如,你可以在`<delete>`标签中加入一个`selectKey`属性,指定在删除后立即执行一个SELECT语句获取主键:
```xml
<delete id="deleteWithGeneratedKeys" parameterType="map">
DELETE FROM your_table WHERE condition
<selectKey resultType="int" order="BEFORE">
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'your_table'
</selectKey>
</delete>
```
但是请注意,这种方式并不是MyBatis的原生特性,而是通过SQL Server特有的语法或特定数据库系统实现的,其他数据库可能不支持或有差异。
相关问题
mybatis插入多条数据获取自增主键
### 使用 MyBatis 进行批量插入并获取自增主键
为了实现通过 MyBatis 插入多条记录的同时获取每一条记录对应的自增主键 ID,需遵循特定配置与编码实践。
#### 环境准备
确保所使用的 MyBatis 版本不低于 3.3.1[^2]。较低版本可能不具备此功能的支持。
#### Mapper XML 文件配置
在 `mapper.xml` 中定义 SQL 映射语句时,应加入如下属性来启用自动生成的键值返回:
```xml
<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO table_name (column_list)
VALUES
<foreach collectioncolumn2})
</foreach>
</insert>
```
上述代码片段展示了如何利用 `<foreach>` 标签遍历传入的对象集合,并为每一项构建相应的插入子句;同时设置了 `useGeneratedKeys=true` 及指定了用于接收新生成 ID 的对象属性名 `keyProperty="id"`。
#### Java 接口设计
对应于上面的映射文件,在接口层面上声明相应的方法签名,注意这里只接受单一参数即待插入的数据集数组或列表形式传递给 DAO 层处理:
```java
public interface UserMapper {
int batchInsert(@Param("list") List<User> userList);
}
```
值得注意的是,尽管执行批处理操作,但该方法仍然保持简单整数类型的返回值表示受影响行的数量而非直接返回包含所有新增 ID 的列表。
#### 实体类调整
如果表中的自动增长列名称与实体类成员变量命名存在差异,则应在 mapper xml 设置额外两个属性:`keyColumn` 和 `keyProperty` 来建立两者之间的关联关系。
例如对于 MySQL 表内名为 `user_id` 而实体类里叫作 `userId` 的情况可以这样指定:
```xml
<insert id="batchInsertUserWithDifferentIdName"
useGeneratedKeys="true"
keyColumn="user_id"
keyProperty="userId">
<!-- ... -->
</insert>
```
#### 测试验证
最后编写单元测试案例调用上述服务完成实际业务逻辑检验整个流程是否正常工作以及确认确实能够取得预期的结果集——也就是各个被插入记录各自的唯一标识符。
mybatis insert into select 返回多条主键
### 使用 MyBatis 执行 `INSERT INTO SELECT` 并返回多个自增主键
当使用 MyBatis 对数据库执行批量插入操作,特别是通过 `INSERT INTO SELECT` 形式的语句时,如果需要获取新插入记录的自增主键值,则需特别注意配置和实现细节。
对于 MySQL 数据库而言,由于其支持单次多行插入并能返回所有生成的主键ID列表,因此可以通过特定的方式捕获这些值。然而,在默认情况下,MyBatis 的 `<selectKey>` 或者 `useGeneratedKeys=true` 参数仅适用于简单的单条插入场景[^1]。
为了处理更复杂的 `INSERT INTO SELECT` 场景下的主键回显需求:
#### 方法一:利用存储过程或函数
可以考虑编写一个存储过程或者用户定义函数来完成这一任务,并在其中调用相应的 SQL 逻辑以及收集产生的 ID 值。接着可以在 Mapper XML 文件里声明对该存储过程/函数的调用接口。
```xml
<update id="batchInsertWithIds" parameterType="map">
CALL batch_insert_and_get_ids(
#{sourceTable, jdbcType=VARCHAR},
#{targetColumns, jdbcType=VARCHAR},
#{resultProperty, mode=OUT, javaType=list, jdbcType=CURSOR, resultMap=idResultMap}
)
</update>
```
这里假设有一个名为 `idResultMap` 的映射用于解析游标中的每一项作为单独的结果集成员。
#### 方法二:借助 JDBC Batch API 和 Last Insert Ids
另一种解决方案是手动控制整个批处理流程,即先准备一批待插入的数据集合,再逐一遍历它们并通过 Java 代码配合 PreparedStatement 来提交事务,最后读取每次插入后的最后一个插入 ID(last inserted id)。需要注意的是这种方法可能效率较低且依赖于具体的驱动程序特性。
```java
public List<Long> performBatchInsertAndGetIds(List<Item> items) {
String sql = "INSERT INTO target_table (col1, col2,...) VALUES (?, ?, ...)";
try(Connection conn = dataSource.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS)) {
for(Item item : items){
// 设置参数...
pstmt.addBatch();
}
int[] updateCounts = pstmt.executeBatch();
ResultSet rs = pstmt.getGeneratedKeys();
List<Long> generatedIdList = new ArrayList<>();
while(rs.next()){
Long id = rs.getLong(1);
generatedIdList.add(id);
}
return generatedIdList;
} catch(SQLException e){
throw new RuntimeException(e.getMessage(),e);
}
}
```
上述例子展示了如何在一个循环内填充预编译语句并将之加入批次队列中去,之后一次性发送给服务器端执行;紧接着访问由 `getGeneratedKeys()` 提供的结果集以提取每一个被创建出来的唯一标识符[^4]。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)