MyBatis常见面试题及答案(贴近实战版).docxVIP

MyBatis常见面试题及答案(贴近实战版).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

MyBatis常见面试题及答案(贴近实战版)

1.你理解的MyBatis是什么?它比JDBC好在哪?

MyBatis是半自动的持久层框架,核心是把SQL和Java代码解耦,不用像JDBC那样写一堆重复代码。

比JDBC好的点:

不用手动加载驱动、创建Connection/Statement,MyBatis帮你管理;

SQL写在XML里,改SQL不用重新编译Java代码(比如线上改个查询条件,直接更XML就行);

自动映射结果集到实体类,不用手动set字段(比如查user表,直接返回User对象);

支持动态SQL(比如多条件查询时,有的条件传了就加where,没传就不加)。

2.MyBatis的核心组件有哪些?各自作用是什么?

核心就5个,实际开发中都会接触:

SqlSessionFactory:会话工厂,相当于数据库连接池,全局只创建一次(一般用单例),作用是创建SqlSession;

SqlSession:会话,相当于JDBC的Connection,每次操作数据库都要拿一个SqlSession,用完要关(不然占连接);

Mapper接口:就是我们写的DAO层接口(比如UserMapper),MyBatis会动态生成它的代理对象,不用写实现类;

MapperXML:对应Mapper接口的SQL配置文件,写select/insert/update/delete标签,还有ResultMap这些映射规则;

Executor:执行器,SqlSession底层靠它执行SQL,分三种:SIMPLE(默认,普通执行)、BATCH(批量执行,适合大量增删改)、REUSE(复用Statement,减少创建开销)。

3.#{}和${}的区别?实际开发中用哪个多?

这是必考题,重点在SQL注入和用法场景:

#{}:参数占位符,会把参数变成“?”(比如select*fromuserwhereid=#{id},实际执行是select*fromuserwhereid=?),MyBatis会自动给字符串加引号,能防SQL注入;

**{}**:字符串拼接,直接把参数拼到SQL里(比如select*from{tableName},传“user”就变成select*fromuser),不会加引号,有SQL注入风险;

实际开发:90%以上用#{},只有特殊场景用${},比如:

动态表名(比如按月份分表,查user_202409);

orderby动态字段(比如orderby{sortField});

用{}时一定要做参数校验(比如只允许传“id”“name”这些合法字段,不让用户随便传)。

4.动态SQL有哪些标签?实际用得多的是哪几个?

MyBatis动态SQL就是帮你拼接SQL,避免写一堆if-else判断字符串:

常用标签:

:判断参数是否存在/不为空,比如多条件查询时,传了name就加name条件:

iftest=name!=nullandname!=andnamelikeconcat(%,#{name},%)/if;

:自动处理开头的“and/or”,比如上面的if标签如果都满足,不会出现“whereand”的错误;

:遍历集合,比如in查询(whereidin(#{item}))或批量插入:

insertintouser(name)valuesforeachcollection=listitem=useparator=,(#{})/foreach;

:相当于Java的if-elseif-else,比如传了id就查id,没传id传name就查name,都没传就查默认条件;

其他标签(用得少):(更新时自动处理逗号)、(自定义前缀后缀,比where/set灵活)。

5.MyBatis的一级缓存和二级缓存有什么区别?开发中怎么用?

缓存是为了减少数据库查询,提升性能,两者区别很明显:

维度

一级缓存

二级缓存

作用范围

SqlSession级别(每个SqlSession单独有)

Mapper接口级别(同一Mapper的不同SqlSession共享)

开启方式

默认开启,不用配置

需手动开启:1.全局配置cacheEnabled=true(默认true);2.MapperXML加标签

数据存储

存的是对象引用(修改缓存会影响数据库)

存的是序列化后的对象(需实体类实现Serializable)

失效场景

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档