MyBatis Generator中Example的使用

在 MyBatis 框架中,Example 是一个由 MyBatis Generator(代码生成工具)自动创建的类,用于动态构建 SQL 查询中的 WHERE 子句。它通过封装查询条件,避免了手动拼接 SQL 的繁琐,提升代码可读性和可维护性。以下是其核心要点:


一、Example 的核心作用

  1. 动态条件封装
    Example 类将查询条件(如等于、大于、模糊匹配等)封装为对象,开发者通过链式调用方法组合条件,无需手写 WHERE 语句。

    • 例如:

      UserExample example = new UserExample();
      example.createCriteria()
          .andUsernameEqualTo("admin")   // username = 'admin'
          .andAgeGreaterThan(20);        // AND age > 20
      

    生成的 SQL:WHERE username = 'admin' AND age > 20

  2. 支持复杂逻辑组合

    • 组内条件:默认用 AND 连接(如 criteria.andXxx().andYyy())。
    • 组间条件:通过 oredCriteria 属性支持多组 OR 关系(见下文详解)。

二、Example 的核心结构

  1. Criteria

    • Example 的内部类,用于定义一组条件(组内条件默认为 AND 连接)。
    • 通过 andXxx() 方法添加具体条件(如 andUsernameEqualTo())。
  2. oredCriteria 属性

    • 类型为 List<Criteria>,存储多个条件组。

    • 组间关系为 OR,例如:

      Criteria group1 = example.createCriteria(); // 第一组:id IN (1,2)
      group1.andIdIn(Arrays.asList(1, 2));
      
      Criteria group2 = example.createCriteria(); // 第二组:name LIKE 'A%'
      group2.andNameLike("A%");
      
      // 最终 SQL: WHERE (id IN (1,2)) OR (name LIKE 'A%')
      

      此处 oredCriteria包含 group1 和 group2。

  3. 关键方法

    • createCriteria():创建新条件组并添加到 oredCriteria
    • or(Criteria criteria):显式添加条件组(推荐使用)。

三、Example 的典型用法

  1. 基础查询

    UserExample example = new UserExample();
    example.createCriteria()
        .andEmailLike("%@gmail.com")   // 邮箱含 "@gmail.com"
        .andStatusEqualTo(1);           // 状态为激活
    List<User> users = userMapper.selectByExample(example);
    
  2. 多组 OR 条件

    UserExample example = new UserExample();
    // 第一组:手机号以 138 开头
    Criteria criteria1 = example.createCriteria();
    criteria1.andPhoneLike("138%");
    
    // 第二组:注册时间在 2025 年后
    Criteria criteria2 = example.createCriteria();
    criteria2.andCreateTimeGreaterThan("2025-01-01");
    
    // 组合条件:(phone LIKE '138%') OR (create_time > '2025-01-01')
    List<User> users = userMapper.selectByExample(example);
    
  3. 排序与去重

    example.setOrderByClause("create_time DESC"); // 按创建时间降序
    example.setDistinct(true);                   // 去重查询
    

四、Example 的优缺点

优点

  • 代码简洁:避免 SQL 字符串拼接错误。
  • 类型安全:方法名强制匹配字段(如 andAgeGreaterThan() 要求参数为数字)。
  • 动态灵活:支持条件动态增减。

局限性

  • 仅限单表查询:多表关联需手写 SQL。
  • 生成类臃肿:表字段多时 Example 类体积较大。

五、设计思想解析

Example 的本质是 “条件对象化”

  • 将 SQL 的 WHERE 子句拆解为 Criteria 对象(组内条件)和 oredCriteria(组间关系)。
  • 通过方法名(如 andXxx())隐式定义运算符(=, >, LIKE 等),实现语义化编程。

总结

Example 是 MyBatis 动态查询的“构造器”,核心价值在于:

  1. Criteria 封装组内 AND 条件
  2. oredCriteria 管理组间 OR 逻辑
  3. 通过方法链取代 SQL 拼接,提升开发效率。

适合单表复杂条件查询,但多表关联仍需结合 XML 或注解 SQL。合理使用可显著减少冗余代码,增强可读性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值