MyBatis题库详解

1、介绍下MyBatis中的工作原理

介绍MyBatis的基本情况:ORM,对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术

MyBatis框架的初始化操作

处理SQL请求的流程

系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在 Configuration 对象

@Test
public void test1() throws  Exception{
        // 1.获取配置文件
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        // 2.加载解析配置文件并获取SqlSessionFactory对象
        // SqlSessionFactory 的实例我们没有通过 DefaultSqlSessionFactory直接来获取
        // 而是通过一个Builder对象来建造的
        // SqlSessionFactory 生产 SqlSession 对象的  SqlSessionFactory 应该是单例
        // 全局配置文件和映射文件 也只需要在 系统启动的时候完成加载操作
        // 通过建造者模式来 构建复杂的对象  1.完成配置文件的加载解析  2.完成SqlSessionFactory的创建
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        // 3.根据SqlSessionFactory对象获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        // 4.通过SqlSession中提供的 API方法来操作数据库
        List<User> list = sqlSession.selectList("com.boge.mapper.UserMapper.selectUserList");
        // 获取接口的代码对象  得到的其实是 通过JDBC代理模式获取的一个代理对象
       // UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //List<User> list = mapper.selectUserList();
        System.out.println("list.size() = " + list.size());

        // 5.关闭会话
        sqlSession.close(); // 关闭session  清空一级缓存

    }
SqlSessionFactory: new DefaultSqlSessionFactory 全局配置文件的加载解析【Configuration】,映射文件的加载解析【Configuration,MappedStatement】
MappedStatement 类是 Mybatis 框架的核心类之一,它存储了一个 sql 对应的所有信息
Mybatis 通过解析 XML 和 mapper 接口上的注解,生成 sql 对应的 MappedStatement 实例,并放入 SqlSessionTemplate 中 configuration 类属性中
正真执行 mapper 接口中的方法时,会从 configuration 中找到对应的 mappedStatement,然后进行后续的操作

SqlSession:new DefaultSqlSession,创建相关的事务工厂,完成Executor的创建,已经二级缓存 CachingExecutor的装饰,同时完成了插件逻辑的植入。
selectOne(); 二级缓存 -> 一级缓存 --> 数据库查询
SqlSession.getMapper();

2、介绍下MyBatis中的缓存设计

缓存的作用

缓存的作用:减低数据源的访问频率。从而提高数据源的处理能力。或者提高服务器的响应速度

MyBatis中的缓存的架构设计:装饰器模式

MyBatis中的一级缓存和二级缓存

一级缓存:session级别

二级缓存:SqlSessionFactory级别

一级缓存和二级缓存的顺序问题:先二级缓存再一级缓存

为什么会先走二级缓存再走一级缓存?

二级缓存的作用域是SqlSessionFactory级别-90%找到

一级缓存是SqlSession级别的-5%找到

一级缓存开关、二级缓存开关

3、聊下MyBatis中如何实现缓存的扩展

创建Cache接口的实现。重新getObject和putObject方法

怎么让我们自定义的实现:在cache标签中通过type属性关联我们自定义的Cache接口的实现

4、MyBatis中涉及到的设计模式
 

从MyBatis的整体架构设计来分析

缓存模块:装饰器模式

日志模块:适配器模式【策略模式】代理模式

反射模块:工厂模式,装饰器模式

Mapping:代理模式

SqlSessionFactory :SqlSessionFactoryBuilder 建造者模式、模板方法模式

5、谈谈你对SqlSessionFactory的理解
 

SqlSessionFactory是MyBatis中非常核心的一个API。是一个SqlSessionFactory工厂。目的是创建SqlSession对象。SqlSessionFactory应该是单例。SqlSessionFactory对象的创建是通过SqlSessionFactoryBuilder来实现。在SqlSessionFactoryBuilder即完成了SqlSessionFactory对象的创建。也完成了全局配置文件和相关的映射文件的加载和解析操作。相关的加载解析的信息会被保存在Configuration对象中。

而且涉及到了两种涉及模式:工厂模式,建造者模式

6、谈谈你对SqlSession的理解


SqlSession是MyBatis中非常核心的一个API:作用是通过相关API来实现对应的数据库数据的操作。

SqlSession对象的获取需要通过SqlSessionFactory来实现。是一个会话级别的。当一个新的会话到来的时候。我们需要新建一个SqlSession对象来处理。当一个会话结束后我们需要关闭相关的会话资源。处理请求的方式:

通过相关的增删改查的API直接处理
可以通过getMapper(xxx.class) 来获取相关的mapper接口的代理对象来处理

7、谈谈你对MyBatis的理解


MyBatis应该是我们在工作中使用频率最高的一个ORM框架。持久层框架

提供非常方便的API来实现增删改查操作
支持灵活的缓存处理方案,一级缓存、二级缓存,三级缓存
还支持相关的延迟数据加载的处理
还提供了非常多的灵活标签来实现复杂的业务处理,if forech where trim set bind …
相比于Hibernate会更加的灵活

 

8、谈谈MyBatis中的分页原理

1)谈谈分页的理解:数据太多。用户并不需要这么多。我们的内存也放不下这么多的数据

SQL:
    MySQL:limit
    Oracle:rowid

2)谈谈MyBatis中的分页实现

在MyBatis中实现分页有两种实现

逻辑分页:RowBounds
物理分页:拦截器实现

九、Spring中是如何解决DefaultSqlSession的数据安全问题的


DefaultSqlSession是线程非安全的。也就意味着我们不能够把DefaultSqlSession声明在成员变量中。

在Spring中提供了一个SqlSessionTemplate来实现SqlSession的相关的定义。然后在SqlSessionTemplate中的每个方法都通过SqlSessionProxy来操作。这个是一个动态代理对象。然后在动态代理对象中通过方法级别的DefaultSqlSession来实现相关的数据库的操作

10、谈谈你对MyBatis中的延迟加载的理解


延迟加载:等一会加载。在多表关联查询操作的时候可以使用到的一种方案。如果是单表操作就完全没有延迟加载的概念。比如。查询用户和部门信息。如果我们仅仅只是需要用户的信息。而不需要用户对应的部门信息。这时就可以使用延迟加载机制来处理。

1)需要开启延迟加载

2)需要配置多表关联

  • association 一对一的关联配置
  • collection 一对多的关联配置

延迟加载的原理:代理对象

11、谈谈对MyBatis中插件的原理理解


MyBatis中的插件设计的目的是什么:方便我们开发人员实现对MyBatis功能的增强

设计中允许我们对:

Executor
ParameterHandler
ResultSetHandler
StatementHandler

这四个对象的相关方法实现增强

要实现自定义的拦截器:

创建自定义的Java类。通过@Interceptors注解来定义相关的方法签名
我们需要在对应的配置文件中通过plugins来注册自定义的拦截器
我们可以通过拦截器做哪些操作?

检查执行的SQL。比如 sql 中有select * . delete from 。。。
对执行的SQL的参数做处理
对查询的结果做装饰处理
对查询SQL的分表处理

12、使用MyBatis的mapper接口调用时有哪些要求?


MyBatis中的Mapper接口实现的本质是代理模式

Mapper映射文件的namespace的值必须是Mapper接口对应的全类路径的名称
Mapper接口中的方法名必须在mapper的映射文件中有对应的sql的id
Mapper接口中的入参类型必须和mapper映射文件中的每个sql 的parameterType类型相同
Mapper接口中的出参类型必须和mapper映射文件中的么个sql的resultType类型相同
接口名称和Mapper映射文件同名

13、如何获取MyBatis中自增的主键
 

需要获取自增的主键:在同一个事务中操作多表。我们需要关联的id信息。

<insert id="xxx" useGeneratedKeys="true" keyProperty="id">
User user = new User();
userMapper.insert(user);
System.out.println("自增的主键:id" + user.getId());

14、不同Mapper中的id是否可以相同?


可以相同:每一个映射文件的namespace都会设置为对应的mapper接口的全类路径名称。也就是保证了每一个Mapper映射文件的namespace是惟一的。那么我们只需要满足在同一个映射文件中的id是不同的就可以了

UserMapper.xml: com.boge.mapper.UserMapper #selectList

RoleMapper.xml com.boge.mapper.RoleMapper #selectList

15、谈谈你对MyBatis的架构设计的理解

接口层:面向开发者。提供相关的API

核心层:MyBatis的核心功能的实现:增删改查操作

基础模块:由很多相互之间没用关联的模块组成。作用是支持核心层来完成核心的功能

16、传统JDBC的不足和MyBatis的解决方案


我们需要频繁的创建和释放数据库库的连接对象。会造成系统资源的浪费。从而影响系统的性能,针对这种情况我们的解决方案是数据库连接池。然后在MyBatis中的全局配置文件中我们可以设置相关的数据库连接池。当然和Spring整合后我们也可以配置相关的数据库连接。
SQL语句我们是直接添加到了代码中了,造成维护的成本增加。所以对应SQL的动态性要求比较高。这时我们可以考虑把SQL和我们的代码分离,在MyBatis中专门提供了映射文件。我们在映射文件中通过标签来写相关的SQL
向SQL中传递参数也很麻烦,因为SQL语句的where条件不一定。可能有很多值也可能很少。占位符和参数需要一一对应。在MyBatis中自动完成java对象和sql中参数的映射
对于结果集的映射也很麻烦,主要是SQL本身的变化会导致解析的难度。我们的解决方案。在MyBatis中通过ResultSetHandler来自动把结果集映射到对应的Java对象中。
传统的JDBC操作不支持事务。缓存。延迟加载等功能。在MyBatis中都提供了相关的实现

17、MyBatis编程步骤是怎么样的?

创建SqlSessionFactory–》SqlSessionFactoryBuilder --》建造成模式 --》Configuration
通过创建的SqlSessionFactory对象来获取SqlSession对象 --》 Executor
通过SqlSession对象执行数据库操作 --》API和Mapper接口代理对象 --》缓存 --》装饰者模式
调用SqlSession中的commit方法来显示的提交事务 --》 数据源和事务模块 --》 JDBC和Managed
调式SqlSession中的close方法来关闭会话

18、当实体中的属性和表中的字段不一致的情况下怎么办?

我们可以在对应的SQL语句中通过别名的方式来解决这个问题

我们通过自定义resultMap标签来设置属性和字段的映射关系

19、谈谈你对MyBatis中的Executor的理解

Executor的类型有三类:

SIMPLE:默认 SimpleExecutor:每次操作都是一个新的Statement对象
REUSE: ReuseExecutor,会根据SQL缓存Statement对象。实现Statement对象的复用
BATCH: BatchExecutor 批处理

20、如何设置MyBatis的Executor类型

Executor的类型有三类:

SIMPLE:默认 SimpleExecutor:每次操作都是一个新的Statement对象
REUSE: ReuseExecutor,会根据SQL缓存Statement对象。实现Statement对象的复用
BATCH: BatchExecutor 批处理

如何指定我们需要使用的类型呢?

可以通过SqlSessionFactory的openSession方法中来指导对应的处理器类型

可以通过全局配置文件中的settings来配置默认的执行器

21、MyBatis中如何实现多个传参

循序传值

public void selectUser(String name,int deptId);

<select id="selectUser" resultMap="baseResultMap">
    select * from t_user where user_name = #{0} and dept_id= #{1}
</select>

#{}里面的数字代表的是入参的顺序,但是这种方法不建议使用,SQL层次表达不直观,而且一旦循序错了很难找到。

@Param注解传值

public void selectUser(@Param("name")String name,@Param("deptId")int deptId);

<select id="selectUser" resultMap="baseResultMap">
    select * from t_user where user_name = #{name} and dept_id= #{deptId}
</select>

#{}里面的名称对应的就是@Param注解中修饰的名称。这种方案我们是非常推荐使用的。因为很直观。

通过Map传值

public void selectUser(Map<String,Object> map);

<select id="selectUser" parameterType="java.util.Map" resultMap="baseResultMap">
    select * from t_user where user_name = #{name} and dept_id= #{deptId}
</select>

#{}里面的名称就是Map中对应的Key,这种方案适合传递多个参数,且参数灵活应变值得推荐

22、谈谈你对日志模块的理解

1)MyBatis中的日志模块使用了适配器模式

2)如果我们需要适配MyBatis没有提供的日志框架。那么对应的需要添加相关的适配类

3)在全局配置文件中设置日志的实现

4)在MyBatis的日志框架中提供了一个 jdbc 这个包。里面实现了JDBC相关操作的日志记录

23、谈谈MyBatis中能够记录SQL执行的原理


在MyBatis中对执行JDBC操作的日志记录的本质是创建了相关核心对象的代理对象

Connection – ConnectionLogger
PreparedStatement – PreparedStatementLogger
ResultSet --ResultSetLogger
本质就是通过代理对象来实现的。代理对象中完成相关的日志操作。然后再调用对应的目标对象完成相关的数据库的操作处理。

24、MyBatis中数据源模块的设计


在MyBatis中单独设计了DataSource这个数据源模块,在使用MyBatis的时候我们都需要单独的设置DataSource

完成相关的DataSource节点的解析

UnpooledDataSource:非数据库连接池的实现

PooledDataSource:数据库连接池的实现

从连接池中获取连接对象:如果有空闲连接直接返回。活跃连接数是否超过了最大连接数。是否有连接超时的连接
数据库连接池关闭连接。如果空闲连接没有超过最大连接数那么就放回空闲队列中。否则关闭真实的连接

25、MyBatis中事务模块的设计

1。谈谈你对事务的理解【ACID】

2。MyBatis中的事务的管理

事务接口的定义:定义了事务的基本行为

26、谈谈你对Mapper接口的设计理解

1)谈下MyBatis中Mapper接口对应的规则

2)谈下MyBatis中的Mapper接口的设计原理–代理模式的使用

3)代理对象执行的逻辑的本质还是会执行SqlSession中相关的DML操作的方法

4)为什么会多一个代理对象的处理

3。在MyBatis的事务管理中有两个选择

  • jdbc:在MyBatis中自己处理事务的管理
  • Managed:在MyBatis中没有处理任何的事务操作。这种情况下事务的处理会交给Spring容器来管理

4。如何设置事务管理的方式

在MyBatis中执行DML操作事务的处理逻辑

SqlSession.commit();

27、谈谈你对Reflector模块的理解


Reflector是MyBatis中提供的一个针对反射封装简化的模块:简化反射的相关操作。MyBatis是一个ORM框架。表结构的数据和Java对象中数据的映射。那么不可避免的会存在非常多的反射操作。Reflector是一个独立的模块。我们是可以把这个模块单独抽取出来直接使用的。反射模块的具体的设计

28、谈谈你对MyBatis中的类型转换模块的理解

MyBatis中是如何解决Java中的类型和数据库中字段类型的映射。

类型转换处理器的设计,TypeHandler --》 BaseTypeHandler—》具体的TypeHandler 预处理占位符赋值

29、谈谈MyBatis和Spring的整合的理解

回答的比较简单些。梳理下MyBatis和Spring整合的步骤

单纯的Spring和MyBatis的整合

在SpringBoot项目中的整合

重点分析下整合的jar包的原理,MybatisSqlSessionFactoryBean–》 这个就是我们需要关注的重点了。

30、谈谈你对MyBatis的理解

MyBatis是一个非常主流的半自动的ORM框架。非常简便的帮助我们完成相关的数据库操作。提供动态SQL,缓存和延迟加载等高级功能。然后整体的架构非常简单

外层接口
核心处理层
基础模块

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

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

相关文章

2015年认证杯SPSSPRO杯数学建模D题(第一阶段)城市公共自行车全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 D题 城市公共自行车 原题再现&#xff1a; 城市交通问题直接影响市民的生活和工作。在地形平坦的城市&#xff0c;公共自行车出行系统是一种很好的辅助手段。一般来说&#xff0c;公共自行车出行系统由数据中心、驻车站点、驻车桩、自行车&…

openlayers 入门教程(五):sources 篇

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

Memcached分布式内存对象数据库

一 Memcached 概念 Memcached 是一个高性能的分布式内存对象缓存系统&#xff0c;用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数&#xff0c;从而提高动态、数据库驱动网站的速度。 二 在架构中的位置 Memcached 处于前端或中间件后…

Vue 发送Ajax请求多种方式

1. 发送ajax请求的方式 方案一&#xff1a;jq 的ajax&#xff08;在 vue 中不推荐同时使用&#xff09;方案二&#xff1a;js 原始官方 fetch方法方案三&#xff1a;axios 第三方 2. 方案一 后端视图函数 from rest_framework.viewsets import ViewSet from rest_framework…

UE4 根据任意多个点,生成最近的线条

1.计算所有线条的组合 2.Clear0宏&#xff1a;清除掉数组Distance0的值。注意这里是设置成最大值&#xff0c;而不是使用Clear&#xff01; 3.清除掉数组中的最小值&#xff0c;避免重复生成相同长度的线条。注意这里是设置成最大值&#xff0c;而不是使用Clear&#xff01; …

python爬虫基础-----运算符(第三天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

GitHub加速访问最简单的方法

Github是全球最大的代码开源平台&#xff0c;对于编程的小伙伴来说&#xff0c;这是一个巨大的宝库&#xff0c;也是编程学习的圣地。很对小伙伴在使用GitHub时会经常出现无法访问Github的情况。 一、解决方法——>修改hosts文件 通过 IP查询工具来获取当前Github网站的真实…

全民采矿石赚钱小程序源码,附带详细搭建教程

安装教程 1、环境用宝塔Nginxphp7.0或者以下版本 2、可以更换各种模板&#xff0c;懂代码和标签的可以改模板&#xff0c;不懂的可以直接上站 3、上站前记得添加关键词和内容库 4、伪静态在绑定完百度站长之后再添加 目录说明&#xff1a; data/keyword 放关键词 标签&#xff…

【扩散模型】论文精读:Denoising Diffusion Probabilistic Models(DDPM)

文章目录 前言Abstract1 Introduction2 Background3 Diffusion models and denoising autoencoders3.1 Forward process and LT3.2 Reverse process and L1:T −13.3 Data scaling, reverse process decoder, and L03.4 Simplified training objective 4 Experiments4.1 Sample…

C语言: 指针讲解

为什么需要指针? &#xff08;1&#xff09;指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果&#xff0c;但是这样往往效率不太好&#xff0c;因为诸如结构体等大型数据&#xff0c;占用的字节数多&#xff0c;复制很消耗性能…

Linux-进程控制(进程创建、进程终止、进程等待)

一、进程创建 1.1 fork函数介绍 在命令行下我们可以通过 ./ exe文件 来创建一个进程&#xff0c;通过fork函数&#xff0c;我们可以通过代码的形式从一个进程中创建一个进程&#xff0c;新进程为子进程&#xff0c;原进程为父进程&#xff0c;子进程在创建时&#xff0c;会与…

软件项目-详细设计说明书范文参考(46页Word原件)

一、 关于本文档 &#xff08;一&#xff09; 编写目的 &#xff08;二&#xff09; 预期读者 二、 项目概要 &#xff08;一&#xff09; 建设背景 &#xff08;二&#xff09; 建设目标 &#xff08;三&#xff09; 建设内容 三、 总体设计 &#xff08;一&#xff0…

git基础-撤销操作

撤销操作 在任何阶段&#xff0c;我们都可能希望撤消某些操作。在这里&#xff0c;我们将回顾一些基本工具&#xff0c;用于撤消之前所做的更改。操作要谨慎&#xff0c;因为这些撤销可能无法修复。这是 Git 中为数不多的几个领域之一由于操作不当&#xff0c;导致丢失一些工作…

一篇文章,告别Flutter状态管理争论,问题和解决

起因 每隔一段时间&#xff0c;都会出现一个新的状态管理框架&#xff0c;最近在YouTube上也发现了有人在推signals, 一个起源于React的状态管理框架&#xff0c;人们总是乐此不疲的发明各种好用或者为了解决特定问题而产生的方案&#xff0c;比如Bloc, 工具会推陈出新&#x…

JavaParser 手动安装和配置

目录 前言 一、安装 Maven 工具 1.1 Maven 软件的下载 1.2 Maven 软件的安装 1.3 Maven 环境变量配置 1.4 通过命令检查 Maven 版本 二、配置 Maven 仓库 2.1 修改仓库目录 2.2 添加国内镜像 三、从 Github 下载 JavaParser 3.1 下载并解压 JavaParser 3.2 从路径打…

手摸手教你安装使用nvm(简单明了)

1.nvm定义 &#xff08;node.js version management&#xff09; nvm是node版本管理工具&#xff0c;通过nvm可以安装和切换不同版本的node.js 2.卸载之前安装的node 打开系统的控制面板&#xff0c;点击卸载程序&#xff0c;卸载nodejs 提示&#xff1a;如果你没有安装过…

【使用postman发送post请求】

1&#xff09;post http://ip:8090/version?appVersion1.0.0&channelgoogle&platformandroid&deviceId90991c4465e1886a81b00dac855fe098&notice1 这样子选择json格式提交数据&#xff0c;可读性强 好处&#xff1a; 1.最大的好处莫过于我可以记录下来曾经做…

使用easyYapi生成文档

easyYapi生成文档 背景1.安装配置1.1 介绍1.2 安装1.3 配置1.3.1 Export Postman1.3.2 Export Yapi1.3.3 Export Markdown1.3.4 Export Api1.3.6 常见问题补充 2. java注释规范2.1 接口注释规范2.2 出入参注释规范 3. 特定化支持3.1 必填校验3.2 忽略导出3.3 返回不一致3.4 设置…

智慧医疗包括哪些方面?智慧医疗发展前景如何?

近年来&#xff0c;随着云计算、物联网&#xff08;internet of things&#xff0c;IOT&#xff09;、移动互联网、大数据、人工智能&#xff08;artificial intelligence&#xff0c;AI&#xff09;、5G网络、区块链等新一代信息技术的逐步成熟和广泛应用&#xff0c;信息化已…

HTML(二)

一、表格标签 1.1表格的主要作用 表格主要用于显示、展示数据&#xff0c;因为它可以让数据显示的非常的规整&#xff0c;可读性非常好。特别是后台展示数据的时候&#xff0c;能够熟练运用表格就显得很重要。一个清爽简约的表格能够把繁杂的数据表现得很有条理。 1.2 表格的…