被问“为什么你们项目不用 JPA 用 MyBatis?”我这样回答拿下了 offer!

12 阅读5分钟



哈喽各位码友,欢迎来到我的“小米说面试”系列!

今天我们来聊一个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 遇到过哪些坑?”

别慌,以下是我常总结的几个“面试高频坑”:

  1. 返回值是 List,resultType 写错成对象类型
  • 正确写法:resultType="com.xxx.User" 用在返回单个对象上;
  • 返回列表时,要么配好 resultMap,要么用 resultType="User" 并确保 SQL 返回的是多行。
  1. 字段映射不一致,导致结果为空
  • 数据库字段 user_name,实体类字段 userName,要加 resultMap 映射,或者用 @Alias 配合 underscoreToCamelCase=true。
  1. 事务不提交,增删查无效
  • 用原生 MyBatis 时记得:session.commit() ,不然数据没写进库。

尾声:写在跳槽季的最后

跳槽季,MyBatis 是面试官最爱的“老面孔”。

它不如 Spring Boot 那样炫酷,不像 Kafka 那样大杀器,但却像你项目里最靠谱的老大哥——实用、稳定、效率高

如果你还没学透 MyBatis,建议你:

  • 亲手写几个 Mapper;
  • 跑一下分页插件和动态 SQL;
  • 试着搭个 Spring Boot + MyBatis 的项目;

别忘了,基础决定上限,细节决定面试的成败。

END

如果你觉得这篇文章对你有帮助,欢迎点个“在看”或转发给你的 Java 小伙伴,让更多人告别“面试踩坑 MyBatis”的苦日子!

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!