MyBatis 自定义映射 ResultMap:字段与属性的映射详解

在 MyBatis 框架中,ResultMap 是一个非常强大的功能,它允许我们自定义SQL查询结果与Java对象之间的映射关系。特别是在数据库字段名和Java对象属性名不一致时,ResultMap能够帮助我们精确地映射数据。

ResultMap 的基本使用

若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射,即使字段名和属性名一致的属性也要映射 ,也就是全部属性都要列出来

ResultMap 通过在XML映射文件中定义 ,可以指定一个唯一的 id,以及一个 type 属性来指定要映射的Java类型。在ResultMap内部,我们可以使用 <id><result> 标签来分别映射主键字段和普通字段。

xml 复制代码
xml
<resultMap id="empResultMap" type="Emp">  
    <id property="eid" column="eid"/>  
    <result property="empName" column="emp_name"/>  
    <result property="age" column="age"/>  
    <result property="sex" column="sex"/>  
    <result property="email" column="email"/>  
</resultMap>  
  
<select id="getAllEmp" resultMap="empResultMap">  
    SELECT * FROM t_emp  
</select>

在这个例子中,empResultMap定义了如何将 t_emp 表中的字段映射到 Emp 类的属性上。

  • 说明:
    resultMap:设置自定义映射
    • 属性:
      • id:表示自定义映射的唯一标识,不能重复
      • type:查询的数据要映射的实体类的类型
    • 子标签:
      • id:设置主键的映射关系
      • result:设置普通字段的映射关系
      • 子标签属性:
        • property:设置映射关系中实体类中的属性名
        • column:设置映射关系中表中的字段名

处理字段名和属性名不一致的情况

若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性名符合Java的规则(使用驼峰)。除了使用ResultMap,还有其他两种常见方法处理字段名和实体类中的属性的映射关系:

使用字段别名

在SQL查询中,我们可以为字段指定别名,使其与Java对象的属性名保持一致。这样,MyBatis在映射时就可以自动找到对应的属性。

xml 复制代码
xml
<select id="getAllEmp" resultType="Emp">  
    SELECT eid, emp_name AS empName, age, sex, email FROM t_emp  
</select>
全局配置自动映射

MyBatis允许我们设置一个全局配置,使得在查询时自动将下划线分隔的字段名转换为驼峰命名的属性名。这通过 mapUnderscoreToCamelCase 设置项实现。

在MyBatis的核心配置文件中:

xml 复制代码
xml
<settings>  
    <setting name="mapUnderscoreToCamelCase" value="true"/>  
</settings>

在Spring Boot的 application.ymlapplication.properties 配置文件中:

yml 复制代码
yml
mybatis-plus:  
  configuration:  
    map-underscore-to-camel-case: true

注意:在使用MyBatis-Plus时,该设置项通常已经默认启用

为什么要使用ResultMap

虽然上述两种方法都能处理字段名和属性名不一致的问题,但ResultMap提供了更大的灵活性和控制力。特别是当数据库表结构复杂,或者需要关联多个表查询时,ResultMap能够帮助我们精确地控制数据的映射关系。

此外,ResultMap还支持关联映射 (association)和集合映射 (collection),可以处理更复杂的查询结果,如一对多多对一等关系。

总之,ResultMap 是 MyBatis 中一个非常强大且实用的功能,它允许我们灵活地定义SQL查询结果与Java对象之间的映射关系,帮助我们更轻松地处理数据。

相关推荐
熙客6 分钟前
TiDB:分布式关系型数据库
java·数据库·分布式·tidb
你想考研啊1 小时前
linux安装jdk和tomcat和并自启动
java·linux·tomcat
星释1 小时前
Rust 练习册 :Leap与日期计算
开发语言·后端·rust
悟能不能悟3 小时前
java的java.sql.Date和java.util.Date的区别,应该怎么使用
java·开发语言
你想考研啊3 小时前
oracle导出 导入
数据库·oracle
高山上有一只小老虎4 小时前
java 正则表达式大全
java·正则表达式
_院长大人_5 小时前
设计模式-工厂模式
java·开发语言·设计模式
码事漫谈5 小时前
C++死锁深度解析:从成因到预防与避免
后端
凌波粒5 小时前
MyBatis完整教程IDEA版(2)--ResultMap/注解/一对多/多对一/lombok/log4j
java·intellij-idea·mybatis
码事漫谈5 小时前
智能体颠覆教育行业:现状、应用与未来展望调研报告
后端