MyBatis + SQL 使用方法大全(工程级)
适用:后台系统 / 政务人事 / 审批流 / 统计报表 / 主子表
一、最基础的 CRUD(你肯定会,但要完整)
1️⃣ 单表查询
SELECT * FROM user WHERE id = #{id}
<select id="getById" resultType="User">
2️⃣ 插入
INSERT INTO user(name, age) VALUES(#{name}, #{age})
3️⃣ 更新(动态)
<update id="updateUser">
UPDATE user
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age}</if>
</set>
WHERE id = #{id}
</update>
4️⃣ 删除
DELETE FROM user WHERE id = #{id}
二、动态 SQL(MyBatis 的灵魂)
1️⃣ <if>
<if test="name != null">
AND name = #{name}
</if>
2️⃣ <where>(自动处理 AND)
<where>
<if test="name != null">AND name = #{name}</if>
</where>
3️⃣ <foreach>(IN 查询)
AND id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
4️⃣ <choose>(switch-case)
<choose>
<when test="type == 1">AND status = 'A'</when>
<otherwise>AND status = 'B'</otherwise>
</choose>
三、多表 JOIN 的所有套路
1️⃣ INNER JOIN(必须有关联)
FROM a
JOIN b ON a.id = b.a_id
2️⃣ LEFT JOIN(主表全量)
FROM a
LEFT JOIN b ON a.id = b.a_id
统计 / 0 值 / 是否存在 → 必用 LEFT JOIN
3️⃣ 多表 JOIN
a
LEFT JOIN b
LEFT JOIN c
四、聚合与统计(90% 的坑在这)
1️⃣ 聚合函数
| 函数 | 用途 |
|---|---|
| COUNT(col) | 非空统计 |
| SUM(col) | 求和 |
| AVG(col) | 平均 |
| MAX/MIN | 极值 |
2️⃣ GROUP BY 铁律(MySQL 8)
SELECT 里的字段
= GROUP BY 字段 + 聚合函数
3️⃣ HAVING(组后过滤)
HAVING COUNT(*) > 1
❌ 不能用 WHERE
五、分页的所有写法
1️⃣ MySQL 分页
LIMIT #{offset}, #{pageSize}
2️⃣ 总数查询
SELECT COUNT(*) FROM table WHERE ...
3️⃣ 主表分页 + 子表
✅ 永远只对主表分页
六、一对多 / 多对一 映射大全(重点)
1️⃣ 一对一(association)
<association property="dept"
select="selectDeptById"
column="dept_id"/>
2️⃣ 一对多(collection)
<collection property="children"
ofType="ChildVO"
select="selectChildren"
column="id"/>
你现在用的就是这一套
3️⃣ JOIN + resultMap(扁平结果)
<resultMap>
<id column="id"/>
<collection property="list" ofType="Item"/>
</resultMap>
七、EXISTS / IN / 子查询(性能级)
EXISTS(首选)
WHERE EXISTS (SELECT 1 FROM b WHERE ...)
IN(小集合)
WHERE id IN (1,2,3)
子查询
WHERE id IN (SELECT id FROM ...)
八、窗口函数(高级但非常实用)
1️⃣ ROW_NUMBER
ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY id)
用途:
- 序号
- 分组排名
- posIndex
2️⃣ RANK / DENSE_RANK
排名相关
九、JSON / 字符串聚合(慎用)
JSON_ARRAYAGG(MySQL 8)
JSON_ARRAYAGG(JSON_OBJECT(...))
❗ ORM 不友好,慎用
GROUP_CONCAT
GROUP_CONCAT(name SEPARATOR ',')
十、XML 特殊符号规则(必背)
| SQL | XML |
|---|---|
< | < |
> | > |
<= | <= |
>= | >= |
十一、TypeHandler(定制映射)
使用场景
- JSON
- 枚举
- List / Map
<result typeHandler="xxxHandler"/>
十二、性能与工程级原则(核心)
✅ 永远记住
- 主表分页
- 子表延迟加载
- EXISTS > IN
- LEFT JOIN 做统计
- SQL 不做 JSON
- 复杂结构 → Java 组装
- SQL 层只关心“数据正确”
十三、你现在处在什么水平?
| 等级 | 说明 |
|---|---|
| CRUD | 新手 |
| 动态 SQL | 初级 |
| JOIN + GROUP | 中级 |
| EXISTS + collection | 高级 |
| 性能 + 结构设计 | 架构级 ← 你在这 |