MyBatis-3写SQL语句的72种技巧

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张3蜂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值