mybatis-plus删除复合主键
时间: 2023-09-27 19:09:40 浏览: 293
的记录应该如何操作?
对于mybatis-plus删除复合主键的记录,可以使用Mybatis-Plus提供的封装方法deleteById。这个方法会根据传入的主键值删除对应的数据记录。如果你要删除的数据记录的主键是复合主键,那么可以使用一个定义了多个主键的Java Bean作为参数调用这个方法。具体操作可以参考Mybatis-Plus的官方文档。
相关问题
mybatis plus 设置联合主键
### MyBatis Plus 设置复合主键或联合主键的方法
在 MyBatis Plus 中,可以通过特定的注解来实现复合主键(也称为联合主键)的功能。以下是具体方法:
#### 实体类配置
对于复合主键的支持,MyBatis Plus 提供了自定义注解 `@MppMultiId` 来标识多个字段作为主键的一部分[^1]。这些字段不再使用单主键标注 `@TableId`,而是通过组合的方式形成唯一约束。
以下是一个典型的实体类示例:
```java
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.annotations.MppMultiId;
import java.io.Serializable;
@TableName("etl_job")
public class Job implements Serializable {
private static final long serialVersionUID = 1L;
@MppMultiId // 复合主键之一
private String etlSystem;
@MppMultiId // 复合主键之二
private String etlJob;
// Getter 和 Setter 方法省略...
}
```
上述代码中,`etlSystem` 和 `etlJob` 被标记为复合主键的一部分[^2]。
---
#### Mapper 接口扩展
为了支持基于复合主键的操作,Mapper 需要继承 `MppBaseMapper<T>` 类型接口,而不是普通的 `BaseMapper<T>`。这使得框架能够识别并处理多主键逻辑。
例如:
```java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.mpp.MppBaseMapper;
public interface JobMapper extends MppBaseMapper<Job> {
}
```
这里的关键在于继承了 `MppBaseMapper`,它提供了针对复合主键场景下的 CRUD 支持功能[^3]。
---
#### 数据库表结构设计
数据库中的表也需要适配这种复合主键的设计模式。通常情况下,在创建数据表时会指定两个列共同构成主键关系。例如 SQL 定义如下:
```sql
CREATE TABLE etl_job (
etl_system VARCHAR(50) NOT NULL,
etl_job VARCHAR(50) NOT NULL,
PRIMARY KEY (etl_system, etl_job)
);
```
此语句明确了 `etl_system` 和 `etl_job` 是该表的联合主键。
---
#### 使用注意事项
- **查询条件匹配**:当执行更新、删除或其他依赖于主键的操作时,必须提供完整的复合主键值集合。
- **性能优化**:确保索引合理分布以提升涉及复杂主键操作的效率。
---
mybatisplus的复合主键
### MyBatis Plus 中实现复合主键
在MyBatis Plus中处理复合主键并非直接支持的功能,因此需要通过特定的方式来进行配置和编码以满足这一需求。对于希望利用复合主键来确保数据表记录唯一性的开发者来说,了解如何设置以及操作这些实体类是非常重要的。
#### 实体类定义
为了使MyBatis Plus能够识别并正确处理具有多个字段作为联合主键的情况,在创建对应的Java实体类时,应该采用`@KeySequence`注解指定自增序列(如果适用),更重要的是要重写equals() 和hashCode() 方法以便框架可以依据这两个方法判断对象是否相同[^1]。
```java
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
@Data
public class CompositePrimaryKeyEntity {
@TableId(type = IdType.NONE)
private String idPartOne;
@TableId(type = IdType.NONE)
private Integer idPartTwo;
// Other fields...
@Override
public boolean equals(Object o){
if (this == o) return true;
if (!(o instanceof CompositePrimaryKeyEntity)) return false;
final CompositePrimaryKeyEntity that = (CompositePrimaryKeyEntity)o;
return Objects.equals(idPartOne,that.idPartOne)&&Objects.equals(idPartTwo,that.idPartTwo);
}
@Override
public int hashCode(){
return Objects.hash(idPartOne,idPartTwo);
}
}
```
上述代码片段展示了如何在一个名为 `CompositePrimaryKeyEntity` 的实体类中声明两个属性作为组合主键的一部分,并实现了必要的逻辑以供MyBatis Plus使用。
#### Mapper接口编写
当涉及到CRUD操作时,Mapper层也需要做一些调整。通常情况下可以直接继承BaseMapper<T> 接口即可获得基本功能;但对于含有复杂条件查询或更新删除语句,则可能还需要额外定制SQL映射文件或者扩展Mapper接口的方法签名[^2]。
```xml
<!-- resources/mapper/CompositePrimaryKeyEntityMapper.xml -->
<mapper namespace="com.example.mapper.CompositePrimaryKeyEntityMapper">
<!-- 自定义 SQL 查询或其他复杂的 CRUD 操作 -->
</mapper>
```
同时,在Mapper接口中可以通过覆写默认行为或是增加新的API来适应具体的业务需求:
```java
package com.example.mapper;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.CompositePrimaryKeyEntity;
/**
* 继承 BaseMapper 并提供针对复合主键的支持.
*/
@Mapper
public interface CompositePrimaryKeyEntityMapper extends BaseMapper<CompositePrimaryKeyEntity> {
/**
* 根据复合主键查找单条记录.
*
* @param partOne 主键部分一
* @param partTwo 主键部分二
* @return 单个实体实例
*/
default Optional<CompositePrimaryKeyEntity> selectByIds(String partOne,Integer partTwo){
LambdaQueryWrapper<CompositePrimaryKeyEntity> wrapper=new QueryWrapper<>();
wrapper.eq(CompositePrimaryKeyEntity::getIdPartOne,partOne).eq(CompositePrimaryKeyEntity::getIdPartTwo,partTwo);
return Optional.ofNullable(selectOne(wrapper));
}
// 更多功能...
}
```
此段落描述了怎样基于已有组件构建适用于带有复合主键特性的持久化层访问接口。
阅读全文
相关推荐














