mybatis面试题汇总

一、使用篇

1.简单介绍下Mybatis,以及为什么要使用它

介绍:mybatis是一个半ORM框架,本质就是对JDBC的封装,把次要的代码逻辑封装,把重要的代码逻辑(与数据库交互)提供给用户使用。
优点:(1)是半ORM框架,支持对象与数据库的ORM字段关系映射,能比较高效的管理资源,相比使用ORM框架的Hibernate,mybatis的学习门槛更低,且较为灵活
(2)在使用mybatis时,能省去很多次要的代码,减少代码冗余

ORM框架介绍:Object Relational Mapping,采用元数据来描述对象与关系映射的细节。
Hibenate是全自动直接通过对象关系模型获取,是orm框架;
mysql需要手动编写sql,是半orm框架。

2.在注入参数时,#和$有什么区别,哪个会导致sql注入,怎么解决sql注入问题

(1)区别: # 是预编译,在执行sql的时候才会将参数替换;而 $ 是直接替换生成sql,故 $ 有sql注入风险
(2)sql注入解决:尽量使用 # 来代替 $ ,对于那种常用 $ 的地方,比如like ‘%${user_name}%’
可以改成like CONCAT(‘%’,#{user_name},‘%’);
当不确定拼一个或多个字符串时,可以用foreach标签组合CONCAT实现

3.简述mapper中namespace的作用

在MyBatis中,Mapper中的namespace用于绑定Dao接口的,即面向接口编程。
它的好处在于当使用了namespace之后就可以不用写接口实现类,业务逻辑会直接通过这个绑定寻找到相对应的SQL语句进行对应的数据处理。

4.介绍一下Mybatis的一级缓存、二级缓存

(1)MyBatis缓存介绍:Mybatis缓存是基于PrepatualCache的HashMap本地缓存,当数据进行了增、删、改时,会将作用域的缓存全部清除。
(2)一级缓存、二级缓存
一级缓存:本地缓存,自动开启,作用域是session。
一级缓存机制:一级缓存是默认开启的,它在一个sqlSession会话里面的所有查询操作都会保存到缓存中,同一个sqlSession会话中2 个查询中间有一个 insert 、update或delete 语句,那么之前查询的所有缓存都会清空
一级缓存失效:使用了不同sqlSession;同一session不同查询条件;两次查询间数据修改了

二级缓存:全局缓存,作用域为Mapper,是针对一张表的存储。通过settings标签开发二级缓存。
使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态)。
二级缓存机制:缓存会先放在一级缓存中,当sqlSession会话提交或者关闭时才会将一级缓存刷新到二级缓存中;开启二级缓存后,用户查询时,会先去二级缓存中找,找不到再去一级缓存中找;

<setting name="cacheEnabled" value="true"/>

(3)使用场景
①MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。
②MyBatis在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用二级缓存的条件比较苛刻。
③在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将MyBatis的Cache接口实现,有一定的开发成本,直接使用Redis,Memcached等分布式缓存可能成本更低,安全性也更高。

二、源码篇(持续更新)

1.Mybatis的工作原理

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值