请写一篇关于【MyBatis基础教程:Java持久层框架入门】的技术文章
去年十月,我在光谷软件园一家外包公司熬到凌晨两点,改完第37个SQL注入漏洞后,瘫在工位上啃冷掉的热干面。手机突然弹出前同事的消息:“兄弟,听说你在搞Java?我们组招人,大厂直签,月薪22k起。”
我差点把面汤泼键盘上——彼时我还在拿15k,房租3500,每天挤2号线转8号线,通勤两小时。那会儿我刚被领导骂完“连MyBatis都配不明白还写什么DAO层”,心里正嘀咕着要不要转行送外卖。
谁能想到,就因为认真啃完了MyBatis官方文档+写了三个小项目,三个月后我真的坐进了腾讯武汉研发中心的工位?今天这篇文,不灌鸡汤,就手把手带你从零搞懂MyBatis——顺便聊聊我这个二本菜鸡是怎么靠它逆袭的。
MyBatis到底是个啥?别被名字吓住!
第一次听说“MyBatis”是在某次面试。面试官(后来成了我leader)问:“你用过ORM框架吗?”
我支支吾吾:“嗯……Hibernate听说过,MyBatis好像也能操作数据库?”
他笑了:“那你回去补补课吧。”
回家路上我特地搜了下:MyBatis是一个半自动化的Java持久层框架。啥意思?简单说,就是帮你把Java对象和数据库记录“翻译”来翻译去的工具。不像Hibernate全自动(你只管写对象,它自动生成SQL),MyBatis让你自己写SQL,但它帮你处理参数绑定、结果映射这些脏活累活。
对新手超友好!尤其适合像我这样SQL还凑合、但讨厌写JDBC模板代码的人。
上手实战:三步搞定CRUD
别被“框架”俩字吓住。我第一次跑通MyBatis,只用了一个XML配置 + 一个Mapper接口 + 一行核心代码。
第一步:加依赖(Maven时代的老规矩)
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
第二步:写个UserMapper.xml(你的SQL集中营)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
注意:namespace必须和接口全路径一致,id就是方法名。MyBatis靠这个“魔法”把XML和接口绑在一起。
第三步:写接口 + 调用
public interface UserMapper {
User selectUserById(int id);
}
// 主程序里
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
try (SqlSession session = factory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user.getName()); // 输出:张三
}
是不是比原生JDBC清爽多了?不用再写PreparedStatement、不用手动ResultSet.next(),连关闭连接都try-with-resources帮你搞定。
为什么求职时MyBatis是加分项?
去年我面试某区块链创业公司(没错,武汉也有搞链的!),技术面考了两道题:
- 手写MyBatis动态SQL(
<if>标签怎么用) - 解释一级缓存和二级缓存的区别
我当场画了个草图解释:一级缓存是SqlSession级别的(同一个session查两次相同SQL,第二次走缓存);二级缓存是Mapper级别的(跨session共享,但要手动开启)。面试官眼睛一亮:“你还真懂点东西。”
其实我哪懂那么多?就是之前在家练手项目时,为了优化查询速度,硬啃了《MyBatis技术内幕》前五章。大厂不看你学历多光鲜,就看你解决问题时有没有“手感”。
顺便吐槽:现在有些公司一面就让手撕红黑树,但实际业务99%都是CRUD。MyBatis这种天天用的工具,反而更能体现工程能力。
别卷了!Python都开始学MyBatis思想了
上周五晚上,老婆看我在改MyBatis配置文件,随口问:“你这破框架有Python的SQLAlchemy香吗?”
我愣了一下——她说得对!现在很多Python Web框架(比如FastAPI)也在借鉴MyBatis的“SQL与逻辑分离”思想。甚至某些区块链项目的链下服务,也用MyBatis管理节点元数据。
技术不分语言,底层思维才是王道。你学会MyBatis的“映射”和“动态SQL”,再去看其他语言的ORM,会发现万变不离其宗。
给新人的血泪建议
- 别死记XML标签!先搞懂
#{}和${}区别(前者防SQL注入,后者直接拼接),其他标签用到再查。 - 一定要开日志!在
mybatis-config.xml里加:
看SQL怎么生成的,比看文档快十倍。<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> - 别迷信注解!虽然
@Select("SELECT * FROM...")很酷,但复杂SQL还是放XML里维护更方便。 - 关联查询用
<resultMap>,别傻乎乎在Java里嵌套查询——N+1问题会让你半夜惊醒。
写在最后:技术人的“持久层”
从二本毕业到进大厂,我最大的感悟是:持久层框架教会我的,不只是怎么连数据库,而是“如何把复杂系统拆解成可维护的模块”。
MyBatis之所以流行十年不衰,就是因为它在“自动化”和“可控性”之间找到了黄金平衡。就像我们的职业生涯——既不能完全躺平(全自动ORM),也不能事事亲力亲为(手写JDBC)。找到自己的节奏,持续输出价值,才是真正的“持久化”。
现在我在光谷软件园的新工位上,窗外是珞喻路的梧桐树。月薪22k,房租涨到了4000,但心里踏实多了。如果你也在武汉,正在为求职焦虑,不妨今晚就打开IDEA,新建一个MyBatis项目。
代码不会骗人,你敲下的每一行,都在为未来的自己铺路。
(对了,文末彩蛋:我整理了一份《MyBatis避坑指南》,包含动态SQL实战/缓存陷阱/批量插入优化,关注我私信“武汉加油”免费拿。别问为啥叫这个——毕竟,光谷的夜,总得有人点亮。)

评论 0