mybatis面试题

本文整理了关于MyBatis的面试重点,包括其概念、优缺点、#{}与${}的区别、XML映射文件中的标签、ResultMap的使用、分页、缓存、动态SQL、插件运行原理等,并提供了相关资源链接,帮助读者深入理解MyBatis。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

mybatis面试题复习,参考资料巨多,因为很多都不懂的,题可以参考,建议自己写答案,我的答案是根据我的理解的白话文,有一些太难了,我觉得我这种 一年半经验的,不会问得这么深入,也是很好的去理解mybatis的一个过程 ,用时,一天。


参考资料:

Mybatis常见面试题总结_张维鹏的博客-优快云博客_mybatis面试题

MyBatis常见面试题总结 | JavaGuide

最全java面试题及答案(208道)_十一技术斩的博客-优快云博客_java面试题

MyBatis 的多表操作:一对一、一对多、多对多_于小猿的博客-优快云博客_mybatis一对一 一对多 多对一 多对多

【笔试面试考点】PreparedStatement和Statement的区别与联系&&批量插入数据的优化_小趴菜学java的博客-优快云博客_statement批量插入 mybatis(18)——动态sql,where标签去掉多余的and和or_木子 旭的博客-优快云博客_mybatis去掉and

MySQL数据库面试题总结(2022最新版)_程序猿周周的博客-优快云博客_数据库面试


总结:

  • 126、mybatis有用过吗?是什么
    • mybatis是一个ORM的框架,,我们只需要关注我们的sql是怎么写的,不用过多关心jdbc的信息,很多东西都可以由mybatis的generator工具做生成,减少了我们手写可能出现的手误,还用pagehalper能够让我们快速写分页
  • 127、mybatis的优缺点?
    • 优点:不用手动开关连接,兼容各种数据库
  • 128、#{}和${}的区别是什么?
    • mybatis处理#的时候,它会对sql做预处理,然后将#里面的内容代替成问号,调用preparedStatement的set方法赋值,而$符号是直接替换成变量的值,所以用#可以防止sql注入,
  • 129、xml-映射文件中-除了常见的-select、insert、update、delete-标签之外-还有哪些标签
    • 我比较熟悉的是if和foreach,例如if,我们会用在那种传入的数据不为空,才会是条件,例如我去查User表,当我的id由值的时候才根据id找,没有值就全部找,这时候就会用到if,foreach那种通常用于范围查询,标签中的collection指定传的参数是list还是map还是array,用open和close指定前后缀,用separator指定分隔符
  • 130、当实体类中的属性名和表中的字段名不一样,怎么办?
    • resultmap那里用column和property对应起来
  • 131、模糊查询like语句该怎么写
    • 1.在对象那里加百分号
    • 2.在xml的sql加百分号(会引起sql注入)
  • 132、通常一个Xml映射文件,都会写一个Dao接口与之对应, 请问,这个Dao接口的工作原理是什么?Dao接口里的方法, 参数不同时,方法能重载吗?
    • xml文件上都会写着对应的nameSpace,然后接口的方法都会对应着每条sql的id,每一个那种select、update、insert、delete标签,都会解析成MappedStatement对象,通过接口名加类名形成一个key,就可以定位到一个MappedStatement,所以不能重载。
    • dao接口的工作原理是基于aop的,mybatis在运行的时候会使用JDK动态代理为这个接口去生成proxy对象,这个对象会拦截接口的方法,转去执行MappedStatement所代表的sql,然后将执行结果返回
  • 133、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
    • 可以重复,因为它是根据namespace+id形成key的,除非xml文件中没有定义namespace,新版本要求必填namespace
  • 134、MyBatis 分页怎么说
    • MyBatis 使用rowBrounds进行分页,它就是一次性查很多数据,然后再从数据里面做limit
    • 使用分页插件pagehelper:它根据MyBatis 提供的插件接口,自己去实现插件(继承了Executor),再插件的拦截方法里面将待执行的sql拦截做加工,例如我原本的sql语句是select * from A,那么加工过后就会写出selcet t.* from(原sql语句) limit 0,10这样子
  • 135、RowBounds 是一次性查询全部结果吗?为什么?
    • 不是,它实际上是mybatis上由一个jdbc的FetchSize的配置,会定义一次性在数据库中最多查多少的数据,如果需要更多数据的话,会执行next()方法,从而防止出现oom
  • 136、mybatis的物理分页和逻辑分页的区别
    • 物理分页是,一次性查很多数据,再从结果种limit,数据库压力会很大,会很耗内存,有溢出的风险
    • 逻辑分页是,数据库里面做limit,能解决物理分页出现的问题
  • 137、mybatis可以延时加载吗
    • 可以,在配置上配mybatis.configuration.lazy-loading-enabled = true
  • 138、简述Mybatis的插件运行原理,以及如何编写一个插件。
    • 目前Mybatis仅可以针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的做增强,Mybatis会使用jdk的动态代理,为需要拦截的接口生成代理对象从而实现接口方法拦截的功能,例如说我们用的那个pageHalper,它的PageInterceptor插件,就是通过实现Interceptor(inter set tor)接口的intercept方法,然后加上@Intercepts 注解作用在类上面,指明要拦截的sql为query类型
  • 139、Mybatis的一级、二级缓存
    • 一级缓存通常我们都叫本地缓存,它是作用在同一个sqlSession中的,第一次查的时候,会放到本地缓存中,第二次以相同的条件查的时候,当查询条件不同或者有出现修改的操作的时候就会清空缓存,二级缓存是作用在nameSpace中的,不同的sqlSession之间可以共享数据,它和以及缓存的处理差不多,不过作用域会更大一点
    • 每次查询前会先查二级缓存,再查一级缓存,最后再查数据库,一级缓存默认开启,但是spring+Mybatis 的是不支持一级缓存的,如果要开二级缓存,那么就需要在mapper的xml上加上<cache/>标签,或者在application.properties上开启配置
  • 140、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
    • 使用resultmap去做映射
    • 在sql用将列名用as映射为对象的属性名
  • 141、动态sql说一下
    • 动态sql一般都是指用了标签if啊foreach啊where啊set啊那些,我们可以用if标签判断一下有没有值然后再决定加不加条件,多个if条件的时候就需要用where或者set标签去配合使用,foreach这个一般用在select或者insert语句当中,他里面需要指明collection是list还是map还是Array,然后用open和close指定最前面和最后面,用item指明遍历的元素,separator指定分隔符
  • 142、在mapper中如何传递多个参数?
    • 1、接口的参数使用@param标名名字
    • 2、sql中用#{0} #{1}
  • 143、一对一、一对多的关联查询
    • 一对一的查询,和一对多的查询,关键都在resultmap那里,里面有个id的标签,用于确定那个能确定一条记录的列,如果是一对一,我们用的是association来指定后面的那个一的属性(property) 就是在DO里面的那个名字,还有指定javaType,就是那个对应的类
    • 如果是一对多,我们会用collection标签,设定对应的属性(property) 和ofType
  • 144、除了用xml实现sql外,还会用什么方式(这就是接口绑定)
    • 还可以使用在接口的方法加注解的方式,可以加@Select、@Update,然后写上sql语句
  • 145、MyBatis 有哪些执行器(Executor)?
    • 3种,第一种是simpleExecutor,每执行一次sql就会开一个Statement对象,执行完就删掉,这是mybatis的默认执行器,第二种是ReuseExecutor,以sql做为key找Statement对象,找到就直接用,找不到就创建一个,最后一种是BatchExecutor,用于批处理的他会将所有的sql请求集中起来,最后调用Executor的flushStatement方法,一次性将所有的请求发到数据库。
  • 146、mybatis和hibernate的区别
    • mybatis是半ORM框架,而hibernate是正宗的orm框架,mybatis要我们自己写sql,我要换数据库的话hibernate的话那些代码不用动,但是由于语法的问题,mybatis的估计很多都要重写了。但是hibernate入门会比较难,代码会比较难读懂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值