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

网友投稿 1158 2022-09-23


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

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

public List 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 returnList = vcontactMapper.selectByExample(example);

return returnList;

}

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

andUsernameEqualTo

andPasswordEqualTo

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

Criterion

CritFaZOuesuSerion是最基本,最底层的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 fieldValues = new ArrayList();

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 ClassPathXmlFaZOuesuSApplicationContext("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 = ? )

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:华为网络-默认路由(华为路由器网络设置方法)
下一篇:Policy-chain实验
相关文章

 发表评论

暂时没有评论,来抢沙发吧~