1.mybatis中的#{}和${}的区别?
答:
定义:#{}是预编译。
作用:mybatis处理#{}时,sql会将它替换成?,然后调用PreparedStatement的set方法来赋值;还可以防止sql注入。
注释:sql注入是一种注入攻击,可以执行恶意的sql语句。是通过sql代码插入数据库查询,使得攻击者可以控制web应用服务后面的数据库服务器,可以对数据库进行一些操作。比如添加,修改和删除数据库中的数据。
定义:${}字符串替换。
作用:mybatis处理${}时,sql会将它替换成变量的值。
2.mybatis有几种分页方式?
答:有四种,分别是数组分页,sql分页,拦截器分页,Rowbounds分页。
3.mybatis的物理分页与逻辑分页的区别?
答:
定义:物理分页是依赖于某个物理实体,这个实体就是数据库,例如mysql数据库提供的limit关键字,程序员编写关于limit关键字的查询语句,数据库就会返回分页结果。
定义:逻辑分页是程序员编写的代码,数据库返回的不是分页结果,而是全部数据,然后程序员通过代码获取分页数据。常用操作就是一次性查询全部数据存放到list集合,然后通过索引获取指定范围的数据,
两者对比:
- 数据库的负担:因为物理分页每一次查询的会访问数据库,而逻辑分页只查询一次数据库,所以物理分页对数据库造成的负担更大。
- 服务器负担:逻辑分页是一次性将数据读取到内存中,占用了较大的内存空间,物理分页每一次访问数据库只读取一部分数据,占用内存空间较小,所以逻辑分页对服务器负担更大。
- 实时性:逻辑分页是一次性将数据读取到内存中,当数据发生改变,数据库中的最新状态不会实时反映到操作中,所以实时性差;物理分页每次需要数据时到需要去访问数据库,当数据发生改变时,数据库的最新状态可以实时反映到操作中,所以实时性强。
- 适用场合:逻辑分页适用于数据量小且数据稳定的场合,物理分页适用于数据量大且更新频繁的场合。
注:mybatis的RowBounds分页使用的是逻辑分页,然后通过offset和limit截断记录并返回分页结果。但是数据量大时会造成内存溢出。
4.简述mybatis的一级缓存和二级缓存?
答:一级缓存:它是基于PerpetualCache/ [pəˈpetʃuəl] [kæʃ]的hashMap本地存储,它存储的作用域是session。当Session flush或close之后,该session中的所有Cache都会被清空。一级缓存是默认打开的。
二级缓存和一级缓存的机制一样,都是基于PerpetualCache的HashMap本地存储,不同点是其存储的作用域是Mapper(Namespace),并且可以自定义存储源。二级缓存默认不打开,如果要开启二级缓存,需要使用二级缓存的属性类去是实现Serializable/[ˈsɪərɪəlaɪzəbl] 序列化接口。
对于缓存数据的更新机制:当一个作用域进行增删改之后,默认该作用域下的所有查询的缓存都会被清空。
5.谈hibernate和mybatis的区别?
答:Hibernate是当前流行的orm(Object Relational Mapping)框架,对数据库结构进行了较完整的封装。
Mybatis也是当前流行的orm框架,主要着力点是POJO和SQL之间的映射。POJO代表简单无规则java对象,纯的传统意义的Java对象,最基本的Java bean只有属性加上属性的get和set方法,可以转化po,dto,vo.
1.两者最大的区别:针对简单查询,hibernate和mybatis都有相应的代码生成工具,可以生成基本的dao层代码。
针对高级查询:mybatis需要手动去写SQL语句,以及ResultMap;而hibernate有良好的映射机制,开发者不需要关心sql生成和映射结果,可以更加关注业务流程。
2.开发难度对比:hibernate的开发难度大于mybatis,因为hibernate比较庞大复杂,而且学习周期比较长。而mybatis就比较简单,且它比较依赖于sql的书写,可以让开发者更加熟悉。
举一个形象的比喻:
Mybatis:机械工具,使用方便,拿来就用,但是工作还是要自己来做,不过工具是活的,怎么用由自己决定。
Hibernate:智能机器人,但研发(学习,熟练度)它的成本高,工作都可以交给它,但仅限于它能作的事。
6.Mybatis分页插件的实现原理是什么?
答:分页插件的基本原理是使用mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方法,添加相应的物理分页语句和物理分页参数。