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

1.  前言

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

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

<?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.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.mfbz.cn/a/785089.html

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

相关文章

【回溯 - 1】46. 全排列

46. 全排列 难度&#xff1a;中等 力扣地址&#xff1a;https://leetcode.cn/problems/permutations/description/ 问题描述 给定一个 不含重复数字 的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nu…

ICMP隧道

后台私信找我获取工具 目录 ICMP隧道作用 ICMP隧道转发TCP上线MSF 开启服务端 生成后门木马 msf开启监听 开启客户端icmp隧道 执行后门木马&#xff0c;本地上线 ICMP隧道转发SOCKS上线MSF 开启服务端 生成后门木马 msf开启监听 开启客户端icmp隧道 ​执行后…

经常用借呗和花呗对征信有影响吗?

说起支付宝里的花呗和借呗&#xff0c;大伙儿肯定都不陌生&#xff0c;它们俩就像是支付宝里的信用贷款双胞胎&#xff0c;名字相近&#xff0c;性格却大相径庭。现在&#xff0c;这俩兄弟都乖乖地接入了央行的征信大家庭&#xff0c;你的每一次使用&#xff0c;都会被记录得清…

老师怎么快速发布成绩?

期末考试的钟声刚刚敲响&#xff0c;成绩单的发放却成了老师们的一大难题。每当期末成绩揭晓&#xff0c;老师们便要开始一项繁琐的任务——将每一份成绩单逐一私信给家长。这不仅耗费了大量的时间和精力&#xff0c;也让本就忙碌的期末工作变得更加繁重。然而&#xff0c;随着…

生产力工具|Endnote X9如何自动更新文件信息

一、以EndNote X9.2版本为例&#xff0c;打开EndNote文献管理软件。 二、在菜单栏找到“Edit→Preferences...”&#xff0c;点击打开&#xff0c;弹出一个“EndNote Preferences”窗口。 三、进行设置 在打开的窗口左侧选择“PDF Handing”&#xff0c;右边会出现自动导入文献…

SwiftUI知识点(二)

Animation import SwiftUIstruct AnimationBootcamp: View {State var isAnimation: Bool falsevar body: some View {VStack{Button("Button"){withAnimation(Animation.default//重复//autoreverses: true&#xff1a;A-B-A-B//false: A-B&#xff0c;A-B.repeat…

[图解]SysML和EA建模住宅安全系统-13-时间图

1 00:00:00,480 --> 00:00:02,280 首先&#xff0c;我们来看&#xff0c;图画在哪里 2 00:00:02,290 --> 00:00:04,380 这个图 3 00:00:04,390 --> 00:00:06,180 你看&#xff0c;它是描述&#xff0c;刚才讲的 4 00:00:06,190 --> 00:00:09,010 描述这个活动 …

STM32学习历程(day5)

EXTI外部中断 中断 中断就是在主程序运行过程中 出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;CPU会暂停当前的程序&#xff0c;去处理中断程序 处理完会返回被暂停的位置 继续运行原来的程序。 中断优先级 当有多个中断源同时申请中断时 CPU会根据…

设计模式之职责链模式(Chain of Responsibility Pattern)

1.概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;&#xff1a;避免将请求发送者与接收者耦合在一起&#xff0c;让多个对象都有机会接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止…

单例模式(大话设计模式)C/C++版本

单例模式 C 饿汉 /* HM hungry man 饿汉 */ #include <iostream> using namespace std; class Singleton { private:Singleton() { cout << "单例对象创建&#xff01;" << endl; };Singleton(const Singleton &);Singleton &operator(c…

【ARMv8/v9 GIC 系列 2.4 -- GIC SGI 和 PPI 中断的启用配置】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC SGI 和 PPI 中断的使能配置GICR_ISENABLER0 操作使用举例SummaryGIC SGI 和 PPI 中断的使能配置 GICR_ISENABLER0寄存器(中断设置-使能寄存器0)用于启用相应的SGI(软件生成中断)或PPI(专用外设中断)向CPU接口的转发。每个…

Android多开应用软件系统设计

设计一个支持Android多开应用的软件系统&#xff0c;主要涉及到以下几个关键技术点和设计考虑&#xff1a; 1. 虚拟化技术 容器技术&#xff1a;与传统的虚拟机不同&#xff0c;可以采用更轻量级的容器技术&#xff0c;为每个应用实例创建独立的运行环境。这包括分配独立的用…

atcoder 357 F Two Sequence Queries (线段树板子)

题目&#xff1a; 分析&#xff1a; 线段树 代码&#xff1a; // Problem: F - Two Sequence Queries // Contest: AtCoder - SuntoryProgrammingContest2024&#xff08;AtCoder Beginner Contest 357&#xff09; // URL: https://atcoder.jp/contests/abc357/tasks/abc357_…

AI实时免费在线图片工具6:以图生相似图

1、以图生图&#xff0c;生成相似图 https://huggingface.co/spaces/diffusers/unofficial-SDXL-Turbo-i2i-t2i 间接实现&#xff1a;可以是图片先提取描述&#xff0c;再通过描述再去生成新图片 https://huggingface.co/spaces/gokaygokay/KolorsPlusPlus

JAVA基础-----128陷阱

一、何为128陷阱 Java中Integer类型在使用比较时的特殊行为------128陷阱&#xff0c;解释了当数值在-128到127范围内&#xff0c;由于valueOf方法的缓存机制导致地址相同&#xff0c;比较为真&#xff1b;超出这个范围则新分配内存&#xff0c;地址不同&#xff0c;比较为假。…

动态数据库设计

动态数据库设计是一种灵活的方法&#xff0c;用于构建能够适应不断变化的数据需求的数据库结构。它强调在不频繁修改数据库表结构的前提下&#xff0c;有效管理和存储多样化的数据。以下是实现动态数据库设计的一些关键技术点和策略&#xff1a; 实体-属性-值&#xff08;EAV&a…

安卓项目中so库选择

接上篇Android中常见SDK类型区别-CSDN博客 一些重要的加密算法或者核心协议一般都在C中编写&#xff0c;然后给java调用。这样可以避免反编译后查看到应用的源码。此时就需要了解一下NDK中的ABI&#xff08;Application Binary Interface的缩写&#xff0c;也就是应用二进制接…

代谢组数据分析一:代谢组数据准备

介绍 该数据集是来自于Zeybel 2022年发布的文章_Multiomics Analysis Reveals the Impact of Microbiota on Host Metabolism in Hepatic Steatosis_ [@zeybel2022multiomics],它包含了多种组学数据,如: 微生物组(粪便和口腔) 宿主人体学指标 宿主临床学指标 宿主血浆代谢…

8.8.8.8 IP地址的作用

在跟着韦东山老师的学习手册中看见了关于8.8.8.8 IP用于检测网络状态&#xff0c;然后搜索了关于此IP的相关作用如下&#xff1a; 公共DNS服务&#xff1a;8.8.8.8是Google提供的两个公共DNS服务器地址之一&#xff08;另一个是8.8.4.4&#xff09;。DNS&#xff08;域名系统&a…

GNN Algorithms(9): LLM Prompts--p-tuning、LoRA

目录 1. prompt-tuning background 2. Prompt Tuning 模型介绍 2.1 2021 prefix-tuning 2.2 2021 P-tuning v1 2.3 2021 Parameter-efficient prompt tuning (PET) 2.4 2022 P-tuning v2 2.5 2019 Adapter ​2.6 2021 LoRA (Low-Rank Adaptation) 2.7 2024 DoRA (…