更新时间:2022-12-14 16:44:20 来源:极悦 浏览1100次
mybatis是一个优秀的基于Java持久层框架,内部它是封装了JDBC,让开发者不用过多的关心什么创建连接、加载驱动啊等等。如今大企业越来越多用mybatis,为什么它越来越被广泛应用,以前流行的SSH框架开发,而现在完全势向于SSM框架开发,今天讲解mybatis框架常见面试题。
● 谈一谈你对ORM的理解?
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。当然反过来也是可以的,例如将数据库表当中的记录查询出来,然后映射为Java程序中的Java对象。
● 在MyBatis中$和#的区别?
$进行sql语句的拼接,#是专门给sql语句传值的。$就是JDBC当中的Statement,#就是JDBC当中的PreparedStatement。$的这种方式使用时需要特别注意sql注入问题。
● 你对MyBatis的一级缓存和二级缓存有了解吗,说一下?
Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SqlSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。
MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口,配置方法很简单,只需要在映射XML文件配置就可以开启缓存了。
由于我们在实际的开发中目前都会使用第三方的缓存技术,例如Redis,所以MyBatis这块的二级缓存没有太多的了解。
● MyBatis的parameterType怎么理解的?
parameterType属性用来指定参数类型,parameterType属性是专门用来给sql语句占位符#{}传值的,底层原理使用了反射机制,#{}的大括号当中需要提供实体类的属性名,底层使用属性名拼接get方法来获取属性值,将属性值传递给sql语句。
● MyBatis的resultType是怎么理解的?
resultType用来指定结果集封装的数据类型,当一个select语句查询之后得到结果集,结果集的列名需要和java实体类的属性名一致,不一致的可以使用as关键字给列起别名,拿着列名拼接set方法,通过反射机制调用set方法给结果集对象的属性赋值。
● MyBatis中resultMap用过吗,它是干什么的?
在MyBatis当中,查询结果集被封装为Java对象,可以通过resultType,也可以通过resultMap,在resultMap当中描述了数据库表的列与Java对象的属性之间的对应关系。在映射关系中,还可以通过resultMap的typeHandler设置实现查询结果值的类型转换。另外,最重要的是通过resultMap的子标签比如、等,可以实现一对一、一对多等的映射。
● MyBatis底层实现原理?
MyBatis是一个持久层框架,实现了ORM思想,可以将查询的结果集自动转换成Java对象,也可以将Java对象转换成一条数据插入到数据库表当中。
那么,查询结果集是如何自动转换成Java对象的呢?实际上这里使用了反射机制,在配置文件中假设编写了一条select语句,查询之后,列名与属性名要一一对应(不对应的可以采用给列起别名),然后每个列名前添加“set”,通过反射机制获取set方法,然后再通过反射机制的method.invoke()来调用这个set方法,给Java对象的属性赋值。这样就完成了对象的封装。
另外,Java对象是如何转换成一条记录插入到数据库的呢?假设在配置文件中编写了一条insert语句,那么这条语句需要的值从哪里来呢,在mybatis的mapper配置中有parameterType属性,该属性是专门给sql语句占位符传值的,其实这里也是使用了反射机制,其中sql语句的占位符采用#{},其中大括号当中需要提供java对象的属性名,该属性名和get进行拼接得到get方法名,然后通过反射机制获取该get方法,再通过method.invoke()来调用这个get方法,这样就可以获取到对应的属性值,然后传入了。
其实MyBatis设计最牛的地方当然是采用JDK动态代理的方式生成DAO接口的实现类了。其中DAO接口中的每一个方法名对应sql语句的id。DAO接口中的方法不允许重载,因为id是不允许重复的。以上大概就是我了解的MyBatis实现原理。
以上就是“被问到很多次的mybatis面试题及答案”,你能回答上来吗?如果想要了解更多的相关内容,可以关注极悦Java官网。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习