Java mybatis面试题及答案

本文详细探讨了MyBatis的核心概念,包括ORM理解、$与#的区别、一级缓存和二级缓存的原理,以及一对多实现方式。同时,解释了parameterType和resultType的作用,介绍了resultMap在映射关系中的重要性。此外,文章还讨论了MyBatis与Hibernate的区别,动态SQL的使用,以及MyBatis中其他常用的标签。最后,文章提到了MyBatis与Spring、SpringMVC的关联,以及并发编程、Redis和Dubbo的相关知识。
摘要由CSDN通过智能技术生成

MyBatis专题

● 谈一谈你对ORM的理解?

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。当然反过来也是可以的,例如将数据库表当中的记录查询出来,然后映射为Java程序中的Java对象。

● 在MyBatis中$和#的区别?

KaTeX parse error: Expected 'EOF', got '#' at position 12: 进行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一对多你是怎么实现的?

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

image.png

image.png

● 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对象的呢?实际上这里使用了反射机制,在配置文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值