Mybatis面试题
1)、resultType与reaultMap的区别?
解答:两个属性主要用于映射输出结果;其中SQL查询出来的列与pojo实体一样时,使用resultType映射成功。反之与pojo实体不一致时,使用resultMap进行别名转换映射。
2)、#和$的区别?
解答:使用#{},mybatis会产生PreParedStatement语句,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义。使用${}则不会;${}方式会引发SQL注入的问题、也会影响SQL语句的预编译,所以从安全性和性能的角度出发,能使用#{}的情况下就不要使用${},那么在什么情况下使用${}呢?(需要为sql添加一个字段查询的时候;比如select * from user where 1=1 ordey by ${age});
3)、collection和association的区别?
解答:关联-association 集合-collection;实体类中存在集合关系的对象使用collection进行映射,存在对象关系使用association。
4)、Statement和PreparedStatement的区别?
解答:执行sql一般步骤:a.转换sql b.编译sql c.优化查询数据路径 d.返回数据。
prepareStatement会先初始化SQL,先把这个SQL提交到数据库中进行预处理,多次使用可提高效率(一般会先把前3个步骤执行)。 安全性好,有效防止Sql注入等问题; 支持批量更新,批量删除。
Statement不会初始化,没有预处理,每次都是从0开始执行SQL。支持批量更新,批量删除。
5)、 Mybatis原理图
6)、Mybatis缓存
目的:提升查询效率减少数据库压力;
mybatis有一级缓存 二级缓存 还有第三方缓存的支持;
一级缓存:又称本地缓存,session级别,默认开启;在sqlsession中子类DefaultSqlSession中的Executor里维护这个缓存。 同一个会话 多次执行相同sql 会从缓存取。
跨级别缓存读取数据导致脏读;所以一级缓存的缺点,在不同会话 执行相同sql 不能共享缓存。
二级缓存:用来解决一级缓存不能跨域的问题 范围namespace级别,二级缓存比一级缓存大 所以先读二级 然后一级 最后与数据库交互;二级缓存是通过装饰类来维护CachingExecutor。
开启二级缓存的方法
第一步:在 mybatis-config.xml 中配置了(可以不配置,默认是 true):
[code]<setting name="cacheEnabled" value="true"/>
只要没有显式地设置 cacheEnabled=false,都会用 CachingExecutor 装饰基本的 执行器。
第二步:在 Mapper.xml 中配置标签:
[code]<!-- 声明这个 namespace 使用二级缓存 --> <cache type="org.apache.ibatis.cache.impl.PerpetualCache" size="1024" <!—最多缓存对象个数,默认 1024--> eviction="LRU" <!—回收策略--> flushInterval="120000" <!—自动刷新时间 ms,未配置时只有调用时刷新--> readOnly="false"/>
cache 属性详解:
- 面试题:应用中很多jar包,比如spring、mybatis、redis等等,各自用的日志系统各异,怎么用slf4j统一输出?
- Mybatis 面试题
- 面试官都会问的Mybatis面试题,你会这样回答吗?
- [Java面试]三:常见面试题之框架篇MyBatis
- MyBatis面试题
- 面试官都会问的Mybatis面试题,你会这样回答吗?
- SSM(Spring + Springmvc + Mybatis)框架基础面试题
- 【Mybatis】 常见面试题
- mybatis 面试题
- MyBatis总结(笔面试题)
- MyBatis总结(笔面试题)
- mybatis常见面试题
- MyBatis面试题
- Mybatis 常见面试题
- 关于spring,springMVC,hibernate,mybatis面试题
- Mybatis常见面试题一
- struts、hibernate、spring、 mybatis、 spring boot 等面试题汇总
- JAVA企业面试题精选 MyBatis 1-4
- mybatis面试题
- java面试——mybatis 面试题