MyBatis 中 ResultMap 的高级用法指南

分类: 365bet娱乐场官网注册 2025-07-10 13:41:20 作者: admin

🏆本文收录于「滚雪球学SpringBoot」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。

@TOC

📝 前言:为何使用 ResultMap?

在 MyBatis 中,ResultMap 是用于映射查询结果与 Java 对象之间关系的工具。虽然 MyBatis 支持 resultType 的简单映射方式,但当涉及到复杂映射需求(如字段名不匹配、嵌套对象、多表查询)时,ResultMap 提供了更灵活、更强大的解决方案。

本指南将深入探讨 ResultMap 的高级用法,包括别名映射、嵌套结果映射、多表联合查询映射等。

📖 目录

🧩 基础回顾:ResultMap 的基本使用

🔄 字段名与属性名不一致的映射

🌐 嵌套结果映射:一对一映射

📚 嵌套集合映射:一对多映射

⚙️ 多表联合查询映射

✨ 高级技巧:动态结果映射与继承

🧩 基础回顾:ResultMap 的基本使用

ResultMap 是在 MyBatis 配置文件中定义的,用于描述 SQL 查询结果如何映射到 Java 对象。

示例:基础 ResultMap

数据库表结构:

假设我们有一张 user 表:

CREATE TABLE user (

id INT PRIMARY KEY,

username VARCHAR(50),

email VARCHAR(100)

);

对应的 Java 类:

public class User {

private Integer id;

private String username;

private String email;

// Getter 和 Setter 略

}

ResultMap 定义:

在 MyBatis 的 XML 映射文件中,定义如下:

SQL 查询:

🔄 字段名与属性名不一致的映射

在实际项目中,数据库字段名可能与 Java 属性名不一致,此时需要使用 ResultMap 显式指定映射关系。

场景:字段名不一致

数据库表:

CREATE TABLE user (

id INT PRIMARY KEY,

user_name VARCHAR(50), -- 注意:字段名是 user_name

user_email VARCHAR(100) -- 注意:字段名是 user_email

);

对应的 Java 类:

public class User {

private Integer id;

private String username; // Java 属性名为 username

private String email; // Java 属性名为 email

// Getter 和 Setter 略

}

ResultMap 映射:

🌐 嵌套结果映射:一对一映射

ResultMap 支持将查询结果嵌套映射到关联对象(如外键关联)。

场景:用户关联地址信息

数据库表:

CREATE TABLE user (

id INT PRIMARY KEY,

username VARCHAR(50),

address_id INT

);

CREATE TABLE address (

id INT PRIMARY KEY,

street VARCHAR(100),

city VARCHAR(50)

);

Java 类:

public class Address {

private Integer id;

private String street;

private String city;

// Getter 和 Setter 略

}

public class User {

private Integer id;

private String username;

private Address address; // 嵌套对象

// Getter 和 Setter 略

}

ResultMap 映射:

SQL 查询:

📚 嵌套集合映射:一对多映射

ResultMap 支持将查询结果映射到嵌套的集合(如一对多关系)。

场景:用户与订单

数据库表:

CREATE TABLE user (

id INT PRIMARY KEY,

username VARCHAR(50)

);

CREATE TABLE orders (

id INT PRIMARY KEY,

user_id INT,

order_name VARCHAR(100)

);

Java 类:

public class Order {

private Integer id;

private String orderName;

// Getter 和 Setter 略

}

public class User {

private Integer id;

private String username;

private List orders; // 嵌套集合

// Getter 和 Setter 略

}

ResultMap 映射:

SQL 查询:

⚙️ 多表联合查询映射

在复杂的多表联合查询中,可以通过 ResultMap 将多张表的数据映射到多个对象中。

场景:用户关联角色与权限

数据库表:

CREATE TABLE user (

id INT PRIMARY KEY,

username VARCHAR(50)

);

CREATE TABLE role (

id INT PRIMARY KEY,

role_name VARCHAR(50)

);

CREATE TABLE permission (

id INT PRIMARY KEY,

permission_name VARCHAR(50)

);

CREATE TABLE user_role (

user_id INT,

role_id INT

);

CREATE TABLE role_permission (

role_id INT,

permission_id INT

);

Java 类:

public class Permission {

private Integer id;

private String permissionName;

// Getter 和 Setter 略

}

public class Role {

private Integer id;

private String roleName;

private List permissions;

// Getter 和 Setter 略

}

public class User {

private Integer id;

private String username;

private List roles;

// Getter 和 Setter 略

}

ResultMap 映射:

SQL 查询:

✨ 高级技巧:动态结果映射与继承

1️⃣ 动态结果映射

使用动态 SQL(如 )控制字段映射的动态性。

2️⃣ ResultMap 继承

通过 extends 关键字继承已有的 ResultMap,避免重复定义。

💡 总结与最佳实践

使用 ResultMap 时,优先考虑字段的映射一致性,减少额外的配置工作。

对于复杂的嵌套对象和多表查询,分层定义 ResultMap,提高代码的可读性和复用性。

利用动态 SQL 和 ResultMap 继承,处理动态需求和减少冗余配置。

通过灵活运用 MyBatis 的 ResultMap,你可以轻松实现复杂的对象映射需求,从而让数据与业务模型无缝对接!🚀✨

🧧福利赠与你🧧

无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-