前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis面试题总结

mybatis面试题总结

作者头像
会呼吸的Coder
发布2020-07-14 10:33:35
9280
发布2020-07-14 10:33:35
举报
文章被收录于专栏:会呼吸的Coder

1、#{}和${}的区别是什么?

在mybatis配置中,我们经常使用#{}和{}就是这种情况,这种可能会造成sql注入,#{}对应着就是预处理的"?",所以两种都可以使用的时候推荐#{}。

2、Mybatis执行批量插入,能返回数据库主键列表吗

答:能,JDBC都能,Mybatis当然也能

3、Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不

答:Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能

4.mybatis的一级缓存,二级缓存

mybatis的一级缓存是在一次会话的,也就是sqlSession,也就是发生在从从open到close,在这次会话中,他会把查询结果存入一级缓存中,会话结束,缓存内容就可以被回收掉。二级缓存是默认不打开的,如果需要就需要在配置<cache>,二级缓存可以跨越会话,也就在sqlSessionFactory层面的,一般来说,二级缓存对于mybatis来说,已经足够使用了,当然不排除需要其他情况,要使用自定义缓存,那就需要实现org.apache.ibatis.cache.Cache,然后配置使用自己的缓存。

5、Mapper编写有哪几种方式

  1. 接口实现类继承SqlSessionDaoSupport
  2. 使用org.mybatis.spring.mapper.MapperFactoryBean
  3. 使用mapper扫描器

6、如何编写一个插件?

Mybatis仅可以编写针对ParameterHandler(参数处理程序)、ResultSetHandler(结果集处理)、StatementHandler(表处理程序)、Executor(执行)这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

7、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。

8、Mybatis是否可以映射Enum枚举类?

Mybatis可以映射枚举类,不单可以映射枚举类,Mybatis可以映射任何对象到表的一列上。映射方式为自定义一个TypeHandler,实现TypeHandler的setParameter()和getResult()接口方法。TypeHandler有两个作用,一是完成从javaType至jdbcType的转换,二是完成jdbcType至javaType的转换,体现为setParameter()和getResult()两个方法,分别代表设置sql问号占位符参数和获取列查询结果。

9、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

10、MyBatis的接口绑定,有什么好处?有几种实现方式?

接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select@Update等注解里面包含Sql语句来绑定,另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。

11、什么情况下用注解绑定,什么情况下用xml绑定?

当Sql语句比较简单时候,用注解绑定,当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。

12.MyBatis编程步骤是什么样的?

创建 SqISessionFactory

通过 SqISessionFactory 创建 SqISession

通过sqlsession执行数据库操作

调用 session.commit()提交事务

调用session.closeQ关闭会话

13.MyBatis的工作原理

读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文 件,配置了 MyBatis的运行环境等信息,例如数据库连接信息加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的 SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中的一张表

构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂 SqISessionFactory

创建会话对象:由会话工厂创建SqISession对象,该对象中包含了执行 SQL语句的所有方法

Executor执行器:MyBatis底层定义了一个Executor接口来操作数据库, 它将根据SqISession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护

MappedStatement对象:在Executor接口的执行方法中有一个 MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射 的SQL语句的id、参数等信息输入

参数映射:输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对 preparedStatement对象设置参数的过程输出结果映射:输出结果类型可以是Map、 List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。

14.MyBatis与Hibernate有什么不同?

Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性, 如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率

15.ResultMap和ResultType的差别、

ParameterMap和parameterType的差别ResultMap和ResultType:两者都是表示查询结果集与java对象之间的一种关系,处理查询结果集,映射到java对象。resultMap:表示将查询结果集中的列一一映射到bean对象的各个属性。

16.Mybatis执行批量插入,能返回数据库主键列表吗?Mybatis在插入单条数据的时候有两种方式返回自增主键: mybatis3.3.1支持批量插入后返回主键ID,

首先对于支持自增主键的数据库:useGenerateKeys和keyProperty。

不支持生成自增主键的数据库:<selectKey>。

这里主要说下批量插入数据时如何返回主键ID

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 初级程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档