您的位置:首页 > 职场人生

Mybatis面试题

2019-07-16 23:39 309 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_39135478/article/details/96201117

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 属性详解:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: