"小崔,写SQL映射文件不是写SQL语句那么简单。参数怎么来、结果怎么回、主键怎么拿,每一步都有MyBatis的规矩。"——白歌
本章定位
一句话:本章解决"如何在XML映射文件中编写增删改查、如何传递参数、如何映射结果、如何复用SQL片段"的问题。
飞翔科技的订单模块进入开发高峰,黄俪的前端页面已经就绪,小崔需要把用户、订单、商品的CRUD接口全部落地。白歌要求:所有SQL必须走映射文件,参数必须显式声明,结果映射必须清晰可维护。这一章,小崔把MyBatis的"SQL编写规范"吃透。
学习路线图
学习顺序说明:
- 先掌握四大操作标签(select / insert / update / delete)→ 知道MyBatis怎么包装原生SQL
- 再学参数传递(参数传递与占位符)→ 知道
#{}和${}的区别,防止SQL注入 - 再学结果映射(resultType → resultMap → 自动映射详解)→ 从简单到复杂,从自动到手动
- 最后学复用与辅助(sql片段 / 主键生成策略 / SQL语句构建器)→ 提升开发效率和代码整洁度
文件关系说明
| 文件 | 一句话角色 |
|---|---|
select.md | 查询入口:最常用标签,掌握id、resultType/resultMap、parameterType |
insert.md | 插入入口:返回影响行数,配合主键生成策略获取自增ID |
update.md | 更新入口:全量更新与增量更新的写法差异 |
delete.md | 删除入口:物理删除与逻辑删除的映射文件实践 |
参数传递与占位符.md | 安全与灵活:#{}预编译防注入、${}字符串替换用于动态表名/列名 |
resultType.md | 简单映射:单表查询、列名与属性名一致时的零配置映射 |
resultMap.md | 复杂映射:列名与属性名不一致、嵌套对象、一对多关系的映射基石 |
自动映射详解.md | 自动与手动的边界:settings中autoMappingBehavior控制的三档策略 |
sql片段.md | 复用机制:抽取公共列名、条件片段,避免重复书写 |
主键生成策略.md | 插入闭环:useGeneratedKeys、keyProperty、selectKey处理自增/序列/UUID |
SQL语句构建器.md | 代码辅助:Java API动态拼接SQL,为复杂条件查询提供另一种选择 |
知识图谱
核心概念关系:
select/insert/update/delete是四大"动作标签",所有业务SQL都挂在它们下面参数传递是"输入层",#{}走预编译(安全)、${}走字符串替换(灵活但危险)resultType是"简单输出层",适合单表、列名与属性名一致;resultMap是"复杂输出层",解决命名不一致、嵌套、关联sql片段是"复用层",被多个语句引用,维护一处、全局生效主键生成策略是"插入闭环",解决"插完数据后ID怎么回到Java对象"的问题SQL语句构建器是"代码层替代方案",当XML不够灵活时,用Java代码拼接
与下一章的衔接
本章学完后,小崔能写标准的CRUD,但遇到"根据多个可选条件查询"、"批量插入"、"动态更新"时,XML里写一堆 <if> 判断又丑又难维护。
下一章《动态SQL》将解决:如何用 <if>、<where>、<foreach>、<trim> 等标签,像搭积木一样组装SQL,让映射文件既灵活又整洁。
"静态SQL是基本功,动态SQL才是生产环境的刚需。用户的前端筛选条件,可不会按你的XML格式来。"——黄俪