欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MyBatis常见的概念性面试题

程序员文章站 2022-04-28 22:50:43
...

MyBatis常见的概念性面试题

一.填空题

1.#{}和$ {}的区别是什么?#{}是_____,${}是_____。

正确答案: 预编译处理 字符串替换

2. MyBatis中提供了一级缓存和二级缓存,其中()默认存在,不可控制,同一SqlSession范围内的操作共享该缓存,增、删、改后将()。

正确答案:一级缓存 清除缓存

3.Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复? 不同的Xml映射文件,如果配置了namespace,那么id____;如果没有配置namespace,那么id____;

正确答案: 可以重复 不能重复

4.MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的()框架,几乎封装了所有的JDBC代码和参数的手动设置以及结果集的检索,通过XML或注解的方式进行配置映射实现数据库操作,大大提高了开发效率。

正确答案:持久层

二.多选题

1.对mybatis描述有误的是?

A. MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架
B. MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面
C. Mybatis是一个全ORM(对象关系映射)框架,它内部封装了JDBC
D. MyBatis 只可以使用 XML来配置和映射原生信息
正确答案: C, D

2. Mybatis是如何将sql执行结果封装为目标对象并返回的

A. id
B. 标签
C. 使用sql列的别名
D. resultType
正确答案: B, C

3.mybaties中模糊查询like语句的写法

A. select * from foo where bar like #{value}
B. select * from foo where bar like #{%value%}
C. select * from foo where bar like %#{value}%
D. select * from foo where bar like “%”${value}"%"
正确答案: A, D

4.Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复? 选择说法正确的

A. 不同的Xml映射文件,如果配置了namespace,那么id可以重复
B. 如果没有配置namespace,那么id不能重复
C. 如果没有配置namespace,id能重复
D. 不同的Xml映射文件,如果配置了namespace,那么id不可以重复
正确答案: A, B

5.Mybatis的mapper接口调用时候的要求正确的是

A. Mapper接口方法名和Mapper.xml中定义的每个SQL的id相同;
B. Mapper接口方法的输入参数类型和mapper.xml中定义的每sqlparameterType类型相同
C. Mapper接口方法的输入输出参数类型和mapper.xml中定义的每个sqlresultType的类型相同
D. Mapper.xml文件中的namespace,就是接口的名字
正确答案: A, B, C

6.MyBatis内置类型别名有

A. _int
B. Integer
C. int
D. String
正确答案: A, C

7.Mybatis动态sql标签有哪些?

A. trim
B. foreach
C. set
D. than
正确答案: A, B, C

8.Mybaits的优点正确的是?

A. 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理
B. 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接
C. 很好的与各种数据库兼容
D. 它是一全个ORM框架,MyBatis不需要程序员自己编写Sql语句。
正确答案: A, B, C

9.实体类中的属性名和表中的字段名不一样怎么处理?【选择二项】

A. 查询的sql语句中定义字段名的别名分数: 2
B. 不用处理
C. 通过来映射字段名和实体类属性名
D. 通过来映射字段名和实体类属性名
正确答案: A, C

三. 单选题

1.在mybatis的配置文件中,通过( )标签来设置实体类的别名。

A. properties
B. settings
C. typeAliases
D. dataSource
正确答案: C

2. 下列( )不属于 MyBatis全局配置文件中的标签

A. settings
B. select
C. plugins
D. properties
正确答案: B

3.在Mybatis中,SQL映射文件中配置insert语句时,在SQLSERVER中插入语句所在的表的ID为自动增长列,下列关于insert标签的说法,正确的是( )

A. 必须要显示插入标识列中的值
B. 使用任何数据库都可以使用自动生成主键策略
C. useGeneratedKeys属性对update标签也有作用
D. 可以使用useGeneratedKeys属性允许标识列的自动增长用于生成主键
正确答案: D

4.在 MyBatis 中,操作数据库的核心类是

A. SqlSessionFactory
B. SqlSession
C. Session
D. SqlSessionFactoryBuilder
正确答案: B

5. 在使用MyBatis的时候,除了可以使用@Param注解来实现多参数入参,还可以用()传递多个参数值。

A. 用Map对象可以实现传递多参数值
B. 用List对象可以实现传递多参数值
C. 用数组的方式传递
D. 用Set集合的方式传递
正确答案: A

6.在 MyBatis 中,配置结果映射时,使用( )标签实现多对1的关 联

A. many-one
B. one-many
C. association
D. collection
正确答案: C

7. MyBatis操作数据库时的接口方法中,如果传入的参数名和动态sql中使用时不一致,则需要使用( )注解修饰。

A. @RequestParam
B. @Parameter
C. @String
D. @Param
正确答案: D

8.在mybatis中,配置结果映射时,使用( )标签实现一对多的关 联

A. many-one
B. one-many
C. association
D. collection
正确答案: D

9.MyBatis 中对复杂数据映射到一个结果集的配置使用的标签是( )

A. < resultMap>
B. < result>
C. < map>
D. < collection>
正确答案: A

10. 在 MyBatis 动态 SQL 中,循环使用的标签名是( )。

A. for
B. while
C. foreach
D. do-while
正确答案: C

11. 看程序进行分析:Public UserselectUser(String name,String area); <select id="selectUser"resultMap=“BaseResultMap”> select * fromuser_user_t whereuser_name = #{0} anduser_area=#{1} < /select> #{0} 表示哪一个参数?

A. 程序报错
B. name
C. area
D. 0
正确答案: B

12. MyBatis对JDBC访问数据库的代码进行封装,从而大大简化了数据访问层的重复性代码,它是针对三层架构中( )的解决方案

A. 表现层分数: 2
B. 业务逻辑层
C. 持久化层
D. 数据库系统
正确答案: C

13.MyBatis生命周期说法错误的是

A. SqlSessionFactoryBuilder实例的最佳作用域是方法范围,也就是定义为本地方法变量既可
B. SqlSessionFactory实例的生命周期应该在整个应用的执行期间都存在
C. SqlSession实例时线程不安全的,因此其生命周期应该是请求或方法范围
D. SqlSession实例通常定义为一个类的静态变量
正确答案: D

14.以下不属于一对多的是?

A. 帅哥和美女
B. 学生和班级
C. 投影和学生
D. 学校和班级
正确答案: A

15. 在MyBatis中,在进行select查询映射时,下列关于返回类型的说 法,正确的是( )

A. 只能是resultType
B. 只能是resultMap
C. 可以是resultType或resultMap
D. 以上说法都不正确
正确答案: C

16.配置实体包的别名,正确的写法是

A. < typeAliases>
< package name=“com.swjd.bean”/>
< /typeAliases>
B. < typeAliases>
< package name=“com/swjd/bean”/>
< /typeAliases>
C. < typeAliase>
< package name=“com.swjd.bean”/>
< /typeAliase>
D. < package>
< package name=“com.swjd.bean”/>
< /package>
正确答案: A

17. 一辆汽车由多个零部件组成,且相同的零部件可适用于不同型号的汽车,则汽车实体集与零部件实体集之间的联系是( )

A. 1 : M
B. 1:1
C. M : 1
D. M : N
正确答案: D

18. 编译Java程序的命令是

A. appletviewer
B. javac
C. java分数: 2
D. javadoc
正确答案: B

19.在MyBatis数据库操作时,需要编写( )和对应的Xml文件,其 中Xml文件中编写的是对应Sql语句

A. 接口和抽象方法
B. 普通类和普通方法
C. 抽象类和抽象方法
D. 普通类和抽象方法
正确答案: A

20.在 MyBatis 中,配置结果映射时,使用( )标签实现1对多的关 联

A. many-one
B. one-many
C. association
D. collection
正确答案: D

四.问答题

1.什么是MyBatis

(1)MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
IBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(Dao)。
(2)MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
(3)Mybatis提供一种“半自动化”的ORM(Object Ralation Mapping 对象关系映射框架)实现。MyBatis需要手动写SQL,后期可以****!这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言,“全自动”ORM实现了POJO和数据库表之间的映射,以及 SQL 的自动生成和执行。

2.MyBatis的优点

1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
(4)能够与Spring很好的集成;
(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

3.MyBatis框架的缺点:

(1)SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

4.MyBatis框架适用场合:

(1)MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。
(2)对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

5.MyBatis实现一对一有几种方式?

具体怎么操作的有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置association节点配置一对一的类就可以完成;嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置

6.MyBatis实现一对多有几种方式,怎么操作的

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置collection节点配置一对多的类就可以完成;嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置

7.MyBatis里面的动态Sql是怎么设定的?用什么语法?

MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL(对象图导航语言)语法来实现,但是如果要写的完整,必须配合where,trim节点,where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉

8.讲下MyBatis的缓存

MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,默认是打开的, 使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/

9.MyBatis(IBatis)的好处是什么

ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的维护带来了很大便利。ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成JavaBean对象,大大简化了Java数据库编程的重复工作。因为Ibatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,因此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。

10.MyBatis与Hibernate有哪些不同?

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

11.Mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

12.Mybatis动态sql有什么用?执行原理?

batis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理
是根据表达式的值 完成逻辑判断并动态拼接sql的功能。

13.如何获取自动生成的(主)键值?

采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传
入的参数对象中。
usegeneratedkeys=”true” keyproperty=”id”

14.使用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接口的类路径。

15.使用LIKE的方法。(推荐使用)第一种方法是,在Java代码中添加SQL通配符。

示例一:

String wildcardName = "%Smi%";  
List<Name> names = mapper.selectLike(wildcardName);
<select id="selectLike">  
select * from foo where bar like #{value}  
<select>

第二种方式是在SQL语句中拼接通配符。这种方法相对来说安全性要低一些,因为可能会被SQL注入攻击。
示例二:

String wildcardName = "Smi";  
List<Name> names = mapper.selectLike(wildcardName);
<select id="selectLike">  
select * from foo where bar like '%' || '${value}' || '%'  
<select>**  

重要提示: 请注意两种方式中 $ 和 # 的使用!

16.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,支持延迟加载的原理都是一样的。

17.Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

18.Mybatis中如何执行批处理?

使用BatchExecutor完成批处理。

19.Mybatis都有哪些Executor执行器?它们之间的区别是什么?

Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。

20.Mybatis中如何指定使用哪一种Executor执行器?

在Mybatis配置文件中,可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。
15、Mybatis是否可以映射Enum枚举类?
Mybatis可以映射枚举类,不单可以映射枚举类,Mybatis可以映射任何对象到表的一列上。映射方式为自定义一个TypeHandler,实现TypeHandler的setParameter()和getResult()接口方法。TypeHandler有两个作用,一是完成从javaType至jdbcType的转换,二是完成jdbcType至javaType的转换,体现为setParameter()和getResult()两个方法,分别代表设置sql问号占位符参数和获取列查询结果。

21.Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?

虽然Mybatis解析Xml映射文件是按照顺序解析的,但是,被引用的B标签依然可以定义在任何地方,Mybatis都可以正确识别。原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下的标签,包含B标签,待所有标签解析完毕,Mybatis会重新解析那些被标记为未解析的标签,此时再解析A标签时,B标签已经存在,A标签也就可以正常解析完成了。

22.简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?

Mybatis将所有Xml配置信息都封装到All-In-One重量级对象Configuration内部。在Xml映射文件中,标签会被解析为ParameterMap对象,其每个子元素会被解析为ParameterMapping对象。标签会被解析为ResultMap对象,其每个子元素会被解析为ResultMapping对象。每一个、、、标签均会被解析为MappedStatement对象,标签内的sql会被解析为BoundSql对象。

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

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。面试题看似都很简单,但是想要能正确回答上来,必定是研究过源码且深入的人,而不是仅会使用的人或者用的很熟的人,以上所有面试题及其答案所涉及的内容

24. Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

25.Xml映射文件中,除了常见的select|insert|update|delete标签之外,还有哪些标签?

注:这道题出自京东面试官。
还有很多其他的标签,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

26.简述Mybatis的插件运行原理,以及如何编写一个插件

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

27.一级、二级缓存

1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。
2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:
3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

28.什么是MyBatis的接口绑定?有哪些实现方式?

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