mybatis中关于example类详解mybatis的Example[Criteria]的使用

时间:2025-03-23 07:13:56

一、什么是example类

 

     mybatis-generator会为每个字段产生如上的Criterion,如果表的字段比较多,产生的Example类会十分庞大。理论上通过example类可以构造你想到的任何筛选条件。在mybatis-generator中加以配置,配置数据表的生成操作就可以自动生成example了。具体配置可以参考MBG有关配置。

     下面是mybatis自动生成example的使用。

 

二、了解example成员变量

 

     //升序还是降序

     //参数格式:字段+空格+asc(desc)

     protected String orderByClause;

     //去除重复

     //true是选择不重复记录

     protected boolean distinct;

     //自定义查询条件

     //Criteria的集合,集合中对象是由or连接

     protected List<Criteria> oredCriteria;

     //内部类Criteria包含一个Cretiron的集合,

     //每一个Criteria对象内包含的Cretiron之间

     //是由AND连接的

     public static class Criteria extends GeneratedCriteria {

         protected Criteria() {

             super(); 

         }

     }

     //是mybatis中逆向工程中的代码模型

     protected abstract static class GeneratedCriteria

     {…..}

     //是最基本,最底层的Where条件,用于字段级的筛选

     public static class Criterion {……}

 

三、example使用前的准备

 

     比如我的example是根据user表生成的,UserMapper属于dao层,是对应的映射文件

     UserMapper接口:

 

long countByExample(CompetingStoreExample example);

List<CompetingStore> selectByExample(CompetingStoreExample example);

    在我们的测试类里:

 

     UserExample example = new UserExample();

      criteria = ();

四、查询用户数量

 

 long count = (example);

      类似于:select count(*) from user

 

五、where条件查询或多条件查询

 

     ("age asc");//升序

     (false);//不去重

 

     if(!(())){

          (());

     }

 

     if(!(())){

          (());

     }

 

     List<User> userList=(example);

     类似于:select * from user where name={#} and sex={#} order by age asc;

 

      criteria1 = ();

      criteria2 = ();

 

     if(!(())){

          (());

     }

 

     if(!(())){

          (());

     }

 

     (criteria2);

     List<User> userList=(example);

     类似于:select * from user where name={#} or sex={#} ;

 

六、模糊查询

 

      if(!(())){

           (‘%’+name+’%’);

      }

 

      List<User>  userList=(example);

      类似于:select * from user where name like %{#}%

 

七、分页查询

 

        int start = (currentPage - 1) * rows;

        //分页查询中的一页数量

        (rows);   

        //开始查询的位置

        (start);

        List<User> userList=(example);

        类似于:select * from user limit start to rows

 

在使用常规的mybatis时,我们经常碰到的问题就是条件式查询。在一个查询界面,查询条件较多,并且运算符并不总是=时,在后台就需要拼装sql语句。这种处理方式肯定不是使用mybatis的初衷,对于使用了hibernate的我来说,如果mybatis也有一套criteria查询就好了。在具体实现中,我们只需要按照hibernate的处理方式定义好相应的criteria,最后传递给mybatis,其自身处理相应的条件和参数信息,最终返回相应的数据即可.

 

在我们前台查询的时候会有许多的条件传过来:先看个例子:

 

public List<Contact> searchByExample(Contact contact) {  

        ("searchByExampleContact");  

        ContactExample example = new ContactExample();  

        cri = ();  

        // //  

        if ((contact, "username"))  

            (());  

        if ((contact, "password"))  

            (());  

   

        ContactMapper vcontactMapper = sqlSession  

                .getMapper();  

        List<Contact> returnList = (example);  

        return returnList;  

    }

 

 

这是简单的用户登录的后台代码,example中有一个Criterria的方法,里面

andUsernameEqualTo  

andPasswordEqualTo

都是在生成example的时候生成的。这两个方法是判断单值的。

简单介绍下,都是百度的: 

 

 

Criteria

 

Criteria包含一个Cretiron的集合,每一个Criteria对象内包含的Cretiron之间是由AND连接的,是逻辑与的关系。

 

oredCriteria

 

Example内有一个成员叫oredCriteria,是Criteria的集合,就想其名字所预示的一样,这个集合中的Criteria是由OR连接的,是逻辑或关系。oredCriteria就是ORed Criteria。

 

其他

 

Example类的distinct字段用于指定DISTINCT查询。

 

orderByClause字段用于指定ORDER BY条件,这个条件没有构造方法,直接通过传递字符串值指定。

 

 

import ;

import ;

import ;

import ;

 

import ;

import ;

import ;

import ;

import .;

import ;

import ;

 

import ;

import ;

 

public class Student {

 

    public static void main(String[] args) throws IOException {

 

        /*方式一  */

        ItemsExample itemsExample1 = new ItemsExample();

 

        ().andIdEqualTo(5).andNameIsNotNull();

        ().andPicEqualTo("xxx").andPicIsNull();

 

        List<Integer> fieldValues = new ArrayList<Integer>();

        (8);

        (11);

        (14);

        (22);

        ().andIdIn(fieldValues);

        ().andIdBetween(5, 9);

 

        /*  方式二 criteria1与criteria2是or的关系 */

 

        ItemsExample itemsExample2 = new ItemsExample();

        criteria1 = ();

        ();

        ((float) 3);

 

        criteria2 = ();

        ();

        (5);

        (criteria2);

 

        //方式一和方式二是等价的

         

         

        // spring获取mapper代理对象

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:");

        ItemsMapper itemsMapper = (ItemsMapper) ("itemsMapper");

        (itemsExample2);

 

        // 获取SqlSessionFactory

        String resource = "";

        Reader reader = (resource);

        SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);

        // 获取SqlSession

        SqlSession sqlSession = ();

 

    }

}

avaBeans类的成员变量一般称为属性(property)。对每个属性访问权限一般定义为private或protected,而不是定义为public的。注意:属性名必须以小写字母开头。 

对每个属性,一般定义两个public方法,它们分别称为访问方法(getter)和修改方法(setter),允许容器访问和修改bean的属性。 

 

      public String getColor();

 

      public void setColor(String);

 

一个例外是当属性是boolean类型时,访问器方法应该定义为isXxx()形式。

 

 

 

对象类型

 

虽然可以明确的引用对象的属性名了,但如果要在if元素中测试传入的user参数,仍然要使用_parameter来引用传递进来的实际参数,因为传递进来的User对象的名字是不可考的。如果测试对象的属性,则直接引用属性名字就可以了。

 

测试user对象和传入对象属性

 

<if test="_parameter != null">

<if test="name != null">

example如何使用?

简单查询

这个例子展示了如何用生成后的Example类去生成一个简单的where子句:

 

TestTableExample example = new TestTableExample();

 

().andField1EqualTo(5); 

作为另一种选择, 下面的方式也是可以的:

 

TestTableExample example = new TestTableExample();

 

().andField1EqualTo(5); 

在上面的例子中, 动态生成的where子句是:

 

where field1 = 5

 

下面的例子展示了如何用生成后的Example类去生成一个复杂的where子句 (用到了 JSE 5.0 的泛型):

 

TestTableExample example = new TestTableExample();

 

() 

.andField1EqualTo(5) 

.andField2IsNull();

 

() 

.andField3NotEqualTo(9) 

.andField4IsNotNull();

 

List field5Values = new ArrayList(); 

(8); 

(11); 

(14); 

(22);

 

() 

.andField5In(field5Values);

 

() 

.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) 

将会返回满足这些条件的记录结果.

 

去重复查询 

您可以在所有的Example类中调用 setDistinct(true) 方法进行强制去重复查询.

 

Criteria类 

Criteria 内部类的每个属性都包含 andXXX 方法,以及如下的标准的SQL查询方法:

 

IS NULL - 指相关的列必须为NULL 

IS NOT NULL - 指相关的列必须不为NULL 

= (equal) - 指相关的列必须等于方法参数中的值 

<> (not equal) - 指相关的列必须不等于方法参数中的值

 

(greater than) - 指相关的列必须大于方法参数中的值 

= (greater than or equal) - 指相关的列必须大于等于方法参数中的值 

< (less than) - 指相关的列必须小于于方法参数中的值 

<= (less than or equal) - 指相关的列必须小于等于方法参数中的值 

LIKE - 指相关的列必须 “like” 方法参数中的值. 这个方法不用必须加入 ‘%’, 您必须设置方法参数中的值. 

NOT LIKE - 指相关的列必须 “not like” 方法参数中的值. 这个方法不用必须加入 ‘%’, 您必须设置方法参数中的值. 

BETWEEN - 指相关的列必须在 “between” 方法参数中的两个值之间. 

NOT BETWEEN - 指相关的列必须不在 “not between” 方法参数中的两个值之间. 

IN - 指相关的列必须在传入的方法参数的list中. 

NOT IN - 指相关的列必须不在传入的方法参数的list中. 

 

 

 

如何生成Example类?

mybatis的的配置文件可以使用mybatis-generator工具生成,它就可以帮我们生成example类。 

————————————————

版权声明:本文为****博主「糯米小粥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:/u014756578/article/details/86490052