MyBatis 面试题集绵

问题1:MyBatis一级、二级缓存机制?

答:一级缓存:

    A. 基于PerpetualCache的HashMap本地缓存,其存储作用域为Session级别,其生存时间一般很短;

    B. 当SqlSession close之后,该SqlSession中的所有Cache就将清空,默认是开启一级缓存

    C. 一级缓存是针对方法中sql语句重复执行才会起作用,而且方法结束,缓存就被清空,实际上也没人会用得上。

  二级缓存:

    A. 默认也是采用 PerpetualCache的HashMap存储,其存储作用域为Mapper(Namespace)级别;

    B. 可自定义存储源,如 Ehcache, 默认不开启二级缓存,要开启二级缓存,可使用二级缓存属性类实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/> ;

    C. 对于某些表执行了更新(update、delete、insert)操作后,需要清空跟这些表有关联的查询语句所造成的缓存,否则数据不一致。

  注意:查询数据库顺序是:二级缓存——>一级缓存——>数据库

     对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了insert/update/delete 操作后,默认该作用域下所有 select 中的缓存将被 clear。

 

问题2:MyBatis中#{}和${}的区别?

答:A. #{}是sql的参数占位符,防止sql注入,MyBatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,比如ps.setInt(0, parameterValue),#{item.name}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于param.getItem().getName();

  B. ${}是sql拼接符号,仅仅为一个简单的string替换,在动态SQL解析阶段将会进行变量替换。

 

问题3:MyBatis传递多个参数的方式?

答:A. 采用对象来封装参数;

  B. 采用Map键值对封装参数;

Map<String, BigDecimal> getUserLogByUserId(Map<String, Object> map);

<select id="getUserLogByUserId" parameterType="java.util.Map" resultType="java.util.HashMap"> SELECT SUM(IF(ip = #{ip}, 1, 0)) AS ipNum, SUM(IF(`time` = #{time}, 1, 0)) AS timeNum, SUM(IF(city = #{city}, 1, 0)) AS cityNum FROM user_log WHERE user_id = #{userId} AND created_time &gt;= #{createTime} </select>

  C. 使用@Param注解传递参数;

  D. 使用#{arg0}、#{arg1}或#{param1}、#{param2}获取参数。

  可参考:Mybatis传递多个参数的4种方式

 

问题4:MyBaits分页方式?

答:A. 数组分页;

  B. sql分页;

  C. 拦截器分页;

  D. RowBounds分页;

  E. PageHelper分页。

  可参考:MyBatis精通之路之分页功能的实现(数组分页、sql分页、拦截器,RowBounds分页)

 

问题5:classpath与classpath*的区别?

答:A. classpath路径是指WEB - INF/classes路径,因为src路径下的文件在编译后都会放置在WEB - INF/classess路径下;

  B. classes是一个定位资源入口,用来存放各种资源配置文件、配置模板,及编译后class文件;

  C. 用maven构建项目时,resources目录就是默认的classpath;

  D. classpath*不仅包含class路径,还包括jar文件中class路径进行查找。

 

可参考:Mybatis3.4.x技术内幕(二十三):Mybatis面试问题集绵(大结局)

 

posted @ 2020-01-18 12:41  如幻行云  阅读(237)  评论(0)    收藏  举报