mybatis 实体映射联合主键
时间: 2025-05-20 18:46:17 浏览: 21
### MyBatis 中实体类联合主键映射配置
在 MyBatis 的实际应用中,当数据库表设计采用复合主键(即多个字段共同构成主键)时,可以通过 `resultMap` 和自定义 Java 类的方式实现实体类的映射。以下是具体的配置方式和示例。
#### 1. 自定义实体类
为了支持联合主键,通常会创建一个专门用于表示主键的对象。该对象可以作为实体类的一个属性。例如:
```java
public class CompositeKey {
private Integer keyPartOne;
private Integer keyPartTwo;
// Getters and Setters
}
public class EntityWithCompositeKey {
private CompositeKey id; // 主键部分
private String otherField;
// Getters and Setters
}
```
通过这种方式,将联合主键封装到单独的类中,便于管理和维护[^1]。
#### 2. Mapper XML 文件配置
在 MyBatis 的 Mapper 配置文件中,使用 `<resultMap>` 定义复杂的结果集映射关系。对于联合主键的情况,需指定主键的部分以及非主键字段的映射规则。以下是一个完整的示例:
```xml
<mapper namespace="example.EntityMapper">
<!-- resultMap 定义 -->
<resultMap type="EntityWithCompositeKey" id="entityResultMap">
<!-- 复合主键映射 -->
<association property="id" javaType="CompositeKey">
<result column="key_part_one" property="keyPartOne"/>
<result column="key_part_two" property="keyPartTwo"/>
</association>
<!-- 其他字段映射 -->
<result column="other_field" property="otherField"/>
</resultMap>
<!-- 查询语句 -->
<select id="selectByKeys" parameterType="map" resultMap="entityResultMap">
SELECT *
FROM example_table
WHERE key_part_one = #{keyPartOne} AND key_part_two = #{keyPartTwo}
</select>
</mapper>
```
在此配置中,`<association>` 标签被用来处理嵌套对象的关系,即将联合主键分解为其组成部分并分别映射至相应的数据库列[^2]。
#### 3. Spring Boot 环境下的简化配置
如果是在 Spring Boot 项目中,则可以直接利用其自动装配功能完成类似的设置。只需确保 `@MapperScan` 注解已正确定位到 Mapper 接口所在的包路径即可。此外,在某些场景下也可以借助注解形式减少 XML 文件的工作量,不过针对复杂的联合主键情况,推荐仍然保留 XML 方式的灵活性[^3]。
```java
@Mapper
public interface EntityMapper {
@Select("SELECT * FROM example_table WHERE key_part_one = #{keyPartOne} AND key_part_two = #{keyPartTwo}")
@Results({
@Result(property = "id.keyPartOne", column = "key_part_one"),
@Result(property = "id.keyPartTwo", column = "key_part_two"),
@Result(property = "otherField", column = "other_field")
})
EntityWithCompositeKey selectByKeys(@Param("keyPartOne") Integer keyPartOne, @Param("keyPartTwo") Integer keyPartTwo);
}
```
以上代码展示了基于注解的方式来替代传统的 XML 映射,适用于较为简单的业务逻辑需求。
---
阅读全文
相关推荐

















