对Mapper.xml文件进行深入的学习

1.  前言

既上次在Mapper.xml文件出现bug之后,痛改前非,决定吃透Mapper.xml映射文件。

让我们通过具体的代码段来进一步理解 MyBatis 的 Mapper XML 文件中的每个组成部分。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.goblin.BIbackend.mapper.BillsMapper"><resultMap id="BaseResultMap" type="com.goblin.BIbackend.model.entity.Bills"><id property="id" column="id" jdbcType="BIGINT"/><result property="userId" column="user_id" jdbcType="BIGINT"/><result property="amount" column="Amount" jdbcType="FLOAT"/><result property="billDate" column="bill_date" jdbcType="DATE"/><result property="dueDate" column="due_date" jdbcType="DATE"/><result property="isPaid" column="is_paid" jdbcType="BIGINT"/></resultMap><sql id="Base_Column_List">id,user_id,Amount,bill_date,due_date,is_paid</sql><select id="list" resultType="com.goblin.BIbackend.model.entity.Bills">select * from bills<where><if test="userId != null">user_id = #{userId}</if><if test="amount != null">and Amount = #{amount}</if><if test="billDate != null">and bill_date = #{billDate}</if><if test="dueDate != null">and due_date = #{dueDate}</if><if test="isPaid != null">and is_paid = #{isPaid}</if></where></select><select id="mySelectById" resultType="com.goblin.BIbackend.model.entity.Bills">select * from bills where id = #{id}</select><insert id="myInsert" parameterType="com.goblin.BIbackend.model.entity.Bills">insert into bills (user_id,Amount,bill_date,due_date,is_paid)values (#{userId},#{amount},#{billDate},#{dueDate},#{isPaid})</insert><delete id="myDeleteById" >delete from bills where id = #{id}</delete><select id="mySelectAll" resultMap="BaseResultMap">select * from bills</select><update id="myUpdate" parameterType="com.goblin.BIbackend.model.entity.Bills">update bills where id = #{id}</update></mapper>

2.  各部分

2.1  <mapper>根元素

<mapper namespace="com.goblin.BIbackend.mapper.BillsMapper"><!-- 其他配置 -->
</mapper>

这个根元素定义了 XML 文件的命名空间,通常对应 Java 中的 Mapper 接口的完全限定名。这有助于区分不同的 Mapper 文件,防止 SQL 语句冲突。

2.2  <resultMap> 和字段映射

<resultMap id="BaseResultMap" type="com.goblin.BIbackend.model.entity.Bills"><id property="id" column="id" jdbcType="BIGINT"/><result property="userId" column="user_id" jdbcType="BIGINT"/><result property="amount" column="Amount" jdbcType="FLOAT"/><result property="billDate" column="bill_date" jdbcType="DATE"/><result property="dueDate" column="due_date" jdbcType="DATE"/><result property="isPaid" column="is_paid" jdbcType="BIGINT"/>
</resultMap>

这里定义了一个名为 BaseResultMap 的结果映射它将数据库查询结果映射到 com.goblin.BIbackend.model.entity.Bills 类的实例。

具体映射关系如下:

1. id属性对应数据库表的id列,数据类型为BIGINT。
2. userId属性对应数据库表的user_id列,数据类型为BIGINT。
3. amount属性对应数据库表的Amount列,数据类型为FLOAT。
4. billDate属性对应数据库表的bill_date列,数据类型为DATE。
5. dueDate属性对应数据库表的due_date列,数据类型为DATE。
6. isPaid属性对应数据库表的is_paid列,数据类型为BIGINT。

前面是实体类里面定义的名称,后面是数据库里面对应的字段名。 

2.3  <sql> 片段

<sql id="Base_Column_List">id, user_id, Amount, bill_date, due_date, is_paid
</sql>
  • id: 为 SQL 片段定义一个标识符,可以在 <select> 或其他元素中通过 <include> 引用。
  • 内容: 列出了查询操作中需要的列名。这是为了避免在多个 <select> 元素中重复相同的列名列表。

2.4  增删改查SQL语句

<select id="list" resultType="com.goblin.BIbackend.model.entity.Bills">select * from bills<where><if test="userId != null">user_id = #{userId}</if><if test="amount != null">and Amount = #{amount}</if><if test="billDate != null">and bill_date = #{billDate}</if><if test="dueDate != null">and due_date = #{dueDate}</if><if test="isPaid != null">and is_paid = #{isPaid}</if></where></select><select id="mySelectById" resultType="com.goblin.BIbackend.model.entity.Bills">select * from bills where id = #{id}</select><insert id="myInsert" parameterType="com.goblin.BIbackend.model.entity.Bills">insert into bills (user_id,Amount,bill_date,due_date,is_paid)values (#{userId},#{amount},#{billDate},#{dueDate},#{isPaid})</insert><delete id="myDeleteById" >delete from bills where id = #{id}</delete><update id="myUpdate" parameterType="com.goblin.BIbackend.model.entity.Bills">update bills where id = #{id}</update>

parameterTyperesultType 在 SQL 映射文件中用于指定参数和结果的 Java 类型,但它们的作用和使用场景不同。 一定不能写错,否则测试接口的时候就错乱了。

2.4.1  resultType

  • 作用resultType 用于指定 MyBatis 查询操作返回的结果类型。这个属性告诉 MyBatis 应该如何将查询结果集的每一行映射到 Java 对象。
  • 使用场景:通常用在 <select> 元素中,用于定义查询结果应该如何映射到 Java 类的实例。
  • 示例:
<select id="selectBlog" resultType="Blog">select * from Blog
</select>

在这个例子中,resultType 指定了查询结果应该映射到 Blog 类的实例。

2.4.2  parameterType

  • 作用parameterType 用于指定 MyBatis 操作(如 <insert><update><delete> 或带有参数的 <select>)中传入的参数类型。这个属性告诉 MyBatis 期待的参数对象的类型,MyBatis 会根据这个类型来自动映射方法参数和 SQL 语句中的占位符。
  • 使用场景:通常用在需要传入参数执行数据库操作的元素中,例如插入、更新或删除操作。
  • 示例
<select id="selectById" parameterType="java.util.Map" resultType="com.example.Blog">select * from blog where id = #{id}
</select>

在这个例子中,parameterType 指定了方法的参数类型为 java.util.Map,这意味着你可以传递一个 Map 对象作为查询参数。

2.4.3  两者区别总结 

  • 方向parameterType 定义了进入操作的参数类型,而 resultType 定义了从数据库查询返回的结果类型。
  • 使用位置parameterType 通常用在需要参数的 SQL 操作中,resultType 则用在查询操作中。
  • 映射方式parameterType 映射的是方法的参数到 SQL 语句的占位符,resultType 映射的是查询结果集到 Java 对象的属性。

 2.4.5  占位符#{id}

在 SQL 映射文件中编写 SQL 语句时,可以使用 #{} 来引用 Java 方法的参数。

<select id="selectBlog" resultType="Blog">SELECT * FROM blog WHERE id = #{id}
</select>

在这个例子中,#{id} 就是一个占位符,它将被 MyBatis 替换为方法参数 id 的值。

参数替换

MyBatis 会根据方法的参数列表自动替换 #{} 中的内容。如果方法的参数是一个简单类型或 POJO(Plain Old Java Object),MyBatis 会根据参数的名称来替换占位符。

预处理语句

使用 #{} 占位符的 SQL 语句会被 MyBatis 转换为预处理语句(PreparedStatement),这样可以提高性能并防止 SQL 注入攻击。

类型处理

MyBatis 会根据参数的实际类型来设置 SQL 语句中的参数。例如,如果参数是 java.sql.Date 类型,MyBatis 会使用适当的 JDBC 方法来设置日期参数。

占位符总结

#{} 占位符是 MyBatis 中实现参数化查询的关键机制,它允许开发者将 Java 方法的参数值安全、灵活地传递给 SQL 语句。通过使用 #{},MyBatis 可以自动处理参数的类型转换和预处理语句的生成,从而提高数据库操作的效率和安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 爬取当当网图书榜

首先查看当当网好评书单页面&#xff0c;找到翻页的URL参数 直接用requests请求页面 resp requests.get(url) 找到想要的信息&#xff0c;使用正则表达式把这些信息提取出来 patternre.compile(list_num.*?(\d).<.*?<img src"(.*?)".*?title"(.*?…

Eel入门还有一些案例

Eel入门还有一些案例 Eel 是一个 Python 库&#xff0c;它允许 Python 程序通过简单的 API 与网页进行交互。它使用 WebSocket 协议来实现 Python 后端和 JavaScript 前端之间的实时通信。下面是关于 Eel 的用法、通信原理和使用场景的一篇博客文章。 Eel的基本原理 Eel的基本原…

针对vue3的render函数添加自定义指令

话不多说 直接上代码 主要是给h函数设置自定义指令控制 import /styles/reset.css import /styles/global.scss import uno.cssimport { createApp } from vue import App from ./App.vue import { setupRouter } from ./router import { setupStore } from ./store import …

Android studio之编译提示Could not find :umeng-asms-v1.2.1

1 、问题 Could not determine the dependencies of task :app:compileDebugJavaWithJavac. > Could not resolve all task dependencies for configuration :app:debugCompileClasspath.> Could not find :umeng-asms-v1.2.1:.Required by:project :app> Could not …

FGF14:脑部疾病新潜力靶标

成纤维细胞生长因子14&#xff08;FGF14&#xff09;是FGF11亚家族成员&#xff0c;在神经元的所有基本特性&#xff08;内在放电、兴奋性和抑制性神经元的突触传递和可塑性&#xff09;中发挥作用。 &#xff08;数据来源AlphaFold&#xff09; FGF14由247个氨基酸组成&#x…

实战篇(九):解锁3D魔方的秘密:用Processing编程实现交互式魔方

解锁3D魔方的秘密:用Processing编程实现交互式魔方 使用 Processing 创建一个 3D 魔方效果展示1. 安装 Processing2. 项目结构3. 代码实现4. 代码解释4.1. 初始化魔方4.2. 绘制魔方4.3. 处理鼠标事件4.4. 检查点击的面4.5. 旋转面和最终确定旋转5. 运行和测试6. 细节解释6.1. …

【资源调度】2-如何解决资源调度问题?

导读&#xff1a;本期是全网最全【资源调度】系列推文的第2期(共50期左右)。上期我们在《何为调度&#xff1f;》中&#xff0c;对调度的定义与作用、计划与调度的关系、调度问题的拆解做了详细介绍。从本期开始&#xff0c;我们选择【客服调度】场景作为【资源调度】问题的具象…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889_8080参考代码(v1.3)

硬件&#xff1a;STC8H8K64U/STC8051U34K64 RA8889开发板 硬件跳线变更为并口8080模式&#xff0c;PS00x&#xff0c;R143&#xff0c;R142不接&#xff0c;R141无关 8080接口电路连接图&#xff1a; 实物连接图&#xff1a; RA8889开发板外接MCU连接器之引脚定义&…

IMS架构中的注册与会话流程:RTPEngine集成及消息路由详解

目录 S-CSCF 调用 RTPengine 整体路由 注意 IMS 注册流程 和 IMS 会话流程 的区别 IMS注册流程 IMS会话流程(如INVITE请求) 这种设计的原因 P-CSCF 调用 RTPengine S-CSCF 调用 RTPengine 整体路由 UA a生成SDP offer&#xff0c;发送SIP INVITE请求(包含SDP offer)&…

核密度估计KDE和概率密度函数PDF(深入浅出)

目录 1. 和密度估计&#xff08;KDE&#xff09;核密度估计的基本原理核密度估计的公式核密度估计的应用Python中的KDE实现示例代码 结果解释解释结果 总结 2. 概率密度函数&#xff08;PDF&#xff09;概率密度函数&#xff08;PDF&#xff09;是怎么工作的&#xff1a;用图画…

RDNet实战:使用RDNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

ubuntu显卡驱动重启后失效的解决办法

写在前方&#xff1a;ubuntu系统&#xff0c;显卡重启后驱动失效&#xff0c;显卡不可用。网上冲浪之后得以有效解决&#xff0c;以下是解决方案 查看显卡nvidia-smi&#xff1b;驱动失效消息&#xff1a; (base) rootnode:~# nvidia-smi NVIDIA-SMI has failed because it c…

AI大模型走进汽车车机,智驾将是未来

车机里的AI大模型在汽车行业中的应用越来越广泛&#xff0c;主要体现在智能座舱和自动驾驶系统的深度融合上。通过将AI大模型应用于车机系统&#xff0c;可以实现更高智能化的人车交互体验。AI大模型作为人工智能发展的核心引擎&#xff0c;正在成为汽车智能化发展的关键之一。…

基于颜色模型和边缘检测的火焰识别FPGA实现,包含testbench和matlab验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将FPGA仿真结果导入到matlab显示结果&#xff1a; 测试样本1 测试样本2 测试样本3 2.算法运行软件版本 vivado2019.2 …

MySQL配置数据库的连接命令

MySQL配置数据库连接命令 在MySQL中&#xff0c;配置数据库连接的命令涉及创建用户、授予权限、配置主从复制等多个方面。以下是常用的命令及其用途&#xff1a; 创建用户 创建一个新的数据库用户并为其设置密码&#xff1a; CREATE USER usernamehost IDENTIFIED BY passwo…

mysql中的存储过程

存储过程的作用:有助于提高应用程序的性能。存储过程可以不必发送多个冗长的SQL语句 废话不说多&#xff0c;直接实操 ##实现num的相加 delimiter $$ CREATE PROCEDURE test1 () begindeclare num int default 0; -- 声明变量,赋默认值为0select num20;end $$ delimiter ; …

计算机网络高频面试题

从输入URL到展现页面的全过程&#xff1a; 用户在浏览器中输入URL。浏览器解析URL&#xff0c;确定协议、主机名和路径。浏览器查找本地DNS缓存&#xff0c;如果没有找到&#xff0c;向DNS服务器发起查询请求。DNS服务器解析主机名&#xff0c;返回IP地址。浏览器使用IP地址建立…

Kafka配置SASL认证

Kafka加密 Kafka认证方式 在本博客中我们使用SASL/PLAIN的方式来进行Kafka加密 环境准备 Kafka集群环境 请参考之前的Kafka集群搭建 kafka-broker1kafka-broker2 集群配置SASL/PLAIN认证 用户校验 修改server.properties 让其支持Kafka的认证(每一个broker节点都需要修改这…

jail内部ubuntu apt升级失败问题解决

在FreeBSD jail 里安装启动Ubuntu jammy系统&#xff0c;每次装好执行jexec ubjammy sh进入Ubuntu系统后&#xff0c;执行apt update报错。 这个问题困惑了好久&#xff0c;突然有一天仔细去看报错信息&#xff0c;查看了(man 5 apt.conf) &#xff0c;才搞定问题。简单来说就是…

MySQL 数据库(基础)- 函数

MySQL 数据库&#xff08;基础&#xff09;- 函数 介绍 函数 是指一段可以被另一段程序调用的程序或代码。也意味着&#xff0c;这一段程序或代码在 MySQL 中已经给我们提供了&#xff0c;我们需要做的就是在合适的业务场景调用对应的函数&#xff0c;完成对应的业务需求即可…