# Mybatis Example 对象

Example 对象是一种简化条件查询的方案。通过它,你避免去编写大量的 DAO 中的 selectByXxx() 方法。

在对单表进行条件查询时,Example 对象非常好用,但是对于 “多表关联查询,且查询条件分散在多表中的情况” Example 对象就无能为力了。这种情况下,在不引入新的方案的前提下,则需要使用之前的 “注解” 功能,由程序员自己编码 SQL 语句了。

# 简单的情况

这里的简单情况指的是:没有,或只有 and 关系:

EmployeeExample example = new EmployeeExample();

example.createCriteria()
    .andEmpnoEqualTo(7369)
    .andSalGreaterThanOrEqualTo(1500)
    .andSalLessThan(2000);

List<Employee> list = dao.selectByExample(example);
System.out.println(list.size());

or() 方法是一个更通用的形式,可以用于实现任意的查询条件。其原理在于,任何一个复杂的查询语句,总能写成如下形式:

where (... and ... and ...) or (... and ... and ...) or (...)

# 复杂的情况

这里的复杂情况指的是:有 or 关系,甚至是 andor 混用。

TestTableExample example = new TestTableExample();

// 第 1 个括号中的两个并列条件
example.or()
    .andAaaEqualTo(5)
    .andBbbIsNull();

// 第 2 个括号中的两个并列条件
example.or()
    .andCccNotEqualTo(9)
    .andDddIsNotNull();

// 第 3 个括号中的唯一的条件
List<Integer> list = new ArrayList<Integer>();
list.add(8);
list.add(11);
list.add(14);
list.add(22);
example.or()
    .andEeeIn(field5Values);

// 第 4 个括号中的唯一的条件
example.or()
    .andFffBetween(3, 7);

相当于

where (aaa = 5 and bbb is null)
     or (ccc != 9 and ddd is not null)
     or (eee in (8, 11, 14, 22))
     or (fff between 3 and 7);