哈喽各位码友,欢迎来到我的“小米说面试”系列!
今天我们来聊一个Java社招面试中出镜率极高的常客——MyBatis。
说真的,前不久我跳槽去面字节的时候,面试官问我的第一个问题就是:
“你们项目里用的ORM框架是什么?为什么不用JPA,用MyBatis?”
我当时心里一咯噔,MyBatis这哥们我明明用得六熟,突然被问到这个“哲学层面”的问题,居然卡了一下……(尴尬脸.jpg)
后来我总结了一下,如果面试时你对 MyBatis 的理解还停留在“它是个持久层框架,可以写SQL映射Java对象”这种表面回答,很容易被一波追问带走。
所以今天就让我这个老码农小米,给你讲讲我和MyBatis的故事,从是什么到为什么用,再到怎么用好,希望你下次面试不再“背刺”。
从前有个项目,叫“CRUD地狱”
时间拉回几年前,我还是某大厂外包团队的一名搬砖选手。
那时候我们在做一个政务系统,说白了就是典型的CRUD应用,模块多、字段多、表也多得离谱,一张表五十多个字段见怪不怪。
我们的项目最早用的是原生JDBC + DAO 手撸 SQL 的方式,每次写个插入或者查询,像这样:
哇,当时真的是,写代码像在写诗,每句都是自己填的坑。一改表结构,整片 DAO 类都得大动干戈。
于是领导拍板:我们上 MyBatis 吧。
MyBatis初相识:它到底是啥?
听到“上MyBatis”,我当时一脸懵。
“MyBatis 是什么?”
领导大手一挥,说了句:
“它是个轻量级 ORM 框架,不像 JPA 那么重,写 SQL 自由、灵活,跟我们这种项目特别搭。”
于是我开始接触 MyBatis,从搭建配置,到第一个 mapper.xml,一步一步从“我是谁我在哪”走到了“我悟了”。
来,干货时间到——我们认真回答一下:
MyBatis 是什么?
MyBatis 是一个半自动的 ORM(对象关系映射)框架,用来简化 Java 程序对数据库的操作。
- 它不会像 JPA 那样自动生成 SQL,而是需要手动写 SQL;
- 它通过 XML 或注解的方式,把 SQL 和 Java 的实体类映射起来;
- 它支持动态 SQL、参数映射、结果映射,还能集成 Spring,做到无缝对接。
简单说,你写 SQL,它来帮你“翻译”成 Java 能理解的数据结构,还能帮你维护连接池、缓存、事务等一堆底层麻烦事。
有个比喻我很喜欢:JDBC 是手动挡,JPA 是自动挡,MyBatis 是半自动挡,既能省力,又能掌控节奏。
面试官追问:为啥不用 JPA?
回到开头那个面试现场,面试官的“灵魂追问”来了:
“那你们为什么用 MyBatis,不用 JPA 呢?”
这问题乍一听简单,实则深藏杀机。
别急,我们可以从这几个方面来回答:
控制力
- JPA 更自动化,但也是“黑盒”操作,生成的 SQL 你不一定能控制,调优麻烦。
- 而 MyBatis 是“我写我放心”,业务复杂的时候控制力更强。
学习曲线
- JPA 学起来比 MyBatis 要陡峭,尤其是遇到实体类关系映射(OneToMany、ManyToMany)时,很多新手会绕晕。
- MyBatis 则逻辑清晰,SQL 爱好者的福音。
性能可控
- JPA 的懒加载、脏检查虽然听起来优雅,但对性能优化和查询调优来说是个坑。
- MyBatis 的执行路径更直接,你写什么就执行什么,性能更可控。
项目类型适配
- 不是所有项目都需要全自动 ORM,像我们的 CRUD 系统、报表系统,业务逻辑靠 SQL 比 Java 强,MyBatis 更合适。
MyBatis 怎么用?一个Mapper的旅程
小伙伴经常问我,“MyBatis 怎么快速上手?”
我一般会用一个词来总结:三件套。
MyBatis 三件套:
- Mapper 接口
- Mapper 映射文件(XML)
- 实体类(POJO)
假如我们有一张表 users,我们要查一个用户:
第一步:写实体类 User
第二步:写 Mapper 接口
第三步:写 Mapper XML(UserMapper.xml)
第四步:配置 MyBatis 核心配置文件
然后你就可以在代码里这样调用啦,是不是一下清晰了?MyBatis 的核心思想其实就是——我写 SQL,它做映射。
动态SQL、注解开发、分页插件,一个都不能少!
你以为这就完了?
别忘了,面试时常有“加分项”!
比如以下几个 MyBatis 功能,一定要掌握:
1、动态 SQL
2、注解方式
不想用 XML?MyBatis 也支持注解:
3、分页插件 PageHelper
MyBatis 原生不支持分页,但可以集成 PageHelper:
面试官最后问:你踩过哪些坑?
哦对了,面试官最爱问的还有一句:
“你用 MyBatis 遇到过哪些坑?”
别慌,以下是我常总结的几个“面试高频坑”:
- 返回值是 List,resultType 写错成对象类型
- 正确写法:resultType="com.xxx.User" 用在返回单个对象上;
- 返回列表时,要么配好 resultMap,要么用 resultType="User" 并确保 SQL 返回的是多行。
- 字段映射不一致,导致结果为空
- 数据库字段 user_name,实体类字段 userName,要加 resultMap 映射,或者用 @Alias 配合 underscoreToCamelCase=true。
- 事务不提交,增删查无效
- 用原生 MyBatis 时记得:session.commit() ,不然数据没写进库。
尾声:写在跳槽季的最后
跳槽季,MyBatis 是面试官最爱的“老面孔”。
它不如 Spring Boot 那样炫酷,不像 Kafka 那样大杀器,但却像你项目里最靠谱的老大哥——实用、稳定、效率高。
如果你还没学透 MyBatis,建议你:
- 亲手写几个 Mapper;
- 跑一下分页插件和动态 SQL;
- 试着搭个 Spring Boot + MyBatis 的项目;
别忘了,基础决定上限,细节决定面试的成败。
END
如果你觉得这篇文章对你有帮助,欢迎点个“在看”或转发给你的 Java 小伙伴,让更多人告别“面试踩坑 MyBatis”的苦日子!
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!