mybatis分页原理_⾯试宝典:10个MyBatis常见⾯试题(含答
案)
1. #{}和${}的区别是什么?
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调⽤PreparedStatement的set⽅法来赋值;
espanoles是什么意思
Mybatis在处理${}时,就是把${}替换成变量的值。
使⽤#{}可以有效的防⽌SQL注⼊,提⾼系统安全性。
2. 通常⼀个Xml映射⽂件,都会写⼀个Dao接⼝与之对应,请问,这个Dao接⼝的⼯作原理是什么?Dao接⼝⾥的⽅法,参数不同时,⽅法能重载吗?
Dao接⼝,就是⼈们常说的Mapper接⼝,接⼝的全限名,就是映射⽂件中的namespace的值,接⼝的⽅法名,就是映射⽂件中MappedStatement的id值,接⼝⽅法内的参数,就是传递给sql的参数。Mapper接⼝是没有实现类的,当调⽤接⼝⽅法时,接⼝全限名+⽅法名拼接字符串作为key值,可唯⼀定位⼀个include在句中用法
MappedStatement,举例:batis3.mappers.StudentDao.findStudentById,可以唯⼀到namespace为batis3.mappers.StudentDao下⾯id = findStudentById的MappedStatement。在Mybatis中,每⼀个、、、标签,都会被解析为⼀个MappedStatement对象。
Dao接⼝⾥的⽅法,是不能重载的,因为是全限名+⽅法名的保存和寻策略。
Dao接⼝的⼯作原理是JDK动态代理,Mybatis运⾏时会使⽤JDK动态代理为Dao接⼝⽣成代理proxy对象,代理对象proxy会拦截接⼝⽅法,转⽽执⾏MappedStatement所代表的sql,然后将sql执⾏结果返回。
3. Mybatis是如何进⾏分页的?分页插件的原理是什么?
Mybatis使⽤RowBounds对象进⾏分页,它是针对ResultSet结果集执⾏的内存分页,⽽⾮物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使⽤分页插件来完成物理分页。
分页插件的基本原理是使⽤Mybatis提供的插件接⼝,实现⾃定义插件,在插件的拦截⽅法内拦截待执⾏的sql,然后重写sql,根据dialect ⽅⾔,添加对应的物理分页语句和物理分页参数。
4. Mybatis是如何将sql执⾏结果封装为⽬标对象并返回的?都有哪些映射形式?
第⼀种是使⽤标签,逐⼀定义列名和对象属性名之间的映射关系。第⼆种是使⽤sql列的别名功能,将列别名书写为对象属性名,⽐如
midrange是什么意思T_NAME AS NAME,对象属性名⼀般是name,⼩写,但是列名不区分⼤⼩写,Mybatis会忽略列名⼤⼩写,智能到与之对应对象属性名,你甚⾄可以写成T_NAME AS NaMe,Mybatis⼀样可以正常⼯作。
linux卸载docker命令
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使⽤反射给对象的属性逐⼀赋值并返回,那些不到映射关系的属性,是⽆法完成赋值的。
5. Xml映射⽂件中,除了常见的select|insert|update|delete标签之外,还有哪些标签?注:这道题出⾃京东⾯试官。
还有很多其他的标签,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql⽚段标签,通过标签引⼊sql⽚段,为不⽀持⾃增的主键⽣成策略标签。
nodejs数组转字符串6. 简述Mybatis的插件运⾏原理,以及如何编写⼀个插件
Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接⼝的插件,Mybatis使⽤JDK的动态代理,为需要拦截的接⼝⽣成代理对象以实现接⼝⽅法拦截功能,
每当执⾏这4种接⼝对象的⽅法时,就会进⼊拦截⽅法,具体就是InvocationHandler的invoke()⽅法,当然,只会拦截那些你指定需要拦截的⽅法。实现Mybatis的Interceptor接⼝并复写
intercept()⽅法,然后在给插件编写注解,指定要拦截哪⼀个接⼝的哪些⽅法即可,记住,还需要在配置⽂件中配置你编写的插件。7. ⼀级、⼆级缓存
1)⼀级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作⽤域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。
2)⼆级缓存与⼀级缓存其机制相同,默认也是采⽤ PerpetualCache,HashMap 存储,不同在于其存储作⽤域为
Mapper(Namespace),并且可⾃定义存储源,如 Ehcache。要开启⼆级缓存,你需要在你的 SQL 映射⽂件中添加⼀⾏:
mysql语句的执行顺序3)对于缓存数据更新机制,当某⼀个作⽤域(⼀级缓存 Session/⼆级缓存Namespaces)的进⾏了C/U/D 操作后,默认该作⽤域下所有select 中的缓存将被 clear。
8. Mybatis是否⽀持延迟加载?如果⽀持,它的实现原理是什么?
Mybatis仅⽀持association关联对象和collection关联集合对象的延迟加载,association指的就是⼀对⼀,collection指的就是⼀对多查询。在Mybatis配置⽂件中,可以配置是否启⽤延迟加载lazyLoadingEnabled=true|false。
它的原理是,使⽤CGLIB创建⽬标对象的代理对象,当调⽤⽬标⽅法时,进⼊⽅法,⽐如调⽤a.getB().getName(),invoke()⽅法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调⽤a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()⽅法的调⽤。这就是延迟加载的基本原理。
9. Mybatis映射⽂件中,如果A标签通过include引⽤了B标签的内容,请问,B标签能否定义在A标签的后⾯,还是说必须定义在A标签的前⾯?
虽然Mybatis解析Xml映射⽂件是按照顺序解析的,但是,被引⽤的B标签依然可以定义在任何地⽅,Mybatis都可以正确识别。
原理是,Mybatis解析A标签,发现A标签引⽤了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下的标签,包含B标签,待所有标签解析完毕,Mybatis会重新解析那些被标记为未解析的标签,此时再解析A标签时,B标签已经存在,A标签也就可以正常解析完成了。
10. 简述Mybatis的Xml映射⽂件和Mybatis内部数据结构之间的映射关系?
Mybatis将所有Xml配置信息都封装到All-In-One重量级对象Configuration内部。在Xml映射⽂件中,标签会被解析为ParameterMap对象,其每个⼦元素会被解析为ParameterMapping对象。标签会被解析为ResultMap对象,其每个⼦元素会被解析为ResultMapping对象。每⼀个、、、标签均会被解析为MappedStatement对象,标签内的sql会被解析为BoundSql对象。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。