Mybatis 面试题
1、什么是mybatis?
mybatis 是一个ORM类型的半自动框架,对JDBC代码进行了封装,是一个与数据库打交道的持久层框架,可以通过XML和注解来配置原生信息,简化了开发。
2、mybatis的优缺点?
优点:基于xml编写sql,方便灵活,与JDBC相比,减少了代码冗余,很好的与不同的数据库兼容,能够很好的和spring框架集成。
缺点:SQL语句的编写能力要求较高,依赖与数据库,不同的数据的移植性较差,数据库不能随意更换。
3、 #{}和${}的区别是什么?
#{}:是预编译处理
KaTeX parse error: Expected 'EOF', got '#' at position 21: …符串替换 mybatis在处理#̲{}时,会将sql中的#{}替…{}时就是将${}替换为变量值。
4、当实体类的属性名和字段名不一致,怎么办?
1、可以在编写sql语句的时候给字段名取别名。
2、可以通过resultMap标签来映射字段名和实体类属性名的对应关系。
5、说一下resultMap和resultType。
① resultMap时手动提交,resultType时自动提交。
② resultMap是对外部外部定义别名时的引动,resultType是直接返回自己所需要的类型,resultMap和resultType不能够同时存在。
③ 当返回类型是resultMap时时,Map不能很好的表示领域模型,需要把它进一步转为对象,这取决于我们的需要来决定
④ 当返回的参数是resultType时,mybatis会将返回的Map里面的键值对,取出来赋给指定对象的相同属性。
6、如何在Mapper接口中传递多个参数?
① 可以将多个参数封装为Map。
② 或者使用@Param注解。
以上是常用方式。
7、mybatis的xml映射文件中,不同的xml的id是否可以重复?
如果不同的xml配置文件,配置了各自的namespace,那么id是可以重复的,因为mybatis是根据namespace+方法id来作为key来寻找队形的sql语句的。
8、mybatis的 一级、二级缓存,如何开启。什么样的数据适合缓存?
9、什么是mabatis的接口绑定,有哪些实现方式?
mybatis的接口绑定就是将mapper接口中的方法和sql语句进行绑定,在我们调用接口的使用使用的是对应的sql语句。
实现方式:
1、直接在Mapper接口的方法上加上注解如@Select。
2、通过xml来进行绑定,namespace是接口的全路径名,id则是对应方法名。
10、Hibernate和Mybatis的区别?
① 相同点:
都是对JDBC的封装,持久层框架,用于dao层的开发。
②不同点:
1、mybatis是一个半自动框架,配置java对象和sql查询结果的对应关系,多表关联配置简单。
2、 Hibernate是一个全表映射框架,配置java对象和数据库表的对应关系,多表关联系统配置复杂。
3、SQL的优化和移植性
Hibernate对sql语句封装,提供了日志、缓存、级联(级联比mybaits强大)等特性,此外还提供了HQL操作数据库,数据库的无关性支持好,但是会多消耗性能。但是SQL语句的优化比较麻烦。
Mybatis需要手动编写SQL,处理列表、动态生成表名、支持存储过程。开发量相对较大,不支持数据库的无关性,SQL语句优化方便。
11、Mybatis的功能架构是怎么样的?
1、读取mybatis的配置文件,配置mybatis的运行环境,例如数据库的连接信息。
2、加载映射文件,mybatis-config.xml可以加载多个映射文件,每个文件对应数据库中的一张表。
3、构造会话工厂:通过mybatis的环境等配置信息构建SqlsessionFactory。
4、创建会话对象:由会话工厂创建sqlSession对象,该对象中包含了执行sql语句的所有方法。
5、Executor执行器:mybatis底层定义了一个Exector接口来操作数据库,它将根据sqlSession传递的参数动态的生成需要执行的sql语句,同时负责查询缓存的维护。
6、MappedStatement对象:在Exector接口的执行方法中由一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
7、输入参数映射:输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和对象类型。
12、mybatis是否支持延迟加载,如果支持。它的实现原理是什么?
mybatis仅支持association关联对象和collection关联集合对象的延迟加载,在mybatis配置文件中,可以配置是否延迟加载LazyLoadingEnabled=true | false
.