mybatis Example Criteria like 模糊查询问题

2023-02-27 15:05:53

目录简介Criteria类简单实例生成简单的WHERE子句复杂查询模糊查询实战总结用Mybatis代码生成工具会产生很多个XXXExample类,这些类的作用是什么?查阅了很多资料,在这里总结归纳一下...

目录
简介
Criteria类
简单实例
生成简单的WHERE子句
复杂查询
模糊查询实战
总结

用MyBATis代码生成工具会产生很多个XXXExample类,这些类的作用是什么?

查阅了很多资料,在这里总结归纳一下

简介

XXXExample类用于构造复杂的筛选条件

它包含一个名为Criteria的内部静态类,它包含将在where子句中一起结合的条件列表。

Criteria类的集合允许您生成几乎无限类型的where子句。

可以使用createCriteria方法或or方法创建Criteria对象。

当使用createCriteria方法创建第一个Criteria对象时,它会自动添加到Criteria对象列表中 -

如果不需要其他子句,则可以轻松编写简单的Where子句。使用or方法时,Criteria类将添加到所有实例的列表中。

官方建议仅使用or方法创建Criteria类。这种方法可以使代码更具可读性。

Criteria类

Criteria内部类包括每个字段的andXXX方法,以及每个标准SQL谓词

包括:

字段方法含义IS NULL表示相关列必须为NULLIS NOT NULL表示相关列不能为NULL=(等于)表示相关列必须等于方法调用中传入的值<>(不等于)表示相关列不能等于方法调用中传入的值>(大于)表示相关列必须大于方法调用中传入的值> =(大于或等于)表示相关列必须大于或等于方法调用中传入的值<(小于)表示android相关列必须小于方法调用中传入的值<=(小于或等于)表示相关列必须小于或等于方法调用中传入的值LIKE意味着相关列必须“类似”方法调用中传入的值。代码不会添加所需的’%’,您必须自己在方法调用中传入的值中设置该值。NOT LIKE意味着相关列必须“不喜欢”方法调用中传入的值。代码不会添加所需的’%’,您必须自己在方法调用中传入的值中设置该值。BETWEEN意味着相关列必须“在”方法调用中传入的两个值之间。NOT BETWEEN意味着相关列必须“不在”方法调用中传入的两个值之间。IN表示相关列必须是方法调用中传入的值列表之一。NOT IN表示相关列不能是方法调用中传入的值列表之一。

简单实例

生成简单的WHERE子句

 TestTableExample example = new TestTableExample();
 example.createCriteria().andField1EqualTo(5);

或者

 TestTableExample example = new TestTableExample();
 example.or().andField1EqualTo(5);

实际上动态生成的where子句是这样

where field1 = 5

复杂查询

TestTableExample example = new TestTableExample();

 example.or()
  .andField1EqualTo(5)
  .andField2IsNull();

 example.or()
  .andField3NotEqualTo(9)
  .andField4IsNotNull();

 List<Integer> field5Values = new ArrayList<Integer>();
 field5Values.add(8);
 field5Values.add(11);
 field5Values.add(14);
 field5Values.add(22);

 example.or()
  .anttnGYawjdField5In(field5Values);

 example.or()
  .andField6Between(3, 7);

实际上动态生成的where子句是这样

  where (field1 = 5 and field2 is null)
  or (field3 <> 9 and field4 is not null)
  or (field5 in (8, 11, 14, 22))
  or (field6 between 3 and 7)

可以通过在任何示例类上调用setDistinct(true)方法来强制查询为DISTINCT。

模糊查询实战

自己根据理解配合PageHelper做了一个简单的多条件模糊查询加深理解

具体实现如下,支持多个字段的同时搜索

    PageHelper.startPage(pageNum,pageSize);
    TbBrandExample example = new TbBrandExample();
    TbBrandExample.Criteria criteria = example.createCriteria();
    if (tbBrand != null) {
      if (tbBrand.getName() != null && tbBrand.getName().length()>0) {
        criteria.andNameLike("%"+tbBrand.getName()+"%");
      }
      if (tbBrand.getFirstChar() != null && tbBrand.getFirstChar().length()>0) {
        criteria.andFirstCharLike("%"+tbBrand.getFirstChar()+"%");
      }
    }
    Page<TbBrand> page = (Page<TbBrand>) brandMapper.selectByExample(example);
    return new PageResult((int) page.getTotal(),page.getResult());

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。