当前位置: 首页 > news >正文

Mapper与Mapper.xml的关系

简单直接的回答是:它们之间是“接口定义”与“SQL映射实现”的关系。 ManageMapper 是一个 Java 接口,它定义了数据库操作的方法签名;而 ManageMapper.xml 是一个 XML 文件,它提供了这些方法签名所对应的具体 SQL 语句实现。MyBatis 框架在运行时通过动态代理技术将它们绑定在一起。

下面我们来详细拆解这个问题,并重点解释“泛型”部分的误解。

1. 角色和关系

 
 
组件 类型 作用
ManageMapper Java 接口 1. 定义契约:声明一系列操作数据库的方法(如 selectByIdinsertupdate)。
2. 提供类型安全:方法的参数和返回值类型是明确的(例如 User selectById(Integer id))。
ManageMapper.xml XML 配置文件 1. 提供实现:为 ManageMapper 接口中定义的每一个方法,配置具体的 SQL 语句、参数映射、结果集映射等。
2. 分离SQL与代码:将易变的 SQL 语句从 Java 代码中解耦出来,便于维护和优化。

关系ManageMapper.xml 文件是 ManageMapper 接口的具体实现者。你可以把它们看作是一份合同的双方:

  • ManageMapper 接口是合同本身,列出了需要完成的任务清单。

  • ManageMapper.xml 是完成这些任务的具体施工方案。

2. 它们是如何被连接起来的?

这种连接不是通过 Java 语法实现的,而是由 MyBatis 框架在运行时完成的。这个过程主要包括以下几步:

  1. 配置扫描路径:在 MyBatis 的全局配置文件(通常是 mybatis-config.xml)或 Spring Boot 的配置中,你会设置 Mapper 接口和 XML 文件的扫描路径。

    xml
    <mappers><!-- 告诉 MyBatis 去哪里找 Mapper.xml 文件 --><mapper resource="com/example/mapper/ManageMapper.xml"/><!-- 或者使用包扫描 --><package name="com.example.mapper"/>
    </mappers>
  2. 命名空间绑定:在 ManageMapper.xml 文件中,顶层的 <mapper> 标签的 namespace 属性必须设置为 ManageMapper 接口的全限定名(包括包名的完整类路径)。这是连接两者最关键的一步。

    xml
    <!-- ManageMapper.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.example.mapper.ManageMapper"><!-- SQL 配置在这里 -->
    </mapper>
  3. ID 匹配:在 XML 中,每一个 SQL 语句标签(如 <select><insert>)的 id 属性必须与 ManageMapper 接口中定义的方法名完全一致。

    java
    // ManageMapper.java 接口
    public interface ManageMapper {User selectById(Integer id);
    }
    xml
    <!-- ManageMapper.xml 文件 -->
    <select id="selectById" parameterType="int" resultType="com.example.entity.User">SELECT * FROM user WHERE id = #{id}
    </select>
  4. 动态代理:当你的应用程序运行时,MyBatis 会读取所有配置。当你需要使用 ManageMapper 时(例如通过 @Autowired 注入),MyBatis 并不会去创建一个这个接口的实例,而是会动态生成一个代理对象

    • 这个代理对象拦截你对接口方法的调用(比如调用 selectById(1))。

    • 然后根据接口全名(namespace)+ 方法名(id) 作为键,去找到对应的 SQL 语句(SELECT * FROM user WHERE id = ?)。

    • 接着执行 SQL,并将结果集封装成接口方法所声明的返回值类型(User 对象)返回。

3. 关键澄清:关于“泛型”的误解

你提到 “Managemapper是一个泛型”,这其实是一个常见的误解。

  • ManageMapper 本身通常不是一个泛型接口(Generic Interface)。它就是一个普通的 Java 接口。

  • 你之所以会联想到“泛型”,很可能是因为你看到 MyBatis 的通用 Mapper(例如著名的 tk.mybatis.mapper.common.Mapper 或 com.baomidou.mybatisplus.core.mapper.BaseMapper)。

什么是通用 Mapper?

  • 它是一个预先定义好的、使用了泛型的接口。例如:

    java
    public interface BaseMapper<T> extends Mapper<T> {int insert(T entity);int deleteById(Serializable id);T selectById(Serializable id);// ... 很多其他通用方法
    }
  • 你的 ManageMapper 通常会继承这个通用 Mapper,并指定具体的实体类型(比如 User)。

    java
    public interface ManageMapper extends BaseMapper<User> {// 这里可以添加非通用的、自定义的查询方法User selectByUsername(String username);
    }
  • 在这种情况下,ManageMapper 接口本身因为继承了 BaseMapper<User>,所以它“带有”了泛型的特性(方法参数和返回值类型被确定为 User)。但严格来说,ManageMapper 是一个继承了泛型接口的普通接口

即使使用了通用 Mapper,其工作原理不变:
BaseMapper 中所有泛型方法(如 selectById) 的 SQL 实现,已经由 MyBatis Plus 或通用 Mapper 的作者们写在了他们提供的 jar 包中的某个 XML 文件里了。而你的 ManageMapper.xml 只需要为你自定义的方法(如 selectByUsername)提供 SQL 实现即可。如果方法在父接口中已存在且你不需要特殊实现,你甚至可以不写 ManageMapper.xml 文件。

总结

 
 
概念 解释
关系 ManageMapper.java (接口) 定义做什么ManageMapper.xml (配置文件) 定义怎么做
连接方式 通过 MyBatis 框架,利用 namespace (接口全限定名) 和 id (方法名) 进行绑定,并通过动态代理技术实现。
“泛型”误解 ManageMapper 通常不是一个泛型接口,而是一个可能继承了别人写好的泛型接口的普通接口。这种继承关系是为了获得大量开箱即用的通用数据库操作方法。

所以,ManageMapper.xml 能够“实现” ManageMapper 接口,完全是 MyBatis 这个“魔法师”在幕后施展的动态代理魔法,而不是 Java 语言层面的实现。

相关文章:

Mapper与Mapper.xml的关系

Mapper与Mapper.xml的关系简单直接的回答是:它们之间是“接口定义”与“SQL映射实现”的关系。 ManageMapper 是一个 Java 接口,它定义了数据库操作的方法签名;而 ManageMapper.xml 是一个 XML 文件,它提供了这些方法签名所对应的具体 SQL 语句实现。MyBatis 框架在运行时通…...

Rocky Linux10.0安装zabbix7.4详细步骤 - 教程

Rocky Linux10.0安装zabbix7.4详细步骤 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !i…...

【P3158】放棋子 - Harvey

题意 有 \(c\) 种棋子,每种棋子都有相应的个数,要把全部棋子放入棋盘中,使得每一行和每一列没有颜色相同的棋子,求方案数。 思路 从行和列的角度显然不好处理,所以我们可以先从颜色的种类入手。 设计 \(f_{c,i,j}\) 表示前 \(c\) 种颜色,已经有 \(i\) 行,\(j\) 列被占领…...

最强AI语音克隆和文本配音工具!与真人无异,CosyVoice下载介绍

CosyVoice是一个大规模预训练语言模型,深度融合文本理解和语音生成的一项新型语音合成技术,能够精准解析并诠释各类文本内容,将其转化为宛如真人般的自然语音 CosyVoice采用了总共超15万小时的数据训练,依托先进的大模型技术进行特征提取,从而完成声音的复刻,用户无需训练…...

近日C++线上练习结果

...

密力根油滴实验实验报告

...

Linux 系统插入U盘/移动硬盘实现自动挂载

在 /etc/udev/rules.d/ 目录下建立挂载规则 文件名后缀为 xxx.rulesKERNEL=="sd[a-z][1]", ACTION=="add", SUBSYSTEMS=="usb", SUBSYSTEM=="block", RUN{program}+="/usr/bin/systemd-mount --no-block --collect -o uid=1000,g…...

来点人瑞平我

不知道自己定位了,来帮助我找找(...

日总结 2

老师同样为学期初开了个头,没有讲什么重要是知识。我这天完成了Linux的安装和配置,完成了安装hadoop需要的环境配置和jdk的配置,为hbase的使用安装做铺垫。...

概率论第一章部分习题

...

日常 3

老师为我们讲解了真正的软件开发的环境,听完老师的讲解,我认为我需要学习C#相关的知识,扩展自已以后的选择。课余时间我完成了Hadoop的安装和环境配置,同时花了大部分时间安装配置yarn,但失败了,研究半天没发现哪里配置有问题但就是无法启动。心灰意冷,明天安装和学习hb…...

【P2051】中国象棋 - Harvey

题意 求有多少种棋盘使得每一列和每一行的棋子个数不超过 \(2\) 个。 思路 设计 \(f_{i,j,k}\) 表示前 \(i\) 行,有 \(j\) 列为 \(1\) 个棋子,\(k\) 列为 \(0\) 个棋子。考虑当前行放 \(0\) 个棋子,则有 \(f_{i,j,k} = f_{i-1,j,k}\)。 若当前行放 \(1\) 个棋子,一种可能是…...

JavaDay6

可变参数JDK1.5开始,Java支持传递同类型的可变参数给一个方法 在方法声明中,在指定参数类型后加一个省略号(...)。 一个方法只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。package method;public class Demo04 {public static void ma…...

Ubuntu Linux 云服务器常见安全漏洞修复方法汇总 Apache/OpenSSH/DNS

安全漏洞名称/CVE修复方案1. Apache HTTP Server 缓冲区错误漏洞(CVE-2023-31122)2. Apache HTTP Server 资源管理错误漏洞(CVE-2023-43622)3. Apache httpd 资源管理错误漏洞(CVE-2024-27316)4. Apache HTTP Server 代码问题漏洞(CVE-2024-38477)5. Apache HTTP Serve…...

AI智能体开发实战:从提示工程转向上下文工程的完整指南

还记得去年各大公司给提示工程师开出30万美元年薪的疯狂时期吗?现在这些招聘信息基本销声匿迹了。从技术角度看,提示工程确实有些"投机取巧"的意味——本质上就是让人们相信自己在做"工程"工作的华丽包装。 不过现在情况完全不同了。人们开始把传统软件工…...

解码C语言九条语句

选择结构 if 一、基本语法 if (条件表达式) { // 条件为真时执行的代码块 } else { // 条件为假时执行的代码块(可选) }二、条件表达式的本质条件表达式可以是任何返回整型值的表达式:0 表示假(false)。 非0 表示真(true)。示例: if (5) { ... }// 条件为真(非0) if …...

多个 root 用户记录,而且有些记录的密码是空的,导致认证混乱。

多个 root 用户记录,而且有些记录的密码是空的,导致认证混乱。 留言:之前再讲mysql时候,经常有人可以远程登录的时候,结果发现没办法本地登录了,具体体现方式是这样的(看问题体现):现在我可以明确的告诉你们,是你们的root认证太多了,系统无法识别你要的是哪一个root,…...

django登录注册案例(上) - 详解

django登录注册案例(上) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fo…...

从C++开始的编程生活(10)——string类核心语法和auto自动推导类型

从C++开始的编程生活(10)——string类核心语法和auto自动推导类型pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New…...

某交互题选讲的补题记录

CF750F New Year and Finding Roots 考虑第一步只能随机找点,找完点之后除非找到叶子或者根,不然完全等于啥都不知道。 于是找叶子节点,从这个点的两个邻边往下一直走一定能走到叶子,那么此时这条链的中点的父亲就被确定了。 多这么整几次,一直往上跳就肯定能找到根,但操…...

openwrt ipv6 NAT6配置

在诸如校园网或者其他需要认证的网络条件下,由于实名制上网的要求,通常不支持DHCP6-PD,因此要使用IPV6需要使用NAT6目前最新版本的官方openwrt(23.05)已经自动支持NAT6了(firewall.xxx.masq6),因此,如果需要开启ipv6,不再需要复杂的安装各种包,直接LuCI网页操作即可。发…...

奶龙抽象语录

奶龙の无上恩情!!!开坑于 $ 2025-9-15 $ 最后更新于 $ 2025-9-17 $上课 班会 我们为什么要规范普通话,不就跟当年秦始皇车同文,书同轨一样吗? —— 25-9-16 其他 我们班五十几号人,我也不要求别的,声音比\(11\)班(人口60+)大就行了。 —— 25-8-31...

解题报告-P11670 [USACO25JAN] Cow Checkups S

P11670 [USACO25JAN] Cow Checkups S 题目描述 Farmer John 的 \(N\)(\(1 \leq N \leq 5 \cdot 10^5\))头奶牛站成一行,奶牛 \(1\) 在队伍的最前面,奶牛 \(N\) 在队伍的最后面。FJ 的奶牛也有许多不同的品种。他用从 \(1\) 到 \(N\) 的整数来表示每一品种。队伍从前到后第 …...

word vba 对 带编号格式的PO单 段落下添加对应的图片

Attribute VB_Name = "APO_PathStaging" Option Explicit Configuration Constants Private Const BASE_FOLDER As String = "\\10.0.0.10\部门共享\PO\" Private Const START_PARA As Long = 582 Private Const PATH_TAG As String = "[IMG] " …...

解题报告-P11671 [USACO25JAN] Farmer Johns Favorite Operation S

P11671 [USACO25JAN] Farmer Johns Favorite Operation S 题目描述 又是 Farmer John 的农场上寒冷而无聊的一天。为了打发时间,Farmer John 发明了一种关于在整数数组上进行操作的有趣的休闲活动。 Farmer John 有一个包含 \(N\)(\(1 \leq N \leq 2 \cdot 10^5\))个非负整数…...

解码C语言运算符

算术运算符运算符 描述 示例 结果+ 加法 5 + 3 8- 减法 5 - 3 2* 乘法 5 * 3 15/ 除法 5 / 2 2% 取模 5 % 2 1++ 自增 a++ a+1-- 自减 a-- a-1注意:整数除法会截断小数部分 取模运算只能用于整数类型关系运算符运算符 描述 示例 结果== 等于 5 == 3 0!= 不等于 5 != 3 1> 大…...

多进程

import time from concurrent.futures import ProcessPoolExecutor, TimeoutError from pydantic import BaseModel import multiprocessing as mp import os import signalclass SharedData(BaseModel):value: int = 0def worker(shared_value, data_dict):# 真实场景中的任务…...

93. 递归实现组合型枚举

93. 递归实现组合型枚举 if (sum + n - u < m) return; 如果当前记录的数据 加上 后面的所有可以被选的数据 时无法达到要求时终止 state记录了哪些数据被选,哪些没被选的 state | 1 << u 选择当前的数据,比如0101 -> 10101 #include <iostream> using n…...

Sort方法学习(伪代码记录)

Sort 方法总结 selectionSort(vector& a) 核心思想:选择最大/小的数移到最前/后 // 1. 计算数组长度// 2. 控制已排序部分的边界 for(i=0; i<n; i++){// 3. 在未排序部分(j到末尾)中寻找真正的maxfor(j=i+1, j<n; j++) find(max);// 3. 将最大的数放至数组头swap(…...

深入解析:【每日一问】运算放大器与比较器有什么区别?

深入解析:【每日一问】运算放大器与比较器有什么区别?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…...

9.17支配对问题专题总结

概括 每次查询一定范围内的点组成的点对中的最优值,而通过一些分析去减少有用点对的数量,这样子的有用点对称为 支配对 T1策略是将 \(a_i\) 相同的序列取出来单独考虑 固定 \(b_i<b_j,i<j\) 然后考虑能找出来一个序列 \(i,j1,j2,j3...\) 但是发现选 \(i,j2\) 不如选 \(…...

Xじゃないか

並行じゃないか いや 通信じゃないか わかりあえなくて 愛じゃないか ——絡みなんです それがAIなんです。\[\newcommand{\c}{\mathcal} \newcommand{\eps}{\epsilon} \newcommand{\co}[2]{{\color{#1}{#2}}} \]Lec 1 数据越来越多,我们该怎么办?并且,这其中绝大部分 (…...

开源收银体系_大型收银系统源码_OctShop

开源收银体系_大型收银系统源码_OctShoppre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importa…...

XXL-JOB(2)

XXL-JOB(2)1、入门和集成<!-- xxl-job-core --><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.5.0</version></dependency> 搭建控制台 XXL-JOB-ADMIN jar 本地启动,…...

P9753 [CSP-S 2023] 消消乐

前置算法动态规划 hash哈希题目大意 给定一个字符串,可以将相邻两个相同的字符删除,然后合并成一个新序列。 例如:abba,可以先将两个 b 删除,然后合并成 aa,最后删除 a。 求出有多少个字串,最后可以将其变为空串,我们称之为合法的字串。 思路 看到数据范围,只能使用 \…...

9.16 CSP-S模拟22 改题记录

HZOJ 写在前面 连着两天吃了两坨。。。好吧,那就一坨一坨地消化一下吧。话说如果这真是S组难度那我不真就废了?这场真是T1猜结论题,T2就来坨大的,不知道啥是二分图暴力都不会打。T3反正就是我是大春竹。T4上演忘记结论创造结论,然鹅实际上还是不会写。没有文件输入输,没有…...

记录知识

记录知识...

AT_agc058_b [AGC058B] Adjacent Chmax

转化为对某个区间染色,然后设 \(f_{i, j}\) 为前 \(i\) 种颜色染了 \([1, j]\) 的方案数,简单转移即可。...

Jenkins CVE-2018-1000600漏洞利用与SSRF攻击分析

本文详细分析了Jenkins GitHub插件CVE-2018-1000600漏洞的利用方法,通过CSRF漏洞和权限缺失实现凭证窃取与完全响应SSRF攻击,包含PoC代码和影响版本范围说明。Jenkins - CVE-2018-1000600 PoC 来源博客文章 https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with…...

NOIP 集训日记(学术)

workwork学术版。 9.9 P4117 [Ynoi2018] 五彩斑斓的世界 分块神题。 拿到题以后发现不能直接做,然后你就开始观察。 设区间最大值为 \(maxn\) ,查询的数为 \(x\) 一个显然的性质:把所有小于等于 \(x\) 的数加上 \(x\) ,然后区间减 \(x\) ,得到的结果不变。然后我们思考一下…...

linux中mysql如何远程连接

linux中mysql如何远程连接 两个步骤: 第一:让root允许远程登录 update user set host = % where user = root;第二:给予root用户最大数据库权限 grant all privileges on *.* to root@% identified by 123456; flush privileges;实操: [root@bogon ~]# mysql -uroot -p1234…...

详细介绍:Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测

详细介绍:Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …...

深入解析:PYcharm——pyqt音乐播放器

深入解析:PYcharm——pyqt音乐播放器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important…...

专题:Python实现贝叶斯线性回归与MCMC采样数据可视化分析2实例|附代码数据

全文链接:https://tecdat.cn/?p=43897原文出处:拓端抖音号@拓端tecdat在数据科学领域,线性回归是拟合变量间线性关系的基础工具,但传统的Frequentist线性回归仅能提供参数的点估计,无法量化参数的不确定性——这在金融风险预测、工业设备状态监测等实际业务场景中往往不够…...

威联通NAS如何导入本地docker镜像

威联通NAS如何导入本地docker镜像 【前言】:有一段时间没有维护NAS docker了,笔记本电脑坏了更换后重新配置开发环境,也就没去折腾这些,有些命令忘记了,重新整理一下,输出驱动输入,还可能帮助到。欢迎大家一起友好讨论, 祝好: 【摘要】:本文主要围绕威联通NAS如何导入…...

2025.9.17

卷2选择 位运算 位运算的优先级很低,没有括号时运算顺序靠后。...

mysql库缺失

mysql库缺失libncurses.so.5和libtinfo.so.5 报错信息: mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory;mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared obj…...

flask简单路由(视图函数)

简单路由(视图函数) 简单返回html @app.route(/tmp) def tmp_page(): # 函数名为tmp_page,对应url_for(tmp_page)return render_template(tmp.html)@app.route(/Custom_routing) def Custom_routing_page(): return render_template(/Custom_routing/index.html) # Custom…...

【学习笔记】拉格朗日插值

EZ、什么是拉格朗日插值? 众所周知,\(n+1\) 个点可以唯一确定一个 \(n\) 次多项式。 拉格朗日插值法要解决的就是给定 \(n+1\) 个点确定一个多项式 \(f(x)\),求出在自变量 \(x=k\) 时多项式的取值。 拉格朗日插值法的思想和 CRT 非常像——把每一个维度独立拆开来。 考虑对一…...

一种基于动作指令交互的动态活体检测技术,提升人脸识别安全性

在当今数字化时代,人脸识别技术已广泛应用于金融支付、门禁考勤、手机解锁等关键场景,其便捷性深受用户青睐。然而,随之而来的安全风险也日益凸显:高精度的照片、屏幕翻拍、甚至3D面具等攻击手段层出不穷,令传统的静态人脸识别技术面临严峻挑战。为了构筑更加坚固的安全防…...