mybatis菜鸟教程
MyBatis菜鸟教程
我第一次用MyBatis的菜程时候,差点被它的鸟教XML配置搞疯。明明SQL就写在那,菜程可就是鸟教查不出数据,后来才发现是菜程resultType写错了,把User写成了user。鸟教大小写这玩意儿,菜程在MyBatis里真能要命。鸟教
其实MyBatis就是菜程个帮你管数据库连接的中间层。你写SQL,鸟教它帮你执行;你写接口,菜程它帮你映射。鸟教核心就俩文件:一个mapper XML(或者注解),菜程一个配置文件。鸟教配置文件管数据源和连接池,菜程mapper管SQL语句。
打个比方,MyBatis就像个外卖小哥。你(业务代码)不用自己跑去餐厅(数据库)做饭(执行SQL),只要在菜单(mapper)上点菜(调用接口方法),小哥就会把菜送到你手上(返回结果对象)。但前提是——你得把菜单写好。
新手最容易栽的坑,第一个就是#{ } 和 ${ }的区别。#{ } 是预编译,会生成问号占位符,安全防注入;${ }是字符串拼接,直接把值塞进SQL里,有注入风险。我见过有同事图省事用${ }排序字段,结果被DBA骂了半小时。排序字段这种动态列名,确实没法用#{ } ,但至少要做白名单校验。
第二个坑是N+1查询。你以为关联查询就是或标签一写就完事?天真。如果没配懒加载,MyBatis会先查主表,再逐条查关联表,100条数据就是101次查询,数据库直接卡死。解决办法要么用join查询一次性取完,要么配lazyLoadingEnabled=true,但懒加载也有坑——在事务外访问懒加载属性会报LazyInitializationException。
说个我自己的糗事。刚开始用MyBatis时,我总觉得XML里写SQL很丑,非要全用注解。结果写了个动态查询,标签里套,那字符串拼接得跟意大利面似的,自己都看不下去。后来才明白,复杂SQL老老实实写XML,注解只适合简单增删改查。工具没有高低贵贱,顺手才是王道。
还有个细节容易被忽略——mapper接口和XML文件的绑定。接口的包路径、方法名、参数类型,必须和XML的namespace、id一一对应。一旦不对齐,启动时不会报错,运行时才报BindingException,排查起来特别恶心。我的习惯是,写完mapper接口立刻写XML,然后跑个单元测试验证绑定,别攒到最后一起测。
MyBatis的日志输出也值得提一嘴。开发阶段把log-impl设成STDOUT_LOGGING,能直接看到SQL和参数值。线上环境记得关掉或改成SLF4J,否则日志量能淹死你。我见过生产环境开着SQL日志的,一天几个GB,磁盘直接爆掉。
如果你用的是Spring Boot,那更省事。mybatis-spring-boot-starter自动帮你配好SqlSessionFactory,只要在application.yml里写mapper-locations: classpath:mapper/*.xml就行。不过自动配置也有个隐藏坑——如果多个数据源,得手动指定SqlSessionFactory,不然连错库查半天。
最后说个实战技巧:分页别用limit手写,直接上PageHelper插件。但注意,PageHelper只对紧跟着的第一条查询生效,中间别插别的SQL操作。我同事有次在分页查询前做了个更新操作,结果分页失效,数据全查出来了,差点线上事故。
MyBatis这东西,说白了就是SQL和Java之间的翻译官。你不需要背任何API,只要记住:SQL是你的,映射是你的,连接池是别人的。把这三个关系理清,基本就出师了。剩下的坑,踩一个记一个,比看十篇教程都管用。









