MyBatis代码生成器-Example讲解

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

OR 查询

VehDriverExample example = new VehDriverExample();
VehDriverExample.Criteria criteria = example.createCriteria();
criteria.andIdNumberEqualTo(vehDriverParam.getIdNumber());

VehDriverExample.Criteria criteria2 = example.createCriteria();
criteria2.andLicenseNumberEqualTo(vehDriverParam.getLicenseNumber());
example.or(criteria2);

VehDriverExample.Criteria criteria3 = example.createCriteria();
criteria3.andCertificateCodeEqualTo(vehDriverParam.getCertificateCode());
example.or(criteria3);

// 等效于 select * from driver where id_number = ? or license_number = ? or certificate_code = ?

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mephisto180502

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值