MyBatis + SQL 使用方法大全(工程级)

15 阅读2分钟

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 特殊符号规则(必背)

SQLXML
<&lt;
>&gt;
<=&lt;=
>=&gt;=

十一、TypeHandler(定制映射)

使用场景

  • JSON
  • 枚举
  • List / Map
<result typeHandler="xxxHandler"/>

十二、性能与工程级原则(核心)

✅ 永远记住

  1. 主表分页
  2. 子表延迟加载
  3. EXISTS > IN
  4. LEFT JOIN 做统计
  5. SQL 不做 JSON
  6. 复杂结构 → Java 组装
  7. SQL 层只关心“数据正确”

十三、你现在处在什么水平?

等级说明
CRUD新手
动态 SQL初级
JOIN + GROUP中级
EXISTS + collection高级
性能 + 结构设计架构级 ← 你在这