一、写在前面

在MyBatis 的全局配置文件中我们可以通过在settings标签中设置
<setting name="mapUnderscoreToCamelCase" value="true"/>来开启驼峰命名法,实现数据库中的字段名与JavaBean 中属性的关系映射。

在数据库中一般使用单词来定义列名,多个列名之间用’ _ ‘分隔开,比如department_name,在JavaBean 中一般使用驼峰命名来定义属性,所以会定义为departmentName。在默认不开启驼峰命名法的情况下,它们之间是不能够实现关系映射的,在开启对驼峰命名法的支持后,MyBatis 会对数据库中的字段进行驼峰命名转换。

但是有的时候,开启驼峰命名法也不能完成映射,比如数据库字段dept_name对应JavaBean 中的departmentName,这时候就需要我们自定义resultMap关系映射。

二、resultMap自定义映射规则

使用resultMap实现数据库中的dept_name字段与JavaBean 中的departmentName的关系映射。

mapper 接口:

    // 通过id 查询部门信息,返回的是一个Department 对象Department getDeptById(Integer id);

SQL 映射文件:

    <!--先通过resultMap 定义映射规则id:当前命名空间中的一个唯一标识,用于标识一个resultMap type:类的完全限定名, 或者一个类型别名,也就是返回的对应JavaBean 类型--><resultMap id="BaseDeptResultMap" type="com.jas.mybatis.bean.Department"><!-- <id>:与下面<result>标签的区别是可以用于提升性能,所以这里用<id>标签来定义主键的映射关系column:数据库中对应的字段名property:对应JavaBean 的属性名因为可以实现自动映射,所以<id column="id" property="id"/> 在这里也可以省略如果开启了驼峰命名法,对应的映射转换也可以省略--><id column="id" property="id"/><result column="dept_name" property="departmentName"/></resultMap><select id="getDeptById" resultMap="BaseDeptResultMap">SELECT * FROM t_dept WHERE id = #{id}</select>

三、resultMap实现关联映射

有这样一个需求,在根据id 查询员工信息的时候,把员工所在的部门信息也查出来。

Employee 员工类:

package com.jas.mybatis.bean;public class Employee {private Integer id;private String username;private Character gender;private String email;//在Employee 类中定义一个Department 对象,用来封装员工的部门信息private Department department;// 省略get、set 与toString 方法
}

Department部门类:

package com.jas.mybatis.bean;public class Department {private Integer id;private String departmentName;
}  

mapper 接口:

    // 根据id 查出员工的信息并把对应的部门信息也查询出来Employee getEmpAndDeptById(Integer id);

SQL 映射文件:

方式一:

    <resultMap type="com.jas.mybatis.bean.Employee" id="BaseEmployeeResultMap"><id column="id" property="id"/><result column="username" property="username"/><result column="gender" property="gender"/><result column="email" property="email"/><!-- 通过下面两个列名获得数据将封装成Department 对象直接通过属性名.属性名的方式指定映射的关系--><result column="d_id" property="department.id"/><result column="dept_name" property="department.departmentName"/></resultMap><select id="getEmpAndDeptById" resultMap="BaseEmployeeResultMap">SELECT e.id, e.username, e.gender, e.email, e.d_id, d.dept_nameFROM t_employee e LEFT JOIN t_dept d ON (e.d_id = d.id) WHERE e.id = #{id}</select>

方式二(在resultMap使用association标签):

    <resultMap type="com.jas.mybatis.bean.Employee" id="BaseEmployeeResultMap"><id column="id" property="id"/><result column="username" property="username"/><result column="gender" property="gender"/><result column="email" property="email"/><!--使用association 标签实现关联查询property:在Employee 类中对应的department 属性javaType:关联的类的全路径名或者其对应的别名--><association property="department" javaType="com.jas.mybatis.bean.Department"><!--property:直接就是Department 类中的属性--><id column="d_id" property="id"/><result column="dept_name" property="departmentName"/></association></resultMap><select id="getEmpAndDeptById" resultMap="BaseEmployeeResultMap">SELECT e.id, e.username, e.gender, e.email, e.d_id, d.dept_nameFROM t_employee e LEFT JOIN t_dept d ON (e.d_id = d.id) WHERE e.id = #{id}</select>

查看结果:

四、总结

这篇博文主要介绍了使用resultMap 实现数据库字段与JavaBean 属性之间高级映射的知识点,并实现了一个关联映射。resultMap的作用还有很多,比如分布查询与延迟加载等,都是在resultMap的基础上完成的。如果有兴趣,可以关注后续的博文。希望这篇博文能够为你提供帮助。

MyBatis使用resultMap自定义映射规则与关联映射相关推荐

  1. 【SSH系列】Hibernate映射 -- 一对多关联映射

         映射原理        一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入 ...

  2. 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  3. Mybatis的resultMap自定义映射

    Mybatis 自定义映射和分布查询: 自定义映射 自定义resultMap,实现高级结果集映射 id :用于完成主键值的映射 result :用于完成普通列的映射 association :一个复杂 ...

  4. hibernate关联映射_具有关联映射的Hibernate Composite ID

    hibernate关联映射 最近,我们面临着带有复合id字段的Hibernate关联映射的棘手情况. 我们需要与一对一和多对一进行双向关联.我们的拖曳表是" REPORT"和&qu ...

  5. Java神操作之利用Mybatis的resultMap的id标签进行分组映射

    SQL <!--分组测试--><select id="test" resultMap="test">select * from mall ...

  6. MyBatis 关联映射

    在实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关 ...

  7. 第4章 MyBatis的关联映射和缓存机制

    目录/Contents 第4章 MyBatis的关联映射和缓存机制 学习目标 了解数据表之间的三种关联关系 了解对象之间的三种关系 熟悉关联关系中的嵌套查询和嵌套结果 掌握一对一关联映射 掌握一对多关 ...

  8. Mybatis关联映射;Mybatis注解

    Mybatis关联映射 Mybatis关联映射的用途: 在实际的开发过程中,对于数据库的操作除了单表外往往会涉及到多张表,这些操作在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,M ...

  9. MyBatis的关联映射之 一对一(嵌套查询/嵌套结果)

    关联映射概述 在实际的开发中,对数据库的操作常常会涉及多张表,这在面向对象中就涉及了对象与对象之间的关联关系 针对多表之间的操作, MyBatis 提供了关联映射,通过关联映射就可以很好地处理对象与对 ...

最新文章

  1. UIPickerView 修改必须滚动才修改值的bug
  2. DFT实训教程笔记1(bibili版本)- introduction to DFT DFT Architecture
  3. pycharm更改模板_pycharm怎样给文件编辑统一的模板?
  4. 枚举类型是怎样定义的?有什么用途?_新型合金材料——什么是液态金属、液态金属的定义、发展以及用途...
  5. LINUX 基础命令和预处理
  6. linux中断的上半部和下半部
  7. 一个简单JavaAgent的实现
  8. 华为鸿蒙系统耳机,华为鸿蒙系统真的来了,完整升级名单曝光!
  9. thinkphp3 页面跳转外部链接_一文看懂小程序跳转的规则和注意事项
  10. Linux学习总结(七十四)自动化运维之ansible
  11. SSM、SSH框架原理
  12. android apk反编译(Doapk工具和dex2jar工具介绍)
  13. sublime补全java代码快捷键_Sublime快捷键
  14. python模拟登录163邮箱_python selenium模拟登陆163邮箱。
  15. 调用百度API实现人脸识别
  16. 微服务swoft打造腾讯云短信网关
  17. LUA脚本扩展wireshark自定义的协议
  18. 什么是Resnet50模型?
  19. 中断优先级和中断线程优先级
  20. 【server2019】refs数据恢复/打捞

热门文章

  1. 有一种努力叫:靠 自 己!
  2. JAVA——仿Linux命令行文件管理系统命令的简单实现
  3. SpringFox 3.0.0(包含springfox-swagger2-3.0.0)——无法访问/swagger-ui.html解决方案
  4. linux改变文件夹权限吗,linux改变文件/文件夹权限
  5. 【算法学习笔记】 图(四)用优先级队列优化Dijkstra算法求最短路径(邻接矩阵存储)
  6. 数据库 文件 备份【学习 使用】
  7. 【CentOS Linux 7】实验5【Samba服务器管理】
  8. mysql中explain命令
  9. SSH服务的渗透测试
  10. JVM内存模型及垃圾收集策略解析(一)