文章目录
一、使用篇
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等分布式缓存可能成本更低,安全性也更高。