MyBatis 是一款广泛使用的持久层框架,它通过映射 XML 或注解将 SQL 语句与 Java 对象关联。随着项目的复杂性增加,开发者往往需要编写越来越多的 SQL 语句,MyBatis 提供了丰富的功能来优化和简化 SQL 编写过程。本文将介绍 72 种 MyBatis 编写 SQL 语句的技巧,帮助你更高效、更灵活地使用 MyBatis。
1. 使用动态 SQL (SQL 构建)
- 标签:根据条件判断是否执行某一 SQL 片段。
<if test="username != null">AND username = #{username}</if>
- 标签:类似于 Java 中的 switch 语句。
<choose>
<when test="type == 'A'">SELECT * FROM tableA</when>
<when test="type == 'B'">SELECT * FROM tableB</when>
<otherwise>SELECT * FROM tableC</otherwise>
</choose>
2. 使用 标签简化 WHERE 子句
- 自动处理前缀的 "AND" 或 "OR"。
<where>
<if test="name != null">name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
</where>
3. 使用 标签控制 SQL 前后空格
- 去除多余的空格、前缀或后缀。
<trim prefix="WHERE" prefixOverrides="AND">
<if test="name != null">name = #{name}</if>
</trim>
4. 使用 标签进行批量操作
- 用于处理集合类参数,常见于批量插入或查询。
<foreach collection="list" item="item" separator=",">
#{item}
</foreach>
5. 分页查询技巧
- 使用
<if>
判断是否传递了分页参数,并动态修改查询条件。
<select id="findByPage" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">AND name = #{name}</if>
</where>
LIMIT #{pageNum}, #{pageSize}
</select>
6. MyBatis 提供的动态 SQL 语言
- 标签:用于动态修改 SET 子句(如在更新操作中)。
<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>
7. 传递 List 集合和 Map
- MyBatis 支持将 List 或 Map 类型作为参数传递给 SQL 查询。
<select id="findByIds" resultType="User">
SELECT * FROM user WHERE id IN
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</select>
8. 使用多条件查询
- 组合多个
<if>
判断条件,灵活生成查询 SQL。
<select id="findUsers" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">AND name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
<if test="city != null">AND city = #{city}</if>
</where>
</select>
9. 使用 MyBatis 内置函数
- MyBatis 提供了一些常用的内置函数,如
#{}
转换为 SQL 参数、$
用于 SQL 语句拼接等。
<select id="selectByCity" resultType="User">
SELECT * FROM user WHERE city = #{city}
</select>
10. 高级查询技巧:JOIN 和子查询
- 多表连接查询:将多个表通过 JOIN 查询,适用于复杂的数据模型。
<select id="findUserOrders" resultType="UserOrder">
SELECT u.name, o.order_id, o.amount
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
</select>
11. 使用 SQL 注解
- 在 Java 类中使用注解形式配置 SQL 语句。
@Select("SELECT * FROM user WHERE id = #{id}")
User findUserById(int id);
12. 使用 Caching 提高查询性能
- 启用一级缓存:MyBatis 默认启用一级缓存,每次 SQL 查询都会缓存结果。
- 启用二级缓存:可以配置缓存跨多个 SqlSession 实例使用。
<cache/>
13. 动态选择数据库(多数据源)
- 根据不同的条件选择数据源,如根据用户身份切换数据库。
<select id="selectUser" resultType="User" datasource="dataSource1">
SELECT * FROM user WHERE id = #{id}
</select>
14. 优化 SQL 执行计划
- 通过 SQL 映射中动态生成索引提示,优化查询性能。
<select id="findUserWithIndex" resultType="User">
SELECT /*+ INDEX(user_index) */ * FROM u