干了这么多年Java开发,手写JDBC那套代码的痛,估计每个程序员都深有体会。先不说每次都要手动注册驱动、获取连接、创建Statement、处理ResultSet,光是那些try-catch-finally嵌套,就够让人头大的。更别提SQL语句和Java代码硬生生绑在一起,改个需求就得动Java代码,维护成本高得离谱。直到MyBatis出现,这局面才算彻底改观。它把SQL语句从Java代码里解放出来,放到XML文件或者注解里管理,Java这边只负责调用接口方法,剩下的映射关系、参数绑定、结果集转换,MyBatis全给你包圆了。今天这篇实战指南,就带着你从零开始,把MyBatis操作数据库的整套流程捋清楚,保证你学完就能上手干活。

先说说MyBatis最核心的思路,其实就一句话:把Java方法和SQL语句对应起来。你定义一个Mapper接口,里面写上抽象方法,比如,然后在对应的XML文件里,用标签写上具体的SQL语句,通过属性跟方法名绑定。当你在代码里调用这个方法时,MyBatis就会自动执行绑定的SQL,然后把查询结果集映射成对象的列表返回给你。这中间省掉了大量手写结果集处理的代码,尤其是当表字段和Java属性名不一致时,你只需要在XML里配置一个,告诉MyBatis哪个字段对应哪个属性,剩下转换的脏活累活它全扛了。这种设计的好处是,SQL的调优、修改,完全不用碰Java代码,改XML文件就行,对运维和DBA也友好得多。
接下来聊实战配置。用MyBatis操作数据库,第一步肯定是搭建环境。你需要在里引入和数据库驱动依赖,比如MySQL的。然后创建MyBatis的全局配置文件,这里主要配置数据源和事务管理器。数据源可以直接用MyBatis自带的,也可以接入Druid、HikariCP这些第三方连接池,生产环境我建议用HikariCP,性能确实猛。配置完数据源,还得在标签里注册你的Mapper XML文件。这里有个小技巧,如果你用了Spring Boot,其实可以直接用,配置会简化很多,数据源、Mapper扫描都能自动搞定,但底层逻辑还是这套东西,理解了原理,用哪个框架都顺手。
然后就是写Mapper接口和XML映射文件了。这一步是整个实战的核心。假设你有一张表,字段是、、,对应的Java实体类属性也是这三个。你的Mapper接口就这么写:。然后在里,,namespace必须写全限定名,对应接口。接着写。这里是预编译参数占位符,能有效防止SQL注入,比字符串拼接安全一百倍。当你调用,MyBatis就会执行这条SQL,把结果映射成对象返回。
除了单表查询,增删改操作也是家常便饭。插入数据时,如果你想让数据库自增主键回填到实体类里,就得在标签里配置。这样插入完,就能拿到新生成的主键,特别实用。更新和删除就更简单了,和标签,写清楚SQL就行。还有个常见的坑是参数传递,当你的方法需要传多个参数时,比如,如果直接写会报错。解决办法有两个:要么用注解给每个参数起名字,要么用一个Map或实体类包装起来。我习惯用,语义清晰,代码也好看。
再深入一点,动态SQL是MyBatis最引以为傲的功能,没有之一。什么叫动态SQL?就是根据不同的条件拼接不同的SQL语句。比如你做一个用户搜索功能,用户可能只填了姓名,也可能只填了邮箱,还可能两个都填了,甚至一个都不填查全表。用传统JDBC,你得写一堆if-else去拼接字符串,还得注意空格和逗号,烦得要死。MyBatis里直接用标签就搞定:。注意那个,是为了让动态条件拼起来不别扭。还有标签,处理查询特别好用,比如批量删除:。这些标签组合起来,能写出极其灵活的SQL,而且可读性比Java里拼接字符串强太多了。
说说结果映射的高级玩法。有时候数据库字段是下划线风格,Java属性是驼峰风格,比如数据库是,Java是。你要是嫌麻烦,可以在全局配置里开启,MyBatis会自动做下划线转驼峰,省一大截功夫。但更复杂的场景,比如关联查询,查出来的结果要映射到嵌套对象里,就得自己写了。比如一个订单关联一个用户,你查,然后配置把对应到对象的,对应到的,这样返回的对象里就会带着一个完整的属性。这种映射能力,让MyBatis在面对复杂业务查询时依然游刃有余,而不是只能做简单的CRUD。
说到底,MyBatis操作数据库的整套思路就是:SQL不分离,但管理分离。SQL写在XML里,Java只管调用,两者通过接口方法名和namespace对应起来。你掌握了Mapper接口、XML映射、动态SQL、结果映射这几个核心点,基本上就能应对绝大多数项目需求了。而且MyBatis的社区非常活跃,遇到问题搜索一下,基本都有现成的解决方案。这篇实战指南把最常用的路径都走了一遍,剩下的就是你自己打开IDE,建个表,写个接口,跑通一条查询,那种“原来就这么回事”的感觉,比看十篇文章都有用。毕竟编程这手艺,动手才是硬道理。


