大厂Java面试题:MyBatis的映射器(Mapper.xml)中有哪些常见的元素?

大家好,我是王有志。今天给大家带来的是一道来自京东的 MyBatis 面试题:MyBatis的映射器(Mapper.xml)中有哪些常见的元素?
MyBatis 的映射器中提供了 9 个顶级元素,按照功能可以分为 3 类:

  • SQL 语句相关的元素:sql 元素,select 元素,insert 元素,update 元素和 delete 元素;
  • 参数映射与结果集映射相关元素:parameterMap 元素和 resultMap 元素;
  • 二级缓存相关元素:cache 元素和 cache-ref 元素。

其中与参数映射有关的 parameterMap 元素,已经被 MyBatis 官方标记为废弃,因此不建议大家在项目中使用(下文也不会展示 parameterMap 元素的用法)。
除了上面 9 个顶级元素外,MyBatis 的映射器中还提供了非常多的二级元素,常用的有以下 6 个元素:

  • include 元素
  • if 元素
  • foreach 元素
  • trim 元素,where 元素和 set 元素

下面我们来逐个解释它们的含义,并展示它们的用法。

sql 元素与 include 元素的使用

sql 元素用于定义可重复使用的 SQL 语句片段
下面我们使用 sql 元素定义一段 SQL 语句片段,代码如下:

<sql id="Base_Column_List">
  item_id, order_id, commodity_id, commodity_price, commodity_count
</sql>

include 元素用于引入由 SQL 元素定义的 SQL 语句片段
下面我们使用 include 元素引入 SQL 语句片段,代码如下:

<select id="selectOrderItemByOrderId" resultType="com.wyz.entity.OrderItemDO">
  select
  <include refid="Base_Column_List"/>
  from order_item where order_id = #{orderId, jdbcType=INTEGER}
</select>

select 元素,if 元素与 where 元素的使用

select 元素用于定义查询语句;if 元素可以在映射器中实现条件判断语句,与 Java 中的关键字 if 的作用相同;where 元素会自动移除条件子句前缀的“and”和“or”,并在条件子句的开始处插入“where”,如果不存在条件子句,则不会插入“where”
下面我们使用 select 元素实现查询语句,并且将 where 元素和 if 元素组合使用,实现动态的条件查询子句,代码如下:

<select id="selectByItemIdAndOrderId" resultType="com.wyz.entity.OrderItemDO">
  select * from order_item
  <where>
    <if test="orderItem.itemId != null">
      and item_id = #{orderItem.itemId, jdbcType=INTEGER}
    </if>
    <if test="orderItem.orderId != null">
      and order_id = #{orderItem.orderId, jdbcType=INTEGER}
    </if>
  </where>
</select>

insert 元素的使用

insert 元素用于定义插入语句
下面我们使用 insert 元素实现插入语句,代码如下:

<insert id="insert" parameterType="com.wyz.entity.OrderItemDO">
  insert into order_item (item_id, order_id, commodity_id, commodity_price, commodity_count)
  value (#{orderItem.itemId, jdbcType=INTEGER},
  #{orderItem.orderId, jdbcType=INTEGER},
  #{orderItem.commodityId, jdbcType=INTEGER},
  #{orderItem.commodityPrice, jdbcType=DECIMAL},
  #{orderItem.commodityCount, jdbcType=INTEGER})
</insert>

update 元素和 set 元素的使用

update 元素用于定义更新语句;set 元素会自动将子句结尾处的“,”移除,并在子句的开始处插入“set”,如果不存在子句,则不会插入“set”
下面我们使用 update 元素实现更新语句,并使用 set 元素实现动态组装被更新的字段,代码如下:

<update id="updateByItemId" parameterType="com.wyz.entity.OrderItemDO">
  update order_item
  <set>
    <if test="orderItem.commodityId != null">
      commodity_id = #{orderItem.commodityId, jdbcType=INTEGER},
    </if>
    <if test="orderItem.commodityPrice != null">
      commodity_price = #{orderItem.commodityPrice, jdbcType=DECIMAL},
    </if>
    <if test="orderItem.commodityCount != null">
      commodity_count = #{orderItem.commodityCount, jdbcType=INTEGER}
    </if>
  </set>
  where item_id = #{orderItem.itemId, jdbcType=INTEGER}
</update>

delete 元素和 trim 元素

delete 元素用于定义删除语句;trim 元素用于处理子句,根据 prefixOverrides 属性和 suffixOverrides 属性的配置移除子句前后缀的字符串,最后根据 prefix 属性和 suffix 属性的配置,在子句的开始处和结尾处插入字符串。在 MyBatis 的源码实现中,处理 trim 元素的 TrimSqlNode 是处理 where 元素的 WhereSqlNode 和处理 set 元素的 SetSqlNode 的父类
下面我们使用 delete 元素实现删除语句,并使用 trim 元素实现动态的条件语句,代码如下:

<delete id="delete">
  delete from order_item
  where
  <trim prefixOverrides="and">
    <if test="orderItem.itemId != null">
      and item_id = #{orderItem.itemId, jdbcType=INTEGER}
    </if>
    <if test="orderItem.orderId != null">
      and order_id = #{orderItem.orderId,jdbcType=INTEGER}
    </if>
    <if test="orderItem.commodityId != null">
      and commodity_id = #{orderItem.commodityId, jdbcType=INTEGER}
    </if>
    <if test="orderItem.commodityPrice != null">
      and commodity_price = #{orderItem.commodityPrice, jdbcType=DECIMAL}
    </if>
    <if test="orderItem.commodityCount != null">
      and commodity_count = #{orderItem.commodityCount, jdbcType=INTEGER}
    </if>
  </trim>
</delete>

Tips:上面的例子并不好,因为这里完全可以使用 where 元素代替 trim 元素,这里只是为了展示 trim 元素的用法。

foreach 元素的使用

foreach 元素提供了在 MyBatis 映射器中遍历集合与字典的能力,foreach 元素定义了 6 个属性:

属性说明
collection传入的集合或字典的名称(即入参名称)
item集合中迭代元素的别名
index当前元素在集合中的下标(从 0 开始)
open指定开始处的字符串
close指定结尾处的字符串
separator指定元素间分割的字符串

下面我们使用 foreach 元素,实现在 MyBatis 映射器中遍历集合,代码如下:

<select id="selectByItemIds" resultMap="BaseResultMap">
  select * from order_item
  where item_id in
  <foreach collection="itemIds" item="itemId" separator="," open="(" close=")">
    #{itemId, jdbcType=INTEGER}
  </foreach>
</select>

resultMap 元素的使用

resultMap 元素用于定义数据库结果集与 Java 对象之间的映射规则,resultMap 元素本身非常复杂,不过在这里我们只展示它最基础的用法。
下面我们使用 resultMap 元素来定义数据库结果集与 Java 对象之间的映射规则,代码如下:

<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>

我们可以在查询语句中直接使用 resultMap 定义的映射规则,稍微修改下“select 元素,if 元素与 where 元素的使用”中的查询语句,代码如下:

<select id="selectByItemIdAndOrderId" resultMap="BaseResultMap">
  select * from order_item
  <where>
    <if test="orderItem.itemId != null">
      and item_id = #{orderItem.itemId, jdbcType=INTEGER}
    </if>
    <if test="orderItem.orderId != null">
      and order_id = #{orderItem.orderId, jdbcType=INTEGER}
    </if>
  </where>
</select>

Tips:注意观察 select 元素中使用的属性是发生了变化的。

cache 元素和 cache-ref 元素的使用

cache 元素用于开启 MyBatis 的二级缓存(需要配置 mybatis-config.xml 中 cacheEnabled 使用),同时它还起到配置 MyBats 二级缓存的作用
下面我们使用 cache 元素开启 MyBatis 的二级缓存,并且使用 LRU 淘汰策略,每隔 60 秒定时刷新缓存,代码如下:

<mapper namespace="com.wyz.mapper.OrderItemMapper">
  <cache eviction="LRU" flushInterval="60000"/>
</mapper>

cache-ref 元素用于引入定义在其它映射器中的二级缓存
下面我们使用 cache-ref 元素来引入上面的二级缓存,代码如下:

<cache-ref namespace="com.wyz.mapper.OrderItemMapper"/>

尾图(二维码).png

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

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

相关文章

常用电机测试方法的介绍与功能实现(M测试方法)

目录 概述 1 常用电机测速方法简介 1.1 方法概览 1.2 编码器测速方法 2 M法测速 2.1 理论描述 2.2 实现原理 2.3 速度计算方法 3 功能实现 3.1 功能介绍 3.2 代码实现 3.2.1 使用STM32Cube配置参数 3.2.2 脉冲计数功能 3.2.3 测速函数 4 测试 概述 本文主要介绍…

MySQL:CRUD进阶(七千五百字)

文章目录 前置文章&#xff1a;&#x1f4d1;1. 数据库约束&#x1f324;️1.1 约束类型&#x1f324;️1.2 NULL约束&#x1f324;️1.3 Unique&#xff1a;唯一约束&#x1f324;️1.4 Default&#xff1a;默认值约束&#x1f324;️1.5 Primary key&#xff1a;主键约束&…

一个不错的讲解做竞品分析的方法

比如选了竞品1&#xff0c;竞品2&#xff0c;然后每个功能项&#xff0c;选定1个做标准被比较的锚点&#xff0c;比如外观&#xff0c;用竞品2&#xff0c;设置为1分&#xff0c;然后看竞品1&#xff0c;在外观的评分上&#xff0c;相比竞品2&#xff0c;是分数低点还是高点&am…

java期末细节知识整理(一)

1.java程序的执行过程&#xff1a;先编译后解释。也就是我们在idea写的文件叫做java源文件&#xff08;.java结尾的文件&#xff09;&#xff0c;经过编译器会生成字节码文件&#xff08;.class结尾的文件&#xff09;&#xff0c;再通过解释器进行实现 2.栈用来存储引用类型的…

免费实现网站HTTPS访问

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种基于SSL协议的HTTP安全协议&#xff0c;旨在为客户端&#xff08;浏览器&#xff09;与服务器之间的通信提供加密通道&#xff0c;确保数据在传输过程中的保密性、完整性和身份验证。与传统的HTTP相比&a…

C语言-单精度和双精度浮点型

文章目录 一、遇到的问题二、解决方案三、问题根因float和double的区别&#xff1a; 总结-浮点数 一、遇到的问题 将NXP项目的代码移植到RH850F1K的项目上时&#xff0c;程序运行异常&#xff1a; u16Volt (uint16)((double)u16ADVal * (double)6.3) 执行到这一行程序就跑飞了…

HMI-Board上手指南

介绍 HMI-Board为 RT-Thread 联合瑞萨推出的高性价比图形评估套件&#xff0c;取代传统的 HMI主控板硬件&#xff0c;一套硬件即可实现 HMIIoT控制的全套能力。依托于瑞萨高性能芯片 RA6M3 及 RT-Thread 软件生态&#xff0c;HMI-Board 不仅硬件性能强劲&#xff0c;同时软件生…

C语言 指针——函数指针

目录 什么是函数指针&#xff1f; 函数指针的定义 定义函数指针时的常见错误 函数指针有什么用&#xff1f; 函数指针的主要应用 什么是函数指针&#xff1f; 函数指针 (Function Pointer) 就是指向函数的指针变量 数据类型 ( * 指针变量名 ) ( 形参列表 ); 例如&#x…

芋道系统,springboot+vue3+mysql实现地址的存储与显示

1.效果图 2.前端实现&#xff1a; <el-form-item label"地址" prop"entrepriseAddress"><el-cascaderv-model"formData.entrepriseAddress"size"large":options"region"/></el-form-item> //导入组件 im…

【vue】v-for只显示前几个数据,超出显示查看更多

v-for只显示前几个数据&#xff0c;超出显示查看更多 如图 <div v-for"(item,index) in list.slice(0,3)" :key"index"><div class"degreeNo" :class"index0?noOne:index1?noTwo:index2?noThree:"> NO{{index1}}:<…

【网关】工业智能网关-02

一 公司简介 保定飞凌嵌入式技术有限公司始于2006年&#xff0c;是一家专注嵌入式核心控制系统研发、设计和生产的高新技术企业&#xff0c;是国内最早专业从事嵌入式技术的企业之一。 经过十几年的发展与积累&#xff0c;公司拥有业内一流的软硬件研发团队&#xff0c;在北京…

【EFK日志系统】docker一键部署kibana、es-head

docker一键部署kibana、es-head kibana部署es-head部署 上一篇文章搭建了es集群 规划服务器是 es01:172.23.165.185 es02:172.23.165.186 es03:172.23.165.187 那么kibana就搭建在主节点es01:172.23.165.185 按照顺序参考&#xff1a; docker一键部署EFK系统&#xff08;elas…

【python】爬虫记录每小时金价

数据来源&#xff1a; https://www.cngold.org/img_date/ 因为这个网站是数据随时变动的&#xff0c;用requests、BeautifulSoup的方式解析html的话&#xff0c;数据的位置显示的是“--”&#xff0c;并不能取到数据。 所以采用webdriver访问网站&#xff0c;然后从界面上获取…

vscode怎么拷贝插件到另一台电脑

说明 vscode插件默认存放在 C:\Users\用户名\.vscode 目录下的 extensions 文件夹中 方法 拷贝 C:\Users\用户名\.vscode 目录下的 extensions 文件夹到另一台电脑的C:\Users\用户名\.vscode 目录下 C:\Users\用户名\.vscode

3. MySQL 数据表的基本操作

文章目录 【 1. MySQL 创建数据表 】【 2. MySQL 查看表 】2.1 DESCRIBE/DESC 以表格的形式展示表2.2 SHOW CREATE TABLE 以SQL语句的形式展示表 【 3. MySQL 修改数据表 】3.1 修改表名3.2 修改表字符集3.3 添加字段在末尾添加字段在开头添加字段在中间添加字段 3.3 修改/删除…

Java字符串String详解

Java中的String类作为存储和操作文本数据的基本类型&#xff0c;是开发过程中最常用的类型。 String类型的声明及初始化与基本数据类型非常相似&#xff1a; String name "lcy";但是String类型是引用类型&#xff0c;有着非常丰富的处理字符串的方法。正是因为其重…

LabVIEW远程开发与调试

在现代项目开发中&#xff0c;远程开发与调试已经成为一种常见的模式&#xff0c;特别是在使用LabVIEW进行工程项目时。本文将详细分析LabVIEW远程开发与调试的优缺点&#xff0c;并从多个角度说明如何建议客户采用这种方式&#xff0c;以提高项目效率和质量。 优点 灵活性和便…

全面理解渗透测试

揭秘网络安全的秘密武器&#xff1a;全面理解渗透测试 在数字化时代&#xff0c;网络安全已成为人们关注的焦点。网络攻击和数据泄露事件频发&#xff0c;给个人、企业和国家带来了巨大的损失。为了应对这一挑战&#xff0c;渗透测试作为一种重要的网络安全评估手段&#xff0…

Java之IO流

一、引言 &#xff08;1&#xff09;解释&#xff1a; i&#xff1a;input &#xff08;输入&#xff09; o&#xff1a;output &#xff08;输出&#xff09; &#xff08;2&#xff09;图解 注意&#xff1a; 1、Xxx 这个程序一旦在桌面关闭掉了&#xff0c;也就是运行完…

Apache安装教程

目录 一、Apache知识点 Apache服务简介 Apache下载网址 Apache的主要特点 二、Apache服务的搭建 1. 关闭防火墙 2. 安装依赖环境以及编译工具 3. 将apache安装包拖入xshell内 4. 解压压缩包 5. 进入httpd主包 6. 指定安装路径&#xff0c;启用字符集支持等 7. 优化执…