当前位置: 首页 > news >正文

MyBatis 字段映射

引言

在使用 MyBatis 进行数据库操作时,数据库字段名(如下划线命名delete_flag)与 Java 实体类属性名(驼峰命名deleteFlag)之间的映射是一个常见问题。本文将介绍三种解决方案:手动@Results映射、可复用的@Results(id)映射以及全局驼峰命名配置。

首先,我们定义一个实体类UserInfo,后续所有示例都基于这个类:

publicclassUserInfo{privateIntegerid;privateStringusername;privateStringpassword;privateIntegerage;privateStringgender;privateStringphone;privateIntegerdeleteFlag;// 数据库字段 delete_flagprivateDatecreateTime;// 数据库字段 create_timeprivateDateupdateTime;// 数据库字段 update_time// getter / setter 省略}

手动 @Results 映射

最直接的方式是在每个查询方法上使用@Results注解,手动指定字段映射关系。

@MapperpublicinterfaceUserInfoMapper{@Results({@Result(column="delete_flag",property="deleteFlag"),@Result(column="create_time",property="createTime"),@Result(column="update_time",property="updateTime")})@Select("select * from user_info")List<UserInfo>selectAll();// 另一个查询方法,需要重复写一遍 @Results@Results({@Result(column="delete_flag",property="deleteFlag"),@Result(column="create_time",property="createTime"),@Result(column="update_time",property="updateTime")})@Select("select * from user_info where id = #{id}")UserInfoselectById(Integerid);}

可复用的 @Results(id) 映射

为了解决重复代码问题,MyBatis 允许为@Results注解指定一个id,其他方法可以通过@ResultMap引用该映射。

@MapperpublicinterfaceUserInfoMapper{@Results(id="BaseMap",value={@Result(column="delete_flag",property="deleteFlag"),@Result(column="create_time",property="createTime"),@Result(column="update_time",property="updateTime")})@Select("select * from user_info")List<UserInfo>selectAll();// 直接引用上面定义的 BaseMap,无需重复写 @Results@ResultMap(value="BaseMap")@Select("select * from user_info where id = #{id}")UserInfoselectById(Integerid);// 再多一个方法也能复用@ResultMap(value="BaseMap")@Select("select * from user_info where username = #{username}")UserInfoselectByUsername(Stringusername);}

全局驼峰命名自动转换

如果数据库字段命名规范统一(如下划线命名),最优雅的方式是开启 MyBatis 的全局驼峰命名自动转换功能。

# application.ymlmybatis:configuration:map-underscore-to-camel-case:true# 配置驼峰自动转换

开启后,Mapper 接口变得极其简洁,无需任何@Results注解:

@MapperpublicinterfaceUserInfoMapper{@Select("select * from user_info")List<UserInfo>selectAll();@Select("select * from user_info where id = #{id}")UserInfoselectById(Integerid);@Select("select * from user_info where username = #{username}")UserInfoselectByUsername(Stringusername);}

MyBatis 会自动将delete_flag映射为deleteFlagcreate_time映射为createTime

建议在项目初期就统一数据库命名规范,并开启map-underscore-to-camel-case配置,这样可以最大程度减少冗余的映射代码。

http://www.gsyq.cn/news/1395950.html

相关文章:

  • GeoDa:从零到一的空间数据探索
  • 从E1帧到2.048Mbit/s:深入解析PCM30/32路系统的帧结构与传输效率
  • 3个技巧让你在数字课堂中重获学习主动权
  • Poppins字体:如何用一款免费开源字体解决多语言排版难题?
  • 上海制造/工程类企业财税服务避坑指南+靠谱机构盘点 - 资讯速览
  • 香橙派Zero 2变身云手机保姆级教程:从内核编译到Redroid容器部署的完整避坑记录
  • 别再只用定时器中断了!用STM32F103的CubeMX玩转硬件PWM,驱动舵机/电机真简单
  • 从配置到调试:Quartus ALTPLL IP核实战避坑指南
  • 从Linux内核到你的项目:揭秘C语言中‘虚函数表’的经典实现与避坑指南
  • 2026出口高品质指针电流表推荐:源头厂家综合测评 定制批发选型指南 - 资讯速览
  • 20252410李沐泽实验四
  • 3分钟搞定网易云音乐NCM格式转换:Windows用户必备的音乐解密工具指南
  • 别再短接TX和GND了!新版WCH-Link固件(V2.40+)的ARM/RISC-V模式切换保姆级教程
  • 20254124 实验四《Python程序设计》实验报告
  • GEO获客工具机构如何体现专业性?
  • 微信单向好友检测终极指南:3分钟找出谁删除了你
  • 2026企业360度人才盘点实力评测:维度设计vs报告解读全场景
  • 2026 年端午礼盒定制厂家推荐:打造专属节日心意 - GrowthUME
  • 避开Zemax扫描仿真的大坑:为什么你的多重组态光斑大小不一致?从场曲问题讲起
  • 掌握timedatectl:从时区管理到NTP同步的Linux系统时间配置实战
  • 生产收货的几种常用移动类型
  • 免费AI助力JeeSite手机端重构:零成本工作流破传统开发难题
  • 5月26号
  • 如何发布一场投票评选活动,一步步教你搞定 - 投票小程序
  • 服务10万+企业、覆盖全球230国+,飞鸽传书凭什么被选择? - 资讯速览
  • 实验方法详解:细胞热迁移实验(CETSA)标准化操作流程
  • 初学frida
  • 2026北京朝阳区居民搬家公司排名推荐|本地口碑靠谱榜单 - 余小铁
  • 避坑指南:STM32CubeMX配置高级定时器PWM时,时钟源和ARR值设置的那些‘坑’
  • 报告笔记--AI自动化之后的研读记录及感悟