乐趣区

关于java:Java架构师面试题系列之Mybatis面试专题36题含详细答案解析

【Java 架构师面试网】收集整理了一些 Java 面试的常见问题,这些问题可能会在你下一次技术面试中遇到。想成为 Java 架构师,这些都是不可避免也是必须要把握的哦,对于其余模块的面试题,我后续也将独自分享面试问题和答案。成为 Java 架构师的这条路道阻且艰,然而既然抉择了远方就是抉择了风雨兼程,心愿大家都能早日圆本人的架构师梦,同样也心愿我本人能够,除了网站,还做了个公众号:Java 架构师面试网,关注并加交换群即可取得我给你筹备的精美面试礼包哦~

1、什么是 MyBatis?
答:MyBatis 是一个能够自定义 SQL、存储过程和高级映射的长久层框架。

2、讲下 MyBatis 的缓存
答:MyBatis 的缓存分为一级缓存和二级缓存, 一级缓存放在 session 外面, 默认就有, 二级缓存放在它的命名空间里, 默认是不关上的, 应用二级缓存属性类须要实现 Serializable 序列化接口(可用来保留对象的状态), 可在它的映射文件中配置 <cache/>

3、Mybatis 是如何进行分页的?分页插件的原理是什么?
答:
1)Mybatis 应用 RowBounds 对象进行分页,也能够间接编写 sql 实现分页,也能够应用 Mybatis 的分页插件。
2)分页插件的原理:实现 Mybatis 提供的接口,实现自定义插件,在插件的拦挡办法内拦挡待执行的 sql,而后重写 sql。
举例:select from student,拦挡 sql 后重写为:select t. from(select * from student)t limit 0,10

4、简述 Mybatis 的插件运行原理,以及如何编写一个插件?
答:
1)Mybatis 仅能够编写针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor 这 4 种接口的插件,Mybatis 通过动静代理,为须要拦挡的接口生成代理对象以实现接口办法拦挡性能,每当执行这 4 种接口对象的办法时,就会进入拦挡办法,具体就是 InvocationHandler 的 invoke()办法,当然,只会拦挡那些你指定须要拦挡的办法。
2)实现 Mybatis 的 Interceptor 接口并复写 intercept()办法,而后在给插件编写注解,指定要拦挡哪一个接口的哪些办法即可,记住,别忘了在配置文件中配置你编写的插件。

5、Mybatis 动静 sql 是做什么的?都有哪些动静 sql?能简述一下动静 sql 的执行原理不?
答:
1)Mybatis 动静 sql 能够让咱们在 Xml 映射文件内,以标签的模式编写动静 sql,实现逻辑判断和动静拼接 sql 的性能。
2)Mybatis 提供了 9 种动静 sql 标签:trim|where|set|foreach|if|choose|when|otherwise|bind。
3)其执行原理为,应用 OGNL 从 sql 参数对象中计算表达式的值,依据表达式的值动静拼接 sql,以此来实现动静 sql 的性能。

6、#{}和 ${}的区别是什么?
答:
1)#{}是预编译解决,${}是字符串替换。
2)Mybatis 在解决 #{}时,会将 sql 中的 #{}替换为? 号,调用 PreparedStatement 的 set 办法来赋值;
3)Mybatis 在解决 ${}时,就是把 ${}替换成变量的值。
4)应用 #{}能够无效的避免 SQL 注入,进步零碎安全性。

7、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
答:Hibernate 属于全自动 ORM 映射工具,应用 Hibernate 查问关联对象或者关联汇合对象时,能够依据对象关系模型间接获取,所以它是全自动的。而 Mybatis 在查问关联对象或关联汇合对象时,须要手动编写 sql 来实现,所以,称之为半自动 ORM 映射工具。

8、Mybatis 是否反对提早加载?如果反对,它的实现原理是什么?
答:
1)Mybatis 仅反对 association 关联对象和 collection 关联汇合对象的提早加载,association 指的就是一对一,collection 指的就是一对多查问。在 Mybatis 配置文件中,能够配置是否启用提早加载 lazyLoadingEnabled=true|false。
2)它的原理是,应用 CGLIB 创立指标对象的代理对象,当调用指标办法时,进入拦截器办法,比方调用 a.getB().getName(),拦截器 invoke()办法发现 a.getB()是 null 值,那么就会独自发送当时保留好的查问关联 B 对象的 sql,把 B 查问上来,而后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着实现 a.getB().getName()办法的调用。这就是提早加载的基本原理。

9、MyBatis 与 Hibernate 有哪些不同?
答:
1)Mybatis 和 hibernate 不同,它不齐全是一个 ORM 框架,因为 MyBatis 须要程序员本人编写 Sql 语句,不过 mybatis 能够通过 XML 或注解形式灵便配置要运行的 sql 语句,并将 java 对象和 sql 语句映射生成最终执行的 sql,最初将 sql 执行的后果再映射生成 java 对象。
2)Mybatis 学习门槛低,简略易学,程序员间接编写原生态 sql,可严格控制 sql 执行性能,灵便度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业经营类软件等,因为这类软件需要变动频繁,一但需要变动要求成绩输入迅速。然而灵便的前提是 mybatis 无奈做到数据库无关性,如果须要实现反对多种数据库的软件则须要自定义多套 sql 映射文件,工作量大。
3)Hibernate 对象 / 关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需要固定的定制化软件)如果用 hibernate 开发能够节俭很多代码,提高效率。然而 Hibernate 的毛病是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之间如何衡量,以及怎么用好 Hibernate 须要具备很强的教训和能力才行。
总之,依照用户的需要在无限的资源环境下只有能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适宜才是最好。

10、MyBatis 的益处是什么?
答:
1)MyBatis 把 sql 语句从 Java 源程序中独立进去,放在独自的 XML 文件中编写,给程序的保护带来了很大便当。
2)MyBatis 封装了底层 JDBC API 的调用细节,并能主动将后果集转换成 Java Bean 对象,大大简化了 Java 数据库编程的反复工作。
3)因为 MyBatis 须要程序员本人去编写 sql 语句,程序员能够联合数据库本身的特点灵便管制 sql 语句,因而可能实现比 Hibernate 等全自动 orm 框架更高的查问效率,可能实现简单查问。

11、简述 Mybatis 的 Xml 映射文件和 Mybatis 外部数据结构之间的映射关系?
答:Mybatis 将所有 Xml 配置信息都封装到 All-In-One 重量级对象 Configuration 外部。在 Xml 映射文件中,<parameterMap> 标签会被解析为 ParameterMap 对象,其每个子元素会被解析为 ParameterMapping 对象。<resultMap> 标签会被解析为 ResultMap 对象,其每个子元素会被解析为 ResultMapping 对象。每一个 <select>、<insert>、<update>、<delete> 标签均会被解析为 MappedStatement 对象,标签内的 sql 会被解析为 BoundSql 对象。

12、什么是 MyBatis 的接口绑定, 有什么益处?
答:接口映射就是在 MyBatis 中任意定义接口, 而后把接口外面的办法和 SQL 语句绑定, 咱们间接调用接口办法就能够, 这样比起原来了 SqlSession 提供的办法咱们能够有更加灵便的抉择和设置.

13、接口绑定有几种实现形式, 别离是怎么实现的?
答:接口绑定有两种实现形式, 一种是通过注解绑定, 就是在接口的办法下面加上 @Select@Update 等注解外面蕴含 Sql 语句来绑定, 另外一种就是通过 xml 外面写 SQL 来绑定, 在这种状况下, 要指定 xml 映射文件外面的 namespace 必须为接口的全路径名.

14、什么状况下用注解绑定, 什么状况下用 xml 绑定?
答:当 Sql 语句比较简单时候, 用注解绑定;当 SQL 语句比较复杂时候, 用 xml 绑定, 个别用 xml 绑定的比拟多

15、MyBatis 实现一对一有几种形式? 具体怎么操作的?
答:有联结查问和嵌套查问, 联结查问是几个表联结查问, 只查问一次, 通过在 resultMap 外面配置 association 节点配置一对一的类就能够实现; 嵌套查问是先查一个表, 依据这个表外面的后果的外键 id, 去再另外一个表外面查问数据, 也是通过 association 配置, 但另外一个表的查问通过 select 属性配置。

16、Mybatis 能执行一对一、一对多的关联查问吗?都有哪些实现形式,以及它们之间的区别?
答:能,Mybatis 不仅能够执行一对一、一对多的关联查问,还能够执行多对一,多对多的关联查问,多对一查问,其实就是一对一查问,只须要把 selectOne()批改为 selectList()即可;多对多查问,其实就是一对多查问,只须要把 selectOne()批改为 selectList()即可。关联对象查问,有两种实现形式,一种是独自发送一个 sql 去查问关联对象,赋给主对象,而后返回主对象。另一种是应用嵌套查问,嵌套查问的含意为应用 join 查问,一部分列是 A 对象的属性值,另外一部分列是关联对象 B 的属性值,益处是只发一个 sql 查问,就能够把主对象和其关联对象查出来。

17、MyBatis 外面的动静 Sql 是怎么设定的? 用什么语法?
答:MyBatis 外面的动静 Sql 个别是通过 if 节点来实现, 通过 OGNL 语法来实现, 然而如果要写的残缺, 必须配合 where,trim 节点,where 节点是判断蕴含节点有内容就插入 where, 否则不插入,trim 节点是用来判断如果动静语句是以 and 或 or 开始, 那么会主动把这个 and 或者 or 取掉。

18、Mybatis 是如何将 sql 执行后果封装为指标对象并返回的?都有哪些映射模式?
答:
第一种是应用 <resultMap> 标签,逐个定义列名和对象属性名之间的映射关系。
第二种是应用 sql 列的别名性能,将列别名书写为对象属性名,比方 T_NAME AS NAME,对象属性名个别是 name,小写,然而列名不辨别大小写,Mybatis 会疏忽列名大小写,智能找到与之对应对象属性名,你甚至能够写成 T_NAME AS NaMe,Mybatis 一样能够失常工作。
有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时应用反射给对象的属性逐个赋值并返回,那些找不到映射关系的属性,是无奈实现赋值的。

19、Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?
答:还有很多其余的标签,<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,加上动静 sql 的 9 个标签,trim|where|set|foreach|if|choose|when|otherwise|bind 等,其中 <sql> 为 sql 片段标签,通过 <include> 标签引入 sql 片段,<selectKey> 为不反对自增的主键生成策略标签。

20、当实体类中的属性名和表中的字段名不一样,如果将查问的后果封装到指定 pojo?
答:
1)通过在查问的 sql 语句中定义字段名的别名。
2)通过 <resultMap> 来映射字段名和实体类属性名的一一对应的关系。

21、含糊查问 like 语句该怎么写
答:
1)在 java 中拼接通配符,通过 #{}赋值
2)在 Sql 语句中拼接通配符(不平安 会引起 Sql 注入)

22、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应, Dao 的工作原理,是否能够重载?
答:不能重载,因为通过 Dao 寻找 Xml 对应的 sql 的时候全限名 + 办法名的保留和寻找策略。接口工作原理为 jdk 动静代理原理,运行时会为 dao 生成 proxy,代理对象会拦挡接口办法,去执行对应的 sql 返回数据。

23、Mybatis 映射文件中,如果 A 标签通过 include 援用了 B 标签的内容,请问,B 标签是否定义在 A 标签的前面,还是说必须定义在 A 标签的后面?
答:尽管 Mybatis 解析 Xml 映射文件是依照程序解析的,然而,被援用的 B 标签仍然能够定义在任何中央,Mybatis 都能够正确辨认。原理是,Mybatis 解析 A 标签,发现 A 标签援用了 B 标签,然而 B 标签尚未解析到,尚不存在,此时,Mybatis 会将 A 标签标记为未解析状态,而后持续解析余下的标签,蕴含 B 标签,待所有标签解析结束,Mybatis 会从新解析那些被标记为未解析的标签,此时再解析 A 标签时,B 标签曾经存在,A 标签也就能够失常解析实现了。

24、Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否能够反复?
答:不同的 Xml 映射文件,如果配置了 namespace,那么 id 能够反复;如果没有配置 namespace,那么 id 不能反复;毕竟 namespace 不是必须的,只是最佳实际而已。起因就是 namespace+id 是作为 Map<String, MappedStatement> 的 key 应用的,如果没有 namespace,就剩下 id,那么,id 反复会导致数据相互笼罩。有了 namespace,天然 id 就能够反复,namespace 不同,namespace+id 天然也就不同。

25、Mybatis 中如何执行批处理?
答:应用 BatchExecutor 实现批处理。

26、Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?
答:Mybatis 有三种根本的 Executor 执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。1)SimpleExecutor:每执行一次 update 或 select,就开启一个 Statement 对象,用完立即敞开 Statement 对象。2)ReuseExecutor:执行 update 或 select,以 sql 作为 key 查找 Statement 对象,存在就应用,不存在就创立,用完后,不敞开 Statement 对象,而是搁置于 Map3)BatchExecutor:实现批处理。

27、Mybatis 中如何指定应用哪一种 Executor 执行器?
答:在 Mybatis 配置文件中,能够指定默认的 ExecutorType 执行器类型,也能够手动给 DefaultSqlSessionFactory 的创立 SqlSession 的办法传递 ExecutorType 类型参数。

28、Mybatis 执行批量插入,能返回数据库主键列表吗?
答:能,JDBC 都能,Mybatis 当然也能。

29、Mybatis 是否能够映射 Enum 枚举类?
答:Mybatis 能够映射枚举类,不单能够映射枚举类,Mybatis 能够映射任何对象到表的一列上。映射形式为自定义一个 TypeHandler,实现 TypeHandler 的 setParameter()和 getResult()接口办法。TypeHandler 有两个作用,一是实现从 javaType 至 jdbcType 的转换,二是实现 jdbcType 至 javaType 的转换,体现为 setParameter()和 getResult()两个办法,别离代表设置 sql 问号占位符参数和获取列查问后果。

30、如何获取主动生成的 (主) 键值?
答:配置文件设置 usegeneratedkeys 为 true

31、在 mapper 中如何传递多个参数?
答:
1)间接在办法中传递参数,xml 文件用 #{0} #{1}来获取
2)应用 @param 注解: 这样能够间接在 xml 文件中通过 #{name} 来获取

32、resultType resultMap 的区别?
答:
1)类的名字和数据库雷同时,能够间接设置 resultType 参数为 Pojo 类
2)若不同,须要设置 resultMap 将后果名字和 Pojo 名字进行转换

33、应用 MyBatis 的 mapper 接口调用时有哪些要求?
答:
1)Mapper 接口办法名和 mapper.xml 中定义的每个 sql 的 id 雷同
2)Mapper 接口办法的输出参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型雷同
3)Mapper 接口办法的输入参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型雷同
4)Mapper.xml 文件中的 namespace 即是 mapper 接口的类门路。

34、Mybatis 比 IBatis 比拟大的几个改良是什么?
答:
1)有接口绑定, 包含注解绑定 sql 和 xml 绑定 Sql
2)动静 sql 由原来的节点配置变成 OGNL 表达式 3)在一对一, 一对多的时候引进了 association, 在一对多的时候引入了 collection 节点, 不过都是在 resultMap 外面配置

35、IBatis 和 MyBatis 在外围解决类别离叫什么?
答:IBatis 外面的外围解决类交 SqlMapClient,MyBatis 外面的外围解决类叫做 SqlSession。

36、IBatis 和 MyBatis 在细节上的不同有哪些?
答:
1)在 sql 外面变量命名有原来的 #变量# 变成了 #{变量}
2)原来的 $ 变量 $ 变成了 ${变量}
3)原来在 sql 节点外面的 class 都换名字交 type
4)原来的 queryForObject queryForList 变成了 selectOne selectList5)原来的别名设置在映射文件外面放在了外围配置文件里

嗨,你好呀,将来的架构师,本文由 Java 架构师面试网 www.javajiagoushi.com 收集整理并进行编辑公布,谢谢大家的反对~

退出移动版