什么是example类

mybatis-generator会为每个字段产生Criterion,为底层的mapper.xml创建动态sql。如果表的字段比较多,产生的example类会十分庞大。理论上通过example类可以构造你想到的任何筛选条件。在mybatis-generator中加以配置,配置数据表的生成操作就可以自动生成example了。

 

example成员变量

example.setOrderByClause(“字段名 ASC”);    // 添加升序排列条件,DESC为降序
example.setDistinct(false)     // 去除重复,boolean型,true为选择不重复的记录。
criteria.andXxxIsNull     // 添加字段xxx为null的条件
criteria.andXxxIsNotNull    // 添加字段xxx不为null的条件
criteria.andXxxEqualTo(value)    // 添加xxx字段等于value条件
criteria.andXxxNotEqualTo(value)    // 添加xxx字段不等于value条件
criteria.andXxxGreaterThan(value)    // 添加xxx字段大于value条件
criteria.andXxxGreaterThanOrEqualTo(value)    // 添加xxx字段大于等于value条件
criteria.andXxxLessThan(value)    // 添加xxx字段小于value条件
criteria.andXxxLessThanOrEqualTo(value)    // 添加xxx字段小于等于value条件
criteria.andXxxIn(List<?>)     // 添加xxx字段值在List<?>条件
criteria.andXxxNotIn(List<?>)    // 添加xxx字段值不在List<?>条件
criteria.andXxxLike(“%”+value+”%”)    // 添加xxx字段值为value的模糊查询条件
criteria.andXxxNotLike(“%”+value+”%”)    // 添加xxx字段值不为value的模糊查询条件
criteria.andXxxBetween(value1,value2)   // 添加xxx字段值在value1和value2之间条件
criteria.andXxxNotBetween(value1,value2)    // 添加xxx字段值不在value1和value2之间条件

 

selectByExample

// 创建 Example 对象
CountryExample example = new CountryExample();
// 设置排序规则
example.setOrderByClause("id desc, name asc");
// 设置是否 distinct 去重
example.setDistinct(true);
// 创建条件,只能有一个 createCriteria
CountryExample.Criteria criteria = example.createCriteria();
// id >= 1
criteria.andIdGreaterThanOrEqualTo(1);
// id < 4
criteria.andIdLessThan(4);
// countrycode like '%U%'
// 最容易出错的地方,注意 like 必须自己写上通配符的位置,不可能默认两边加 %,like 可以是任何情况
criteria.andCountrycodeLike("%U%");
// or 的情况,可以有多个 or
CountryExample.Criteria or = example.or();
// 或者 name = 中国
or.andNameEqualTo("中国");
// 执行查询
List<Country> countryList = countryMapper.selectByExample(example);

 

updateByExampleSelective

// 创建 Example 对象
CountryExample example = new CountryExample();
// Example对象包含一个static的内部类Criteria,Criteria中的方法用来定义SQL语句where后的查询条件,只能有一个createCriteria
CountryExample.Criteria criteria = example.createCriteria();
// 更新所有 id > 2 的国家
criteria.andIdGreaterThan(2);
// 创建一个要设置的对象
Country country = new Country()
// 将国家名字设置为 China
country.setCountryname("China");
// 执行查询
countryMapper.updateByExampleSelective(country, example);

我们看CountryMapper接口,可以看到有 updateByExample和updateByExampleSelective。 这两个方法的区别是,当对象的属性为空的时候,第一个方法会将值更新为null , 第二个方法不会更新null属性的字段。 通过Example一般都是批量操作,由于country表存在主键id,不能被批量更新, 因此要使用updateByExampleSelective方法进行测试。

 

deleteByExample+countByExample

// 创建 Example 对象
CountryExample example = new CountryExample();
// Example对象包含一个static的内部类Criteria,Criteria中的方法用来定义SQL语句where后的查询条件,只能有一个createCriteria
CountryExample.Criteria criteria = example.createCriteria();
// 选择所有 id > 2 的国家
criteria.andIdGreaterThan(2);
// 执行查询
countryMapper.deleteByExample(example);
// 使用 countByExample 查询符合条件的数量
int count = countryMapper.countByExample(example);

 

复杂查询

and or 查询

Example example = new Example(User.getClass());
// where 条件
Criteria criteria = example.createCriteria();
Criteria criteria1 = example.createCriteria();
        
criteria.andIn("id", ids);
criteria1.orLike("des", "%" + des + "%");
criteria1.orLike("name", "%" + name + "%");
example.and(criteria1);
example.and().andEqualTo("status", staus)
// 等效于:where id in ( #{ids} ) and ( name like concat(‘%’, #{name} ,’%’) or des like concat(‘%’, #{des} ,’%’) ) and status = #{status}

 

注意:如果不加 example.and(criteria1);,则默认example只添加生成的第一个criteria,criteria1 将不会加到此条件中

 

数组参数的条件查询

Example example = new Example(User.getClass());
example.and().andEqualTo("sex", sex)
Example.Criteria criteria = example.createCriteria();
for (String str : names) {
    criteria.orLike("name", str);
}
example.and(criteria);
List<User> list = userMapper.selectByExample(example);
            
// 等效于:where sex = #{sex} and ( name like concat(‘%’, #{name1} ,’%’) or name like concat(‘%’, #{name2} ,’%’) )