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

大厂Java面试题:MyBatis中有几种加载映射器(Mapper.xml)的方式?

大家好,我是王有志。

今天给大家带来的是一道来自京东的 MyBatis 面试题:MyBatis 中有几种加载映射器(Mapper.xml)的方式?

常见加载 MyBatis 映射器的方式有 5 种,可以根据不同的使用方式来进行具体区分:

  • MyBatis 原生应用,即不与 Spring 或 Spring Boot 集成,可以通过配置文件和 Java 编码的方式加载映射器;
  • MyBatis 与 Spring 集成,可以通过加载 Spring Bean 的方式完成 MyBatis 映射器的加载;
  • MyBatis 与 Spring Boot 集成,可以通过@MapperScan@Mapper注解完成 MyBatis 映射器的加载。

下面,我们来具体看下每种方式是如何加载 MyBatis 映射器的。

原生 MyBatis 应用

原生 MyBatis 应用中(即不与 Spring 或 Spring Boot 集成的 MyBatis 应用),可以通过两种方式加载映射器(Mapper.xml):

  • 通过 myabtis-config.xml 加载映射器;
  • 通过 Java 编码的方式加载映射器。

通过 mybatis-config.xml 加载映射器

与 MyBatis入门中实现的简单例子一样,只需要在 mybatis-config.xml 中配置映射器即可:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!-- 省略环境配置 --><mappers><mapper resource="mapper/UserMapper.xml"/><mapper resource="mapper/CompanyMapper.xml"/></mappers>
</configuration>

通过 Java 编码的方式加载映射器

MyBatis入门中的附录中同样有相关的例子:

DataSource dataSource = new PooledDataSource("com.mysql.cj.jdbc.Driver", "jdbc:mysql://localhost:3306/mybatis", "root", "123456");
TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);// 加载映射器
configuration.addMapper(UserMapper.class);

如果希望加载某个包下的全部 Mapper.xml,可以使用Configuration#addMappers进行加载:

configuration.addMappers("com.wyz.mapper");

MyBatis 与 Spring 集成

MyBatis 与 Spring 集成后,可以通过加载 Bean 的方式加载 MyBatis 的映射器(Mapper.xml),我们还是按照 MyBatis入门中的步骤,先完成 Java 对象 UserDO,Java 接口 UserMapper 的创建,接着是编写 MyBatis 的映射器 UserMapper.xml,最后我们还需要引入相关依赖:

<dependencies><!-- 省略 MySQL,junit等依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>6.1.4</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.1.4</version></dependency>
</dependencies>

接下来我们通过注入 Spring Bean 的方式来加载 Mapper.xml,这里我们创建 spring-beans.xml 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="123456"/></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="mapper/UserMapper.xml"/></bean><!-- 通过 Spring Bean 的方式加载 MyBatis 映射器--><bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="com.wyz.mapper.UserMapper"/><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean>
</beans>

最后我们来测试:

package com.wyz.mapper;import com.wyz.entity.UserDO;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.List;@Slf4j
public class UserMapperTest {@Testpublic void test(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-beans.xml");UserMapper userMapper = applicationContext.getBean("userMapper", UserMapper.class);List<UserDO> users = userMapper.selectAll();for(UserDO user : users) {System.out.println(user.toString());}}
}

MyBatis 与 Spring Boot 集成

MyBatis 与 Spring Boot 集成后,可以通过注解的方式或配置文件的方式加载 MyBatis 的映射器(Mapper.xml),使用起来非常的方便。
首先,我们还是做好前期的准备,创建 Java 对象 UserDO,Java 接口 UserMapper,MyBatis 的映射器文件 UserMapper.xml,接着我们来写 Spring Boot 的配置文件,主要完成数据库相关的配置:

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatisusername: rootpassword: 123456

通过 @MapperScan 注解加载映射器

我们需要在 Spring Boot 应用的启动类上使用@MapperScan注解,并扫描 Mapper 文件所在的包来加载 MyBatis 的映射器:

package com.wyz;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.wyz.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

最后我们来进行测试:

package com.wyz.mapper;import com.wyz.entity.UserDO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
public class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testpublic void test() {List<UserDO> users = userMapper.selectAll();for(UserDO user : users) {System.out.println(user.toString());}}
}

通过 @Mapper 注解加载映射器

除了使用@MapperScan注解加载某些包下的映射器外,还可以为每个映射器接口添加@Mapper接口来加载映射器,我们把 Spring Boot 启动类上的@MapperScan注解删除,为 UserMapper 接口添加@Mapper注解:

package com.wyz.mapper;import com.wyz.entity.UserDO;import java.util.List;public interface UserMapper {List<UserDO> selectAll();
}

好了,今天的内容就到这里了,如果本文对你有帮助的话,希望多多点赞支持,如果文章中出现任何错误,还请批评指正。最后欢迎大家关注分享硬核 Java 技术的金融摸鱼侠王有志,我们下次再见!

相关文章:

大厂Java面试题:MyBatis中有几种加载映射器(Mapper.xml)的方式?

大家好&#xff0c;我是王有志。 今天给大家带来的是一道来自京东的 MyBatis 面试题&#xff1a;MyBatis 中有几种加载映射器&#xff08;Mapper.xml&#xff09;的方式&#xff1f; 常见加载 MyBatis 映射器的方式有 5 种&#xff0c;可以根据不同的使用方式来进行具体区分&…...

Flutter笔记:Widgets Easier组件库(10)快速处理承若型对话

Flutter笔记 使用Widgets Easier组件库快速处理承若型对话 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://…...

10_Linux中的计划任务

10_Linux中的计划任务 常见计划任务 Linux系统中默认在执行的计划任务 日志文件的轮询:logrotate日志文件分析logwatch任务建立locate数据库建立manpage查询数据库RPM软件日志文件删除缓存与网络有关的分析 仅执行一次的计划任务 atd和at [rootnode4 ~]# systemctl start…...

Google Play开发者账号为什么会被封?如何解决关联账号问题?

Google Play是Google提供的一个应用商店&#xff0c;用户可以在其中下载并安装Android设备上的应用程序、电影、音乐、电子图书等。Google Play是Android平台上较大的应用市场&#xff0c;包含了数百万个应用程序和游戏。但是谷歌对于上架应用的审核越趋严格&#xff0c;开发者…...

(第12天)【leetcode题解】151、反转字符串中的单词

目录 151、反转字符串中的单词题目描述思路代码本题反思 151、反转字符串中的单词 题目描述 给你一个字符串 s &#xff0c;请你反转字符串中单词的顺序。 单词是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的单词分隔开。 返回单词顺序颠倒且单词之间用单个…...

如何处理多模态数据噪声不均衡动态?天大等最新《低质量数据的多模态融合》综述

多模态融合致力于整合来自多种模态的信息&#xff0c;目的是实现更准确的预测。在包括自动驾驶和医疗诊断等广泛的场景中&#xff0c;多模态融合已取得显著进展。然而&#xff0c;在低质量数据环境下&#xff0c;多模态融合的可靠性大部分仍未被探索。本文综述了开放多模态融合…...

Autosar NvM配置-手动配置Nvblock及使用-基于ETAS软件

文章目录 前言NvDataInterfaceNvBlockNvM配置SWC配置RTE Mapping使用生成的接口操作NVM总结前言 NVM作为存储协议栈中最顶层的模块,是必须要掌握的。目前项目基本使用MCU带的Dflash模块,使用Fee模拟eeprom。在项目前期阶段,应该充分讨论需要存储的内容,包括应用数据,诊断…...

【c++算法篇】双指针(下)

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;算法笔记仓 朋友们大家好啊&#xff0c;本篇文章我们来到算法的双指针的第二部分 目录 1.有效三角形的个数2.查找总价格为目标值的两个商品3.三数之和4.四数之和5.双指针常见场景总结 1.有效三角形…...

微图乐 多种装B截图一键制作工具(仅供娱乐交流)

软件介绍 采用exe进程交互通信。全新UI界面&#xff0c;让界面更加清爽简约。支持zfb、VX、TX、Yin行、Dai款、游戏等图片生成&#xff0c;一键超清原图复制到剪辑板&#xff0c;分享给好友。适用于提高商家信誉度&#xff0c;产品销售额度。装逼娱乐&#xff0c;用微图乐。图…...

基于Springboot的点餐平台

基于SpringbootVue的点餐平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页展示 菜品信息 菜品资讯 购物车 后台登录 用户管理 菜品分类管理 菜品信息管理 …...

C# 获取一个字符串中非数字部分?

方法一&#xff1a;使用正则表达式 使用正则表达式可以便捷地匹配并提取出字符串中所有非数字字符。与之前保留数字时的做法相反&#xff0c;这次我们将匹配数字并替换为空字符串&#xff0c;从而留下非数字部分。 using System; using System.Text.RegularExpressions;publi…...

今日总结2024/5/7

今日复习LIS二分优化的使用 P2782 友好城市 确定一边城市排序完后&#xff0c;另外一边满足坐标上升的最大数目即是桥的最大个数 为上升子序列模型 #include <iostream> #include <algorithm> #include <utility> #define x first #define y second cons…...

爬虫学习(3)豆瓣电影

代码 import requests import jsonif __name__ "__main__":url https://movie.douban.com/j/chart/top_list#post请求参数处理&#xff08;同get请求一致&#xff09;headers {"User-Agent": Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53…...

GNU Radio创建FFT、IFFT C++ OOT块

文章目录 前言一、GNU Radio官方FFT弊端二、创建自定义的 C OOT 块1、创建 OOT 模块2、创建 OOT 块3、修改 C 和 CMAKE 文件4、编译及安装 OOT 块 三、测试1、grc 图2、运行结果①、时域波形对比②、频谱图对比 四、资源自取 前言 GNU Radio 自带的 FFT 模块使用起来不是很方便…...

125.两两交换链表中的节点(力扣)

题目描述 代码解决及思路 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), …...

APP精准推送广告是怎么做到的?

你有没有遇到这种情况&#xff0c;刚和家人聊起五一去哪玩&#xff0c;各种软件就刷到各地旅游景点。刚和朋友说到健身计划&#xff0c;转眼间网购平台就给你推荐各种健身用品&#xff0c;这些软件是如何知道我们的需求&#xff0c;难道我们的手机被监听了&#xff1f;从技术上…...

RapidJSON介绍

1.简介 RapidJSON 是一个 C 的 JSON 解析库&#xff0c;由腾讯开源。 支持 SAX 和 DOM 风格的 API&#xff0c;并且可以解析、生成和查询 JSON 数据。RapidJSON 快。它的性能可与strlen() 相比。可支持 SSE2/SSE4.2 加速。RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至…...

大型企业总分支多区域数据传输,效率为先还是安全为先?

大型企业为了业务拓展需要&#xff0c;会在全国乃至全球各地设立分公司和办事机构&#xff0c;以便更好地处理当地事务&#xff0c;并进行市场的开拓和客户维护&#xff0c;此时&#xff0c;企业内部就衍生出了新的业务需求&#xff0c;即多区域数据传输。 多区域很难准确定义&…...

C语言例题35、反向输出字符串(指针方式),例如:输入abcde,输出edcba

#include <stdio.h>void reverse(char *p) {int len 0;while (*p ! \0) { //取得字符串长度p;len;}while (len > 0) { //反向打印到终端printf("%c", *--p);len--;} }int main() {char s[255];printf("请输入一个字符串&#xff1a;");gets(s)…...

场景文本检测识别学习 day09(Swin Transformer论文精读)

Patch & Window 在Swin Transformer中&#xff0c;不同层级的窗口内部的补丁数量是固定的&#xff0c;补丁内部的像素数量也是固定的&#xff0c;如上图的红色框就是不同的窗口&#xff08;Window&#xff09;&#xff0c;窗口内部的灰色框就是补丁&#xff08;Patch&#…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...