news 2026/8/31 19:42:52

MyBatis中表和实体类的映射

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MyBatis中表和实体类的映射

MyBatis 表 ↔ 实体类映射

数据库表字段(下划线user_name),Java 实体属性(驼峰userName)。

两种方案:自动映射手动 resultMap 映射

表:t_user

| id | user_name | user_age | dept_id |

|----|-----------|----------|---------|

| 1 | 张三 | 22 | 1001 |

实体 User.java

public class User { private Long id; private String userName; private Integer userAge; private Long deptId; // getter setter }

一、自动映射(resultType)

MyBatis 自动映射规则:列名和实体属性完全一样就自动赋值

情况 1:数据库下划线,实体驼峰(最常见业务场景)

开启全局配置:下划线转驼峰,不需要写任何映射,直接用resultType

yml 配置

mybatis: configuration: map-underscore-to-camel-case: true
  • 数据库列user_name→ Java 属性userName
  • 数据库列user_age→ Java 属性userAge

mapper xml

<select id="selectAll" resultType="com.entity.User"> select id,user_name,user_age,dept_id from t_user </select>

✅ 查询结果自动封装 User 对象。

⚠️注意:这个配置只作用于resultType,同样也对resultMap生效。

情况 2:字段名字完全一致(不推荐数据库这样设计)

数据库列userName,实体属性userName,不需要开启配置,直接自动映射。

自动映射失效场景

  1. 没有开启下划线转驼峰,数据库下划线,实体驼峰 → 属性为 null
  2. sql 查询的列名和实体属性名完全不匹配
  3. 多表关联查询、嵌套对象、一对一 / 一对多,自动映射搞不定,必须resultMap

二、手动映射 resultMap(核心重点)

适用场景:

  1. 数据库列名和实体属性差异很大
  2. 一对一、一对多关联查询
  3. 需要指定主键、typeHandler 自定义类型处理
  4. 不想开启全局下划线转驼峰配置

基础语法

<!-- type:实体全类名 / 别名;id:resultMap唯一标识 --> <resultMap id="userResultMap" type="com.entity.User"> <!-- <id> 映射主键字段,提升MyBatis解析性能,主键一定要写 --> <id column="id" property="id"/> <!-- column:sql查询出来的列名;property:实体类属性名 --> <result column="user_name" property="userName"/> <result column="user_age" property="userAge"/> <result column="dept_id" property="deptId"/> </resultMap> <!-- 使用resultMap,不要写resultType --> <select id="selectUser" resultMap="userResultMap"> select id,user_name,user_age,dept_id from t_user where id=#{id} </select>

关键点:columnSQL 查询返回的列名,不是原始表字段名! 如果写了别名select user_name as uname,那 column 就要写uname

别名示例

<select id="selectUser" resultMap="userResultMap"> select id,user_name as uname from t_user </select> <resultMap id="userResultMap" type="User"> <id column="id" property="id"/> <result column="uname" property="userName"/> </resultMap>

三、一对一关联映射(association)

User 里面包含 Dept 对象

public class User { private Long id; private String userName; private Dept dept; // 一对一 } public class Dept { private Long deptId; private String deptName; }

方式 1:联合查询,一次 SQL(业务常用)

<resultMap id="userDeptMap" type="User"> <id column="u_id" property="id"/> <result column="user_name" property="userName"/> <!-- association:一对一对象映射 property=实体属性名 javaType=对象类型 --> <association property="dept" javaType="Dept"> <id column="d_id" property="deptId"/> <result column="dept_name" property="deptName"/> </association> </resultMap> <select id="getUser" resultMap="userDeptMap"> select u.id u_id, u.user_name, d.id d_id, d.dept_name from t_user u left join t_dept d on u.dept_id = d.id where u.id=#{id} </select>

方式 2:嵌套查询(多 SQL,会产生 N+1 问题)

<resultMap id="userDeptMap" type="User"> <id column="id" property="id"/> <result column="user_name" property="userName"/> <!-- select:调用另外一个mapper方法;column:传给子查询的参数 --> <association property="dept" javaType="Dept" select="com.mapper.DeptMapper.selectById" column="dept_id"/> </resultMap>

注意 N+1 问题:查询 N 条用户,会额外发起 N 次查询部门,大数据量禁止。

四、一对多关联映射(collection)

一个用户多个订单,User 中存放 List<Order> orderList

public class User { private Long id; private String userName; private List<Order> orderList; //一对多 } public class Order{ private Long orderId; private String orderNo; }
<resultMap id="userOrderMap" type="User"> <id column="u_id" property="id"/> <result column="user_name" property="userName"/> <!-- collection:集合映射,ofType集合里面元素类型 --> <collection property="orderList" ofType="Order"> <id column="o_id" property="orderId"/> <result column="order_no" property="orderNo"/> </collection> </resultMap> <select id="getUserOrder" resultMap="userOrderMap"> select u.id u_id, u.user_name, o.id o_id, o.order_no from t_user u left join t_order o on u.id = o.user_id where u.id=#{id} </select>

ofType:集合泛型里面的实体类型,不是写 List。

五、resultMap 复用:extends 继承

<!--基础resultMap --> <resultMap id="baseUserMap" type="User"> <id column="id" property="id"/> <result column="user_name" property="userName"/> </resultMap> <!--继承上面,追加字段,不用重复写 --> <resultMap id="userWithDeptMap" extends="baseUserMap" type="User"> <association property="dept" javaType="Dept"> <id column="d_id" property="deptId"/> </association> </resultMap>

六、常见坑

  1. resultTyperesultMap二选一,不能同时写
  2. column是查询出来的列名,不是表原始字段,注意 sql 别名
  3. 下划线转驼峰只对 resultType 生效,resultMap 不受影响,resultMap 需要手动写 column-property
  4. <association>javaType<collection>ofType,不要搞混
  5. 嵌套子查询容易 N+1,生产尽量用left join 单 sql
  6. 实体属性大小写严格区分,property 必须和实体 getter/setter 对应
  7. 主键尽量写<id/>标签,MyBatis 内部缓存、去重依赖主键,不写会出现重复对象

自动映射 vs resultMap 选型

表格

方案适用场景
resultType + 下划线驼峰配置单表简单查询,字段一一对应
resultMap字段名差异、一对一、一对多、复杂关联查询

补充:MyBatis‑Plus 封装了实体注解@TableName@TableField,底层也是生成 mybatis 的映射逻辑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 19:42:01

网易Android校招笔试题解析:从Handler到Binder的核心考点

很多准备校招的朋友问我要过网易的Android笔试题&#xff0c;说实话2018年的卷子放到今天来看&#xff0c;核心考察点依然没怎么变&#xff0c;只是技术栈换了几层皮。这份卷子最大的价值不在于题目本身&#xff0c;而在于它透露出的出题逻辑&#xff1a;网易这类一线互联网公司…

作者头像 李华
网站建设 2026/8/31 19:41:05

FPGA双游戏系统设计实战:VGA显示与碰撞检测的Verilog实现

简介&#xff1a;本资源是面向高校电子信息类专业课程设计与FPGA创新实践的双游戏系统完整实现方案&#xff0c;适用于具备数字电路基础的本科生及工程技术人员&#xff0c;解决FPGA图形显示、实时交互与物理建模等典型教学难点。压缩包共50个文件&#xff0c;含8个Verilog源码…

作者头像 李华
网站建设 2026/8/31 19:38:39

网易有道校招笔试题解析:算法、系统设计与备考策略

每年八九月份&#xff0c;各大互联网公司的校招笔试就陆续开始了。网易的题向来以“活”著称&#xff0c;尤其是有道事业部&#xff0c;毕竟手底下有词典、云笔记、翻译、AI教育这些产品线&#xff0c;笔试题目往往不光是考算法&#xff0c;还会结合真实业务场景来出题。今天就…

作者头像 李华
网站建设 2026/8/31 19:36:11

基于EDS安检X光数据集的目标检测实战:从数据解析到YOLOv8模型部署

简介&#xff1a;本资源是面向计算机视觉算法工程师与智能安防领域开发者的X光危险物品检测专用数据集&#xff0c;专为机场、火车站等场景的安检系统落地而设计&#xff0c;解决小目标、重叠物、金属遮挡下的高精度识别难题。压缩包共14155个文件&#xff0c;含4718张高质量X光…

作者头像 李华
网站建设 2026/8/31 19:32:28

iPad零电脑零越狱运行MC Java版:Fabric与Iris完整接入指南

iPhone、iPad 用户想玩《我的世界》Java 版&#xff0c;过去基本绕不开一条路&#xff1a;找一台电脑&#xff0c;下载启动器、配置 Java、装 Mod&#xff0c;再想办法把游戏塞进移动设备。更麻烦的是&#xff0c;iOS 系统对动态代码执行限制严格&#xff0c;早期方案要么依赖越…

作者头像 李华
网站建设 2026/8/31 19:30:24

AI代理0Day漏洞入侵实战复盘:沙箱逃逸与奖励黑客防御方案

2026年7月发生的OpenAI AI代理入侵HuggingFace生产环境事件&#xff0c;是人工智能安全领域具备里程碑意义的真实实战案例。这是全球首例完全由AI自主驱动、无人类干预、自主挖掘零日漏洞、突破隔离沙箱、横向渗透外网生产系统的网络攻击事件。不同于过往人工操控AI辅助攻击的演…

作者头像 李华