前言:
mybatis面试题复习,参考资料巨多,因为很多都不懂的,题可以参考,建议自己写答案,我的答案是根据我的理解的白话文,有一些太难了,我觉得我这种 一年半经验的,不会问得这么深入,也是很好的去理解mybatis的一个过程 ,用时,一天。
参考资料:
Mybatis常见面试题总结_张维鹏的博客-优快云博客_mybatis面试题
最全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入门会比较难,代码会比较难读懂