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 @   如幻行云  阅读(230)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示