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