Mybatis Criteria使用and和or进行联合条件查询的操作方法

 更新时间:2021年10月02日 09:53:41   作者:李浩宇Alex  
这篇文章主要介绍了Mybatis Criteria的and和or进行联合条件查询的方法,本文通过例子给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

之前用Mybatis框架反向的实体,还有实体里面的Example,之前只是知道Example里面放的是条件查询的方法,可以一直不知道怎么用,到今天才开始知道怎么简单的用。在我们前台查询的时候会有许多的条件传过来:先看个例子:

public List<Contact> searchByExample(Contact contact) { 
        System.out.println("searchByExampleContact"); 
        ContactExample example = new ContactExample(); 
        ContactExample.Criteria cri = example.createCriteria(); 
        if (this.objectAttrNullCheck(contact, "username")) 
            cri.andUsernameEqualTo(contact.getUsername()); 
        if (this.objectAttrNullCheck(contact, "password")) 
            cri.andPasswordEqualTo(contact.getPassword()); 
        ContactMapper vcontactMapper = sqlSession 
                .getMapper(ContactMapper.class); 
        List<Contact> returnList = vcontactMapper.selectByExample(example); 
        return returnList; 
}

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

andUsernameEqualTo 
andPasswordEqualTo

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

Criterion

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

Criteria

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

其它

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

代码示例

import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.pattern.ClassNamePatternConverter;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.itcast.ssm.mapper.ItemsMapper;
import cn.itcast.ssm.po.ItemsExample;
  
public class Student {
  
    public static void main(String[] args) throws IOException {
      
 
        /*方式一  */
        ItemsExample itemsExample1 = new ItemsExample();
        itemsExample1.or().andIdEqualTo(5).andNameIsNotNull();
        itemsExample1.or().andPicEqualTo("xxx").andPicIsNull();
  
        List<Integer> fieldValues = new ArrayList<Integer>();
        fieldValues.add(8);
        fieldValues.add(11);
        fieldValues.add(14);
        fieldValues.add(22);
        itemsExample1.or().andIdIn(fieldValues);
        itemsExample1.or().andIdBetween(5, 9);
  
        /*  方式二 criteria1与criteria2是or的关系 */
        ItemsExample itemsExample2 = new ItemsExample();
        ItemsExample.Criteria criteria1 = itemsExample2.createCriteria();
        criteria1.andIdIsNull();
        criteria1.andPriceEqualTo((float) 3);
  
        ItemsExample.Criteria criteria2 = itemsExample2.createCriteria();
        criteria2.andNameIsNull();
        criteria2.andIdGreaterThanOrEqualTo(5);
        itemsExample2.or(criteria2);
  
        //方式一和方式二是等价的
        // spring获取mapper代理对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        ItemsMapper itemsMapper = (ItemsMapper) applicationContext.getBean("itemsMapper");
        itemsMapper.countByExample(itemsExample2);
  
        // 获取SqlSessionFactory
        String resource = "SqlMapConfig.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);
        // 获取SqlSession
        SqlSession sqlSession = sqlMapper.openSession();
    }
}

代码案例2:

public void getQueryExampleByCondition(Example example, OrderQuery query) {
  
        Criteria criteria1 = example.createCriteria();
  
        // 设置 criteria2 与 criteria1 为 or 方式关联
        Criteria criteria2 = example.or();
        
        if (query != null) {
             
            if (query.getLoadSrc() != null && query.getLoadSrc() != -1) {
                criteria1.andEqualTo("loadSrc", query.getLoadSrc());
            }
                     
            if (!StringUtil.isEmpty(query.getOrderNo())) {
                criteria1.andLike("orderNo", "%" + query.getOrderNo() + "%");
            }
  
            // 以下 3 个会用 OR 方式加上 criteria2 中的条件
            if (query.getStatus() != null && query.getStatus() != -1) {
                criteria1.andEqualTo("status", query.getStatus());
                criteria2.andEqualTo("status", query.getStatus());
            }
  
            if (!StringUtil.isEmpty(query.getRepayDateEnd())) {
                criteria1.andLessThanOrEqualTo("repayDate", query.getRepayDateEnd());
                criteria2.andLessThanOrEqualTo("repayDate", query.getRepayDateEnd());
            }
  
            if (!StringUtil.isEmpty(query.getLoanDay())) {
                criteria1.andEqualTo("loanDay", query.getLoanDay());
                criteria1.andEqualTo("loanDay", query.getLoanDay());
            }
  
        }
    }

其中 criteria1 和 criteria2 是 or 的关系。

根据传入参数不同,执行 sql 效果类似:

SELECT * FROM xxxx WHERE (load_type = 5 AND loan_day = 7) OR (order_No = 5)

where 后面第一个圆括号中的条件组合 load_type = 5 AND loan_day = 7 是 criteria1中的条件,

第二个圆括号中的条件 order_No = 5 是 criteria2 中的条件设置。

Criteria的and和or进行联合查询

DemoExample example=new DemoExample ();
DemoExample.Criteria criteria=example.createCriteria();
criteria.andidEqualTo(id);
criteria.andStatusEqualTo("0");
         
DemoExample.Criteria criteria2=example.createCriteria();
criteria2.andidEqualTo(id);
criteria2.andstatusEqualTo("1");
example.or(criteria2);
dao.countByExample(example);
 

生成如下SQL

select count(*) from demo WHERE ( ID = ? and STATUS = ? ) or( ID = ? and STATUS = ? )

极限就是为了超越而存在的

到此这篇关于Mybatis Criteria的and和or进行联合条件查询 的文章就介绍到这了,更多相关Mybatis and和or联合条件查询 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMvc入门指南(必看)

    SpringMvc入门指南(必看)

    下面小编就为大家带来一篇SpringMvc入门指南(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java Arrays.asList使用方法解析

    Java Arrays.asList使用方法解析

    这篇文章主要介绍了Java Arrays.asList使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 详解如何用spring Restdocs创建API文档

    详解如何用spring Restdocs创建API文档

    这篇文章将带你了解如何用spring官方推荐的restdoc去生成api文档。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • java Runtime如何执行多条命令

    java Runtime如何执行多条命令

    这篇文章主要介绍了java Runtime如何执行多条命令,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 详解Java的面向对象和面向过程

    详解Java的面向对象和面向过程

    我们知道,Java是面向对象的编程语言,但是至今仍有不少同学还不太懂”面向对象“的确切含义,今天这篇文章就带大家真正地认识面向对象,感兴趣的同学可以跟着小编一起来学习
    2023-05-05
  • Java 集合的Contains和Remove方法

    Java 集合的Contains和Remove方法

    这篇文章主要介绍了Java 集合Contains和Remove方法的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • MyBatis缓存功能原理及实例解析

    MyBatis缓存功能原理及实例解析

    这篇文章主要介绍了MyBatis缓存功能原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • JAVA 添加、修改和删除PDF书签的示例代码

    JAVA 添加、修改和删除PDF书签的示例代码

    这篇文章主要介绍了JAVA 添加、修改和删除PDF书签的示例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • java中JSONArray互相转换List的实现

    java中JSONArray互相转换List的实现

    本文主要介绍了java中JSONArray互相转换List的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 对Mybatis Plus中@TableField的使用正解

    对Mybatis Plus中@TableField的使用正解

    这篇文章主要介绍了对Mybatis Plus中@TableField的使用正解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论