什么是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} ,’%’) )