大厂Java面试题:MyBatis是中如何将结果集映射到Java持久化对象?都有哪些方式?有什么区别?

大家好,我是王有志。今天给大家带来的是一道来自京东的 MyBatis 面试题:MyBatis是中如何将结果集映射到Java持久化对象?都有哪些方式?有什么区别?

MyBatis 提供了两种实现结果集到 Java 持久化对象的映射方式:

  • 自动映射,不显式指定映射关系;
  • 主动映射,使用 resultTyp 或者 resultMap 指定映射关系。

通常在生产应用中,我们可以直接放弃使用自动映射这种方式,在数据库表中的字段与 Java 持久化对象中的字段是一一对应的场景下,且能够使用 MyBatis 插件“mapUnderscoreToCamelCase”实现映射,那么我们可以选择使用 resultType 属性进行配置,如果不能一一对应,或者不能通过 MyBatis 插件“mapUnderscoreToCamelCase”实现映射,以及映射关系较为复杂(例如:一对一关联,一对多关联登)的场景下,我们应该使用 resultMap 元素定义映射关系。

自动映射

自动映射指的是不显式指定 resultType 或 reusltMap,让 MyBatis 尝试自动根据查询结果的列名与 Java 持久化对象进行匹配进行映射,这需要保证数据库表中的字段名与 Java 持久化对象的字段名一致,也可以通过为查询语句中的字段取别名,或者是使用 MyBatis 插件“mapUnderscoreToCamelCase”的方式实现自动映射

下面我们举个例子。

定义数据库表 order_item,代码如下:

create table order_item (
  item_id         int            not null comment '订单商品表主键' primary key,
  order_id        int            not null comment '订单表主键',
  commodity_id    int            not null comment '商品表主键',
  commodity_price decimal(18, 2) not null comment '商品价格',
  commodity_count int            not null comment '商品数量'
) comment '订单明细表';

定义 Java 持久化对象 OrderItemDO,代码如下:

public class OrderItemDO {

  private Integer itemId;

  private Integer orderId;

  private Integer commodityId;

  private BigDecimal commodityPrice;

  private Integer commodityCount;
}

定义 OrderItemMapper 接口中的方法,代码如下:

public interface OrderItemMapper {
    List<OrderItemDO> selectByAutoMap();
}

定义 OrderItemMapper 映射器中的 SQL 语句,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wyz.mapper.OrderItemMapper">
  <select id="selectByAutoMap">
    select item_id as itemId,
           order_id as orderId,
           commodity_id as commodityId,
           commodity_price as commodityPrice,
           commodity_count as commodityCount
    from order_item
  </select>
</mapper>

注意,此时 OrderItemMapper 接口的中方法可能会报错,提示如下:

Result type not match for select id=“selectByAutoMap” srcType: targetType: com.wyz.entity.OrderItemDO

针对于这个报错,我们直接忽略就可以了。

最后来写单元测试,代码如下:

public void testSelectByAutoMap() throws IOException {
Reader mysqlReader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(mysqlReader);
SqlSession sqlSession = sqlSessionFactory.openSession();
OrderItemMapper orderItemMapper = sqlSession.getMapper(OrderItemMapper.class);

List<OrderItemDO> orderItems = orderItemMapper.selectByAutoMap();
System.out.println(JSON.toJSONString(orderItems, JSONWriter.Feature.PrettyFormat));
}

执行单元测试,可以看到控制台正常输出了查询到的数据。

这种方式是在 MyBatis 应用程序构建 MappedStatement 时通过反射获取 OrderItemMapper 接口中的方法,解析方法返回值的方式来获取到结果集映射的 Java 持久化对象的,部分源码如下所示:

图中源码做了大量删减,重点关注下调用链路即可,高亮的部分就是通过反射获取数据集映射的 Java 持久化对象类型的部分。因为需要做额外的工作,并且使用到反射技术,因此在效率上较差,不建议使用这种方式。

主动映射

主动映射可以通过 select 元素中的 resultType 属性定义,也可以通过 resultMap 元素结合 select 元素的 resultMap 属性定义。

使用 reusltType 进行映射

修改 OrderItemMapper 映射器中的 SQL 语句,为其添加 resultType 属性,代码如下:

<select id="selectByAutoMap" resultType="com.wyz.entity.OrderItemDO">
  select item_id as itemId,
         order_id as orderId,
         commodity_id as commodityId,
         commodity_price as commodityPrice,
         commodity_count as commodityCount
  from order_item
</select>

再次执行单元测试,可以看到控制台能够正常输出查询结果。

这种方式与自动映射基本一致,只不过我们指定了 reusltType 的类型,MyBatis 只需要根据 resultType 的配置反射出相应的类型即可,而不需要反射出方法的返回值。同样的,使用 resultType 也需要保证数据库表中的字段名与 Java 持久化对象中的字段名完全一致,当然了,同样也可以通过为查询语句中的字段起别名,或者是使用 MyBatis 的插件“mapUnderscoreToCamelCase”解决。

这种方式 MyBatis 会直接读取 reusltType 的配置,并通过类型别名注册器 TypeAliasRegistry 去解析出配置对应的类名。

使用 resultMap 进行映射

使用 resulttMap 元素可以定义数据库表中的字段名与 Java 持久化对象中的字段名的映射器关系,因为 resultMap 元素强大的功能,它可以处理很多复杂的场景,具体用法可以参考我在掘金专栏中的文章:《MyBatis映射器:一对一关联查询》和《MyBatis映射器:一对多关联查询》。

下面我们使用 resulttMap 元素定义映射关系,代码如下:

<resultMap id="BaseResultMap" type="com.wyz.entity.OrderItemDO">
  <id property="itemId" column="item_id" jdbcType="INTEGER"/>
  <result property="orderId" column="order_id" jdbcType="INTEGER"/>
  <result property="commodityId" column="commodity_id" jdbcType="INTEGER"/>
  <result property="commodityPrice" column="commodity_price" jdbcType="DECIMAL"/>
  <result property="commodityCount" column="commodity_count" jdbcType="INTEGER"/>
</resultMap>

修改 OrderItemMapper 映射器中的 SQL 语句,为其添加 resultMap 属性,代码如下:

<select id="selectByAutoMap" resultMap="BaseResultMap">
  select item_id,
         order_id,
         commodity_id,
         commodity_price,
         commodity_count
  from order_item
</select>

最后再来执行单元测试,可以看到控制台依旧可以正常输出结果。

使用 reusltMap 元素的优点是,灵活性高,能够适应复杂的场景,并且使用 resultMap 元素的可读性更好,能够清晰直观的看到数据库中表的字段与 Java 持久化对象中字段的映射关系,如果硬要说缺点,也只能是学习成本高(相对来说),配置及相对复杂


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/706137.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【话题】程序员应该有什么职业素养

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景职业素养的重要性职业素养的核心1.1 承诺与责任感1.2 沟通与团队合作1.3 学习与持续进步 态度和价值观的作用2.1 诚实和诚信2.2 责任和自我管理2.3 尊重和多样性 职…

席卷的B站《植物大战僵尸杂交版》V2.0.88整合包,PC和手机可用,含通关存档和视频教程!

今天给大家安利一款席卷B站&#xff0c;火爆全网的游戏——《植物大战僵尸杂交版》2.0.88整合包。 这个是网络上现存植物大战僵尸杂交版的最全整合&#xff0c;包含了修改工具&#xff0c;超强通关存档和高清工具。工具包有安装视频教程&#xff0c;支持手机版和pc多端使用&am…

flask实战之模板实现公共导航

基础实现 目标 在Flask中&#xff0c;使用模板继承和块&#xff08;blocks&#xff09;可以方便地提取公共导航菜单&#xff0c;使得您可以在多个页面上重用相同的导航结构。以下是一个基本示例&#xff0c;展示如何创建一个包含公共导航菜单的模板&#xff1a; 创建基础模板…

OpenCV学习(4.14) 基于分水岭算法的图像分割

1. 目标 在这一章当中&#xff0c; 我们将学习使用分水岭算法使用基于标记的图像分割我们将看到&#xff1a;cv.watershed() 2.理论 任何灰度图像都可以看作是地形表面&#xff0c;其中高强度表示峰和丘陵&#xff0c;而低强度表示山谷。您开始用不同颜色的水&#xff08;标…

强化学习入门

简介 强化学习&#xff08;Reinforcement Learning, RL&#xff09;&#xff0c;又称再励学习、评价学习或增强学习&#xff0c;是机器学习的范式和方法论之一&#xff0c;用于描述和解决智能体&#xff08;agent&#xff09;在与环境的交互过程中通过学习策略以达成回报最大化…

学习笔记——网络管理与运维——概述(网络管理)

二、概述 1、什么是网络管理&#xff1f; 网络管理是通过对网络中设备的管理&#xff0c;保证设备工作正常&#xff0c;使通信网络正常地运行&#xff0c;以提供高效、可靠和安全的通信服务&#xff0c;是通信网络生命周期中的重要一环。 2、网络管理分类 网络管理(Network …

uni-ui:基于uni-app的全端兼容高性能UI框架

一、引言 在移动应用开发领域&#xff0c;跨平台框架因其能够降低开发成本、提高开发效率而备受开发者青睐。其中&#xff0c;uni-app作为一个使用Vue.js开发所有前端应用的框架&#xff0c;不仅支持编译到iOS、Android、H5、以及各种小程序等多个平台&#xff0c;还因其丰富的…

unDraw —— 免费且可定制的插画库,为您的设计注入灵魂

&#x1f3a8; unDraw —— 免费且可定制的插画库&#xff0c;为您的设计注入灵魂 在寻找能够完美融入您品牌风格的插画吗&#xff1f;unDraw&#xff0c;一个提供大量免费插画资源的网站&#xff0c;可能是您的理想选择&#xff01; &#x1f310; 网站特色 免费且开源 unDraw…

C#聊天室②

客户端 桌面 MyClient client;public Form1(){InitializeComponent();}// 进入聊天室按钮方法private void button1_Click(object sender, EventArgs e){if (!string.IsNullOrEmpty(textBox1.Text)){// 开始连接服务器 封装一个自定义客户端类client new MyClient(); // 给cl…

Docker overlay磁盘使用100%处理方法overlay 100%

一、问题描述 服务器上运行了几个docker容器,运行个一周就会出现overlay 100%的情况&#xff0c;经查找&#xff0c;是容器里生成了很多core.xxx的文件导致的。 二、解决方法 首先通过以下命令查看&#xff1a; df -h 可以看的overlay已经100%了&#xff0c;进入到/var/lib/d…

11_从注意力机制到序列处理的革命:Transformer原理详解

1.1 简介 Transformer是一种深度学习模型&#xff0c;主要用于处理序列数据&#xff0c;尤其是自然语言处理任务&#xff0c;如机器翻译、文本摘要等。该模型由Vaswani等人在2017年的论文《Attention is All You Need》中首次提出&#xff0c;它的出现极大地推动了自然语言处理…

计算机msvcp100.dll丢失怎么办,分享5种亲测有效的解决方法

电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是电脑提示缺失msvcp100.dll。这个问题可能会让我们感到困惑和烦恼&#xff0c;但是只要我们了解其原因并采取相应的解决方法&#xff0…

React-配置json-server

安装json-server&#xff1a;json-server工具准备后端接口服务环境_jsonserver临时后端-CSDN博客 在package.json文件中的scripts添加&#xff1a; "serve":"json-server json文件路径 --port 端口号" 在终端输入命令npm run serve&#xff0c;就可以启动…

SPI通信外设

SPI外设介绍 时钟频率就是SCK波形的频率&#xff0c;一个SCK时钟交换一个bit&#xff0c;所以时钟频率一般体现的是传输速度&#xff0c;单位是Hz或者bit/s。可以看出来&#xff0c;SPI的时钟其实就是由pclk分频得来的&#xff0c;pclk就是外设时钟&#xff0c;APB2的PCLK就是7…

重复文件怎么查找并清理?6种重复文件清理方法亲测好用!

重复文件怎么查找并清理&#xff1f;重复的文件会占用计算机中不必要的空间&#xff0c;从而降低计算机速度。这些文件是您设备上现有文件的副本。您可能有照片、视频、音频、档案、文档等的文件副本。因此&#xff0c;当电脑被这些文件占用运行速度时&#xff0c;你会迫切地希…

Java项目:111 基于SpringBoot的在线家具商城设计与实现

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统有管理员和用户两个角色&#xff0c;包括前台商城平台及后台管理系统。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订…

探索Java 8 Stream API:现代数据处理的新纪元

Stream流 Stream初探&#xff1a;何方神圣&#xff1f; Stream流是一种处理集合数据的高效工具&#xff0c;它可以让你以声明性的方式处理数据集合。Stream不是存储数据的数据结构&#xff0c;而是对数据源&#xff08;如集合、数组&#xff09;的运算操作概念&#xff0c;支…

❤vue2项目webpack打包的优化策略

❤ vue2项目webpack打包的优化策略 &#xff08;优化前&#xff09; 现在我们的打包时间为&#xff1a; >打包体积大小为&#xff1a; 1、去除开发环境和生产环境提示以及日志 开发环境和生产环境的打印处理 生产环境去除console.log打印的两种方式 通过环境变量控制co…

一张图读懂天然气气源

一张图读懂天然气气源

《pvz植物大战僵尸杂交版》V2.0.88整合包火爆全网,支持安卓、ios、电脑等!

今天来给大家安利一款让人欲罢不能的游戏——《植物大战僵尸杂交版》2.0.88版。这可不是普通的植物大战僵尸&#xff0c;它可是席卷了B站&#xff0c;火爆全网的存在&#xff01; 先说说这个版本&#xff0c;它可是网络上现存最全的植物大战僵尸杂交版整合包。里面不仅有修改工…