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

mybatis字段自动驼峰转换和大小写敏感

在 MyBatis 中,​默认情况下SELECT语句查询出来的数据库字段名(通常是下划线分隔的,如 user_name)​不会自动转换成 Java 对象属性名的驼峰形式(如 userName)。同时,​字段名到属性名的映射默认是大小写敏感的

以下是详细说明和解决方案:

  1. 默认行为(不自动驼峰转换,大小写敏感)​​:

    • 如果你的数据库字段名是 first_name,而你的 Java 对象属性名是 firstName,MyBatis 默认无法将它们匹配起来。

    • 如果你的数据库字段名是 UserName(首字母大写),而 Java 属性名是 userName(首字母小写),MyBatis 默认也无法匹配,因为大小写不同。

  2. 开启自动驼峰命名转换​:

    • MyBatis 提供了一个强大的全局配置选项来启用下划线命名到驼峰命名的自动映射:mapUnderscoreToCamelCase

    • 你需要在 MyBatis 的核心配置文件中(通常是 mybatis-config.xml)设置这个选项为 true

      <configuration><settings><!-- 启用下划线转驼峰 --><setting name="mapUnderscoreToCamelCase" value="true"/><!-- 其他配置... --></settings><!-- 其他配置... -->
      </configuration>
    • 作用​:开启后,MyBatis 会自动尝试将数据库查询结果中下划线分隔的小写字母命名的列名(如 user_name, order_id)映射到 Java 对象驼峰命名的属性名(如 userName, orderId)。

    • 大小写敏感性​:

      • 对于开启了 mapUnderscoreToCamelCase的字段(即原字段包含下划线),MyBatis 在转换和匹配时不区分大小写。它会忽略数据库列名和 Java 属性名在大小写上的差异,专注于下划线到驼峰的转换逻辑。例如:

        • 数据库列 USER_NAMEuser_nameuSeR_nAmE都会被尝试映射到 userName

      • 对于不包含下划线的字段名,或者未开启 mapUnderscoreToCamelCase时,MyBatis 的映射默认是大小写敏感的。数据库列名 UserName和 Java 属性 userName会被视为不同的名称。

  3. 其他映射方式​:

    • <resultMap>​:这是最精确、最灵活的映射方式。你可以显式地在 XML Mapper 文件中定义 <resultMap>,使用 <result>子元素指定数据库列名 (column) 和 Java 属性名 (property) 的对应关系。这种方式完全由你控制,不受 mapUnderscoreToCamelCase设置影响,且可以处理任何复杂的映射关系(包括类型转换器)。

      <resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="userName" column="user_name"/> <!-- 显式指定映射,即使开启驼峰 --><result property="emailAddress" column="email"/> <!-- 列名和属性名不同 -->
      </resultMap>
      <select id="selectUser" resultMap="userResultMap">SELECT id, user_name, email FROM users WHERE id = #{id}
      </select>
    • SQL 别名 (AS)​​:在编写 SELECT语句时,可以直接为列指定别名,使其与 Java 属性名完全一致(包括大小写)。

      SELECTuser_id AS userId,user_name AS userName,created_at AS createdAt
      FROM users
      WHERE user_id = #{id}
      • 这种方式简单直接,但需要在每个查询中写别名,如果属性名变更,需要修改所有相关 SQL。

    • 注解 (@Results, @Result)​​:如果你使用注解方式配置 Mapper,可以使用 @Results@Result注解达到类似 <resultMap>的效果。

      @Results({@Result(property = "userId", column = "user_id"),@Result(property = "userName", column = "user_name"),@Result(property = "createdAt", column = "created_at")
      })
      @Select("SELECT user_id, user_name, created_at FROM users WHERE user_id = #{id}")
      User selectUserById(int id);

总结与建议​:

  1. 默认不驼峰,大小写敏感​:MyBatis 默认不会自动转换驼峰,且列名到属性名的匹配是大小写敏感的。

  2. 推荐开启全局驼峰转换​:在 mybatis-config.xml中设置 <setting name="mapUnderscoreToCamelCase" value="true"/>。这是处理数据库下划线命名和 Java 驼峰属性名之间映射的最常用、最便捷方式。开启后,对于带下划线的列名,映射时不区分大小写

  3. 复杂场景用 <resultMap>或注解​:对于不符合驼峰规则的映射、需要特殊处理的列、或者需要最高精度的控制时,使用 <resultMap>@Results/@Result注解进行显式映射。

  4. SQL 别名作为补充​:在特定查询中需要临时改变映射关系时,可以使用 SQL 别名。

验证​:开启 mapUnderscoreToCamelCase后,检查你的查询是否能正确地将类似 user_name的数据库列值填充到 userName这个 Java 属性中。如果数据库列名本身是驼峰形式(如 userName)或者大小写混合(如 UserName),而 Java 属性是 username,则可能需要使用 <resultMap>或别名来显式映射,因为 mapUnderscoreToCamelCase主要处理的是下划线到驼峰的转换。

http://www.dtcms.com/a/479013.html

相关文章:

  • 企业网站导航代码太原市手机微网站建设
  • web:ts的数组
  • seo网站运营php网站做cdn
  • 便携式显示器兼容iPhone15
  • Nginx对于Vue的工作
  • Vue Router 的三种历史模式详解
  • 建筑人才网app下载seo建站淘客
  • 江门城乡建设局官方网站腾讯云域名交易平台
  • 我对游戏后端的认识
  • pycharm中使用anaconda指定虚拟环境
  • 网站开发建设及推广合同哪里有网站开发平台
  • WHAT - JSON 能不能当作数据库
  • 【目录】2025年羊城工匠杯NL2SQL参赛介绍
  • 网站怎么才能上线网站后台数据库设计
  • 【开题答辩全过程】以 白马藏族文化与特产销售小程序为例,包含答辩的问题和答案
  • 石家庄做外贸的网站建设建设商城网站的难点
  • 天津网站备案在哪照相建设网站明细报价表
  • Node.js events模块所有 API 详解 + 常用 API + 使用场景
  • 便携式EL检测仪:重构光伏质检流程
  • 安庆网站建设推荐秒搜科技网站右侧虚代码
  • 研究生核心课程建设网站深圳网站建设top028
  • 网站建设伍金手指下拉2加强网站硬件建设方案
  • Pytest单元测试一例:u16采样值格式转换的错误
  • 源码网站php什么事网站建设
  • Pytest与Unittest测试框架对比
  • 旅游网站建设的方向连接交换
  • 路径平滑优化详解(二次规划): 数学建模与目标函数推导
  • 昂瑞微:射频与模拟芯片领域的国产领军者
  • 互联网医院小程序源码实操:在线问诊功能快速实现
  • 数字电源和模拟电源隔离的原理