请写一篇关于【MyBatis基础教程:Java持久层框架入门】的技术文章

半夜部署日记
2025-12-17 06:31
阅读 2093

去年十月的一个深夜,我坐在海珠区出租屋的书桌前,窗外是老城区熟悉的骑楼和偶尔驶过的摩托车声。桌上泡面已经凉了,屏幕上是一堆报错信息,org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)。那一刻,我真的想把键盘砸了。

我是阿强,一个从广东某二本院校毕业、在广州打拼五年的Java后端程序员。刚毕业那会儿,在一家小公司做外包,月薪5k,房租3500,天天吃肠粉配白粥。老婆总说:“你这行当,不就是敲代码嘛,有啥难的?”可她不知道,有时候一行代码能卡我一整天。

从“裸写JDBC”到MyBatis:我的血泪史

2019年,我还在那家外包公司,项目用的是原始JDBC——没错,就是那种手写ConnectionPreparedStatementResultSet全套的“硬核”操作。每次写DAO层,我都感觉自己像个在泥地里刨食的农民,重复劳动多到怀疑人生。

比如查个用户信息,代码长这样:

String sql = "SELECT id, name, email FROM user WHERE id = ?";
try (Connection conn = dataSource.getConnection();
     PreparedStatement ps = conn.prepareStatement(sql)) {
    ps.setInt(1, userId);
    ResultSet rs = ps.executeQuery();
    if (rs.next()) {
        User user = new User();
        user.setId(rs.getInt("id"));
        user.setName(rs.getString("name"));
        user.setEmail(rs.getString("email"));
        return user;
    }
} catch (SQLException e) {
    e.printStackTrace();
}

看着就累。更别提还要手动处理事务、连接池、异常……那时候,我连“ORM”是啥都不知道,只知道每天加班到九点,回家地铁上都在背SQL语句。

转折点出现在2021年春天。我在Boss直聘上投了一家做SaaS系统的初创公司,面试官是个戴眼镜的中年技术主管。他看了我简历后问:“你们项目用什么持久层框架?”

我老实回答:“就……原生JDBC。”

他皱了皱眉:“没用过MyBatis或者Hibernate?”

我摇头。他叹了口气:“小伙子,现在企业级开发,没人这么干了。你回去学学MyBatis吧,至少要会基本CRUD。”

那天晚上,我躺在床上翻来覆去睡不着。老婆问我怎么了,我说:“可能要失业了。”她说:“怕啥,大不了回老家开肠粉店。”我苦笑——开肠粉店也得有钱租铺啊。

MyBatis入门:不是魔法,但比魔法好使

我咬牙花了两周时间,下班后泡在图书馆(其实是麦当劳,因为家里Wi-Fi太卡),从零开始啃MyBatis官方文档。说实话,一开始完全看不懂那些<mapper>#{}resultMap是啥玩意。

但慢慢地,我发现MyBatis真的香。

第一,它把SQL和Java代码解耦了。
以前SQL写死在Java文件里,改个字段要重新编译。现在SQL全放在XML文件里,运维同事都能帮忙调优(虽然他们经常把#{}写成${},然后被我骂)。

第二,自动映射省了80%的样板代码。
还是那个查用户的例子,用MyBatis后:

<!-- UserMapper.xml -->
<select id="selectUserById" resultType="com.example.User">
    SELECT id, name, email FROM user WHERE id = #{id}
</select>

Java代码直接:

User user = userMapper.selectUserById(123);

没了!不用手动set属性,不用处理ResultSet。那一刻我差点哭出来——原来程序员也可以活得像个人。

第三,动态SQL真·神器。
以前要做条件查询,得拼字符串:

StringBuilder sql = new StringBuilder("SELECT * FROM user WHERE 1=1");
if (name != null) sql.append(" AND name LIKE '%").append(name).append("%'");
// ... 后面还有十种条件

不仅丑,还容易SQL注入。而MyBatis的<where><if>标签,写起来清爽又安全:

<select id="searchUsers" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">
            AND name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
    </where>
</select>

被运营“教育”的一天:为什么后端要懂业务?

去年夏天,我们团队接了个新需求:给运营后台加个数据导出功能。运营小姐姐小林跑来找我:“阿强,能不能导出最近一个月活跃用户?要包含手机号、注册渠道、最近登录时间。”

我说:“行啊,SQL很简单。”
结果她补了一句:“对了,注册渠道如果是‘抖音’的,要标红;‘微信’的标蓝。”

我愣住:“这……是前端的事吧?”
她说:“老板说你们后端直接返回带颜色的数据,前端不动。”

我当时内心OS:这什么奇葩需求?但转念一想——后端不能只埋头写接口,得理解业务场景。 运营要的不是“数据”,而是“能直接用的数据”。于是我在MyBatis的resultMap里加了个typeHandler,根据渠道字段自动填充颜色值:

<resultMap id="UserWithColor" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="channel" column="channel"/>
    <result property="color" column="channel" typeHandler="ChannelColorTypeHandler"/>
</resultMap>

后来小林请我喝了杯喜茶,说:“你们后端终于懂我们要啥了!” 那一刻,我觉得自己不只是个“码农”,而是产品链条上的一环。

Python?对,我也偷偷在用

说到这里,你可能会问:不是讲MyBatis吗,怎么扯到Python了?

其实现在很多后端工程师都会点Python,尤其是做数据清洗、自动化脚本的时候。我们组有个哥们,用Python写了个小工具,每天凌晨自动跑MyBatis生成的慢SQL日志,分析哪些接口需要优化。他还得意地说:“你看,Java写业务,Python搞运营支持,双剑合璧!”

我自己也用Python写过一个MyBatis XML校验脚本——检查有没有漏写parameterType,或者resultMap引用不存在的字段。虽然公司用的是Java生态,但工具无边界,解决问题才是王道

从月薪15k到22k:框架只是起点

今年三月,我跳槽进了广州一家电商大厂,月薪从15k涨到22k。面试时,面试官让我现场写个MyBatis的多表关联查询。我用了<association><collection>,还顺手加了二级缓存配置。他点点头:“看来是真的用过,不是背八股文的。”

回想当初那个连BindingException都看不懂的我,现在也能在团队里带新人了。上周五晚上,一个实习生问我:“强哥,MyBatis和JPA哪个好?”

我说:“别纠结框架,先搞懂为什么需要ORM。MyBatis给你SQL自由,JPA给你对象抽象。选哪个,取决于你的团队、业务和你能掌控的复杂度。”

写给正在挣扎的你

如果你现在也在为MyBatis的配置头疼,为resultMap的嵌套抓狂,我想说:别怕,我们都经历过。

我曾经在出租屋里对着报错信息发呆到凌晨两点,也曾因为一个#{}${}的区别被线上事故打脸。但正是这些“坑”,让我从外包仔变成了大厂工程师。

技术没有捷径,但有方法:

  • 先跑通,再优化:别一上来就想用<cache><discriminator>,先把增删改查写顺。
  • 看源码,但别死磕:MyBatis源码很清晰,遇到问题翻翻SqlSessionTemplateMapperProxy,往往豁然开朗。
  • 和业务结合:后端不是孤立的,多和产品、运营聊,你会发现自己写的代码更有价值。

最后,分享一句我贴在显示器边的话:“代码是写给人看的,顺便让机器执行。” MyBatis也好,Spring Boot也罢,工具再强大,也不如一颗愿意解决问题的心。

如今,我依然住在老城区,房租涨到了4200,但老婆再也不说“敲代码有啥难的”了。上周她还问我:“你们那个MyBatis,是不是跟肠粉一样,一层包一层?”

我笑了:“差不多吧,不过它包的是SQL和Java,肠粉包的是牛肉和鸡蛋。”

生活和代码一样,慢慢熬,总会入味。

评论 0

最热最新
暂无评论
半夜部署日记Lv.1
0
影响力
0
文章
0
粉丝