1338 字
约 4 分钟
2
SQL构建器
无标签

第21章 SQL构建器

学习MyBatis SQL构建器的使用方法和最佳实践 学习进度:84% 代码演示按钮 💻 查看完整代码 - 在线IDE体验

🎯 学习目标

📚

理解 SQL 构建器核心概念

掌握 MyBatis SQL 构建器的基本原理和使用方法 🔧

掌握动态 SQL 构建技巧

学会使用 SQL 构建器创建复杂的动态 SQL 语句 💡

了解最佳实践

明确在实际项目中的应用场景和最佳实践

🌟 SQL构建器概述

MyBatis SQL构建器是一个强大的工具,它允许开发者以编程方式构建SQL语句,而不是使用字符串拼接。这种方式提供了类型安全、代码复用和动态SQL生成的能力。

🛡️ 类型安全

编译时检查SQL语法,避免运行时错误,提供IDE智能提示支持。

🔄 动态生成

根据条件动态添加WHERE子句、JOIN操作和排序规则。

♻️ 代码复用

SQL片段复用,通用查询模板,模块化SQL组件。

🔧 易维护

清晰的代码结构,易于调试和测试,版本控制友好。

🛠️ 技术栈

MyBatis 3.5.13MySQL 8.0.33Java 17Maven

🔧 基础SQL构建

SQL构建器提供了流畅的API来构建各种类型的SQL语句:

查询SQL构建

String selectSql = new SQL()
    .SELECT("id, username, email, age")
    .FROM("user")
    .WHERE("id = #{id}")
    .toString();
                生成的SQL: SELECT id, username, email, age FROM user WHERE id = ?

插入SQL构建

String insertSql = new SQL()
    .INSERT_INTO("user")
    .VALUES("username", "#{username}")
    .VALUES("email", "#{email}")
    .VALUES("age", "#{age}")
    .toString();
                生成的SQL: INSERT INTO user (username, email, age) VALUES (?, ?, ?)

🔄 动态SQL构建

SQL构建器的真正威力在于动态SQL的构建,可以根据运行时条件灵活生成SQL:

public String buildDynamicQuery(Map<String, Object> params) {
    SQL sql = new SQL();
    sql.SELECT("*").FROM("user");
    
    if (params.get("username") != null) {
        sql.WHERE("username LIKE CONCAT('%', #{username}, '%')");
    }
    
    if (params.get("email") != null) {
        sql.WHERE("email = #{email}");
    }
    
    if (params.get("minAge") != null) {
        sql.WHERE("age >= #{minAge}");
    }
    
    sql.ORDER_BY("create_time DESC");
    
    return sql.toString();
}

📋 SQL提供者模式

通过@SelectProvider、@UpdateProvider等注解,可以将SQL构建逻辑与Mapper接口分离:

Mapper接口定义

@Mapper
public interface UserMapper {
    
    @SelectProvider(type = UserSqlProvider.class, method = "selectByCondition")
    List<User> selectByCondition(Map<String, Object> params);
    
    @UpdateProvider(type = UserSqlProvider.class, method = "updateByCondition")
    int updateByCondition(Map<String, Object> params);
}

SQL提供者类

public class UserSqlProvider {
    
    public String selectByCondition(Map<String, Object> params) {
        SQL sql = new SQL();
        sql.SELECT("id", "username", "email", "age", "create_time")
           .FROM("user");
        
        if (params.get("username") != null) {
            sql.WHERE("username LIKE CONCAT('%', #{username}, '%')");
        }
        
        return sql.toString();
    }
}

⚡ 内联SQL构建器

对于简单的动态SQL,可以直接在Mapper接口中使用内联构建器:

static String buildInlineQuery(@Param("username") String username, 
                              @Param("minAge") Integer minAge) {
    return new org.apache.ibatis.jdbc.SQL() {{
        SELECT("*");
        FROM("user");
        if (username != null) {
            WHERE("username LIKE CONCAT('%', #{username}, '%')");
        }
        if (minAge != null) {
            WHERE("age >= #{minAge}");
        }
        ORDER_BY("create_time DESC");
    }}.toString();
}

🚀 高级特性

复杂查询构建

// 关联查询
String joinSql = new SQL()
    .SELECT("u.id, u.username, u.email")
    .SELECT("p.title, p.content")
    .FROM("user u")
    .LEFT_OUTER_JOIN("post p ON u.id = p.user_id")
    .WHERE("u.status = 'ACTIVE'")
    .ORDER_BY("u.create_time DESC")
    .toString();

批量操作

// 批量插入构建
public String buildBatchInsert(@Param("users") List<User> users) {
    SQL sql = new SQL();
    sql.INSERT_INTO("user")
       .INTO_COLUMNS("username", "email", "age");
    
    // 动态构建VALUES子句
    for (int i = 0; i < users.size(); i++) {
        sql.INTO_VALUES(
            "#{users[" + i + "].username}",
            "#{users[" + i + "].email}", 
            "#{users[" + i + "].age}"
        );
    }
    
    return sql.toString();
}

最佳实践

  • 简单查询使用注解:对于简单的CRUD操作,直接使用@Select、@Insert等注解
  • 复杂查询使用构建器:对于动态条件、复杂关联的查询使用SQL构建器
  • 代码复用:将通用的SQL构建逻辑抽取为独立方法
  • 类型安全:充分利用构建器的类型安全特性,避免字符串拼接
  • 性能考虑:对于频繁调用的SQL,考虑缓存构建结果
  • 测试覆盖:为SQL构建器编写充分的单元测试

🛠️ 实践练习

练习任务

  1. 创建一个用户查询的SQL构建器,支持按用户名、邮箱、年龄范围进行动态查询
  2. 实现一个批量更新的SQL构建器,根据不同条件更新不同字段
  3. 构建一个复杂的统计查询,包含分组、聚合函数和HAVING子句
  4. 设计一个通用的分页查询构建器,支持动态排序和条件过滤

本章小结

📖 本章小结

本章我们学习了 MyBatis SQL构建器 的相关内容,包括:

  • SQL构建器概述:了解了SQL构建器的核心概念和优势
  • 基础SQL构建:掌握了基本的SELECT、INSERT、UPDATE、DELETE语句构建
  • 动态SQL构建:学会了根据条件动态生成SQL语句
  • SQL提供者模式:理解了如何将SQL构建逻辑与Mapper接口分离
  • 内联SQL构建器:掌握了在Mapper接口中直接使用构建器的方法
  • 高级特性:学习了复杂查询、批量操作等高级用法
  • 最佳实践:了解了SQL构建器的最佳实践和注意事项

通过本章的学习,你已经具备了使用MyBatis SQL构建器进行复杂SQL开发的能力。 下一章节 🎉

恭喜完成本章学习!

你已经掌握了 SQL构建器 的核心知识 第22章SpringBoot 集成学习 MyBatis 与 SpringBoot 的深度集成和配置优化⏱️预计 30 分钟📊中等难度开始学习 → ← 第20章 📚 课程目录 第22章 →

SQL构建器
http://www.clxhxhhr.top/posts/2863/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。