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联合条件查询 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mybatis 条件查询 批量增删改查功能

    模糊查询: @Select({ "SELECT * FROM account where account like CONCAT('%',#{query},'%') or email like CONCAT('%',#{query},'%')" }) Account findAccountByAccountOrMail(@Param("query") String query); 批量添加: @Insert({ "<script>"

  • 解决mybatis where-if中if不能识别大写AND,OR的问题

    mybatis报错: Caused by: org.apache.ibatis.ognl.ParseException: Encountered " "AND "" at line 1 错误代码: <select id="selectAccountList" resultMap="BaseResultMap"> SELECT ct.customer_name customerName,sam.city_code,s

  • mybatis and,or复合查询操作

    要查询的sql: select * from user where name = ? and (age=? or city=?): 方法1:不使用Example查询 直接在usermapper.xml中修改sql 方法2:使用Example查询 sql可转换成 select * from user where (name = ? and age=?) or (name=? and city=?): 然后使用Example查询 UserExample example=new UserExample

  • Mybatis中and和循环or混用操作(or转换成in)

    Mybatis and和循环or混用 这次项目用到一个and和or混用的场景 , 因为用到多个or(循环), 没想到好的办法 最终转换成用 IN实现: 场景 用left join链接多个表, 多个条件and筛选, 其中状态(state)条件筛选出多个可选状态的条目, 本来想用and 和 or 但是 or的条件是个数组参数, 需要遍历states , 可能0个可能多个, 拼了半天没有成功 , 最后发现用 IN 和FOREACH就可以了 DAO层接口 List<OrderInfoForm> sel

  • MyBatis XML去除多余AND|OR前缀或逗号等后缀的操作

    1.通过trim格式化标记set或where功能 2.对于set自动删除最后一个",",对于where自动删除最后一个"and|or" 使用示例如下: 1. select * from user <trim prefix="WHERE" prefixOverride="AND |OR"> <if test="userName != null and userName.length()>0&qu

  • mybatis collection 多条件查询的实现方法

    mybatis collection 多条件查询的实现方法 前言: 业务需要通过mybatis 查询返回嵌套集合,嫌多次查询太麻烦,用自带的高级查询解决问题,下边是代码,已测试通过. 说下自己的理解,就是一个主查询结果集里面嵌套了子查询的结果集,可以是多个子查询,每个子查询的条件从主查询结果集中获取,返回值各自定义.collection 标签的property是主查询里面集合的名字,如果有多个就再写个collection,column是子查询参数,单参数直接写主查询结合返回结果,例如直接写上us

  • 关于MyBatis Plus中使用or和and问题

    最近在使用MyBatis Plus,发现在拼接条件的时候,and和or会出问题,比如下面这种 QueryWrapper userWrapper = new QueryWrapper(); userWrapper.eq("name", name); userWrapper.eq("pwd", pwd).or().eq("phone", phone); 这种写法拼出来的SQL语句是这样的: select * from user where (name

  • MyBatisPlus中使用or()和and()遇到的问题

    在项目中使用MyBatisPlus中的or()查询时由于误用,导致查询数据不对,仅作记录. 写法一: LambdaQueryWrapper<Task> queryWrapper = new QueryWrapper<Task>().lambda(); queryWrapper .eq(Task::getUserId, "15") .eq(Task::getStatus, 2) .or() .eq(Task::getFileSize, 3251544304L);

  • 利用MyBatis实现条件查询的方法汇总

    SQL映射文件 Mybatis真正强大的是在于它的SQL映射语句,也是它的流弊之处. 它的功能强大,SQL映射文件的配置却比较简单. 使用SQL映射文件可以减少50%以上的代码量. Mybatis专注于SQL,对于开发人员来说可极大限度地进行SQL调优,以保证性能,下面是SQL映射文件的几个顶级元素配置 1.mapper 它是映射文件的根节点,只有一个属性就是 namespace(命名空间)它的作用是区分不同的mapper,里面的参数是全局唯一的,绑定DAO层接口,即面向接口编程 namespa

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

    之前用Mybatis框架反向的实体,还有实体里面的Example,之前只是知道Example里面放的是条件查询的方法,可以一直不知道怎么用,到今天才开始知道怎么简单的用.在我们前台查询的时候会有许多的条件传过来:先看个例子: public List<Contact> searchByExample(Contact contact) { System.out.println("searchByExampleContact"); ContactExample example =

  • mybatis的mapper特殊字符转移及动态SQL条件查询小结

    目录 前言 条件查询 快速入门 if标签 where标签 choose when otherwise标签 foreach标签 场景案例 前言 我们知道在项目开发中之前使用数据库查询,都是基于jdbc,进行连接查询,然后是高级一点jdbcTemplate进行查询,但是我们发现还是不是很方便,有大量重复sql语句,与代码偶合,效率低下,于是就衍生出来ORM框架,如Mybatis,Hibernate,还有SpringBoot的,Spring Data JPA 条件查询 我们知道在mybatis map

  • mybatis如何使用Criteria的and和or进行联合查询

    目录 Criteria的and和or进行联合查询 使用criteria 查询xx and ( xx or xx)形式的sql Criteria的and和or进行联合查询 DemoExample example=new DemoExample (); DemoExample.Criteria criteria=example.createCriteria(); criteria.andidEqualTo(id); criteria.andStatusEqualTo("0"); DemoE

  • Mybatis中的Criteria条件查询方式

    Mybatis Criteria条件查询 Criterion Criterion是最基本,最底层的Where条件,用于字段级的筛选. Criteria Criteria包含一个Cretiron的集合,每一个Criteria对象内包含的Cretiron之间是由AND连接的,是逻辑与的关系. 其它 Example类的distinct字段用于指定DISTINCT查询. orderByClause字段用于指定ORDER BY条件,这个条件没有构造方法,直接通过传递字符串值指定. 代码示例 import

  • ThinkPHP5联合(关联)查询、多条件查询与聚合查询实例详解

    本文实例讲述了ThinkPHP5联合(关联)查询.多条件查询与聚合查询.分享给大家供大家参考,具体如下: 一.联合(关联)查询 1. 项目表 DROP TABLE IF EXISTS `darling_project`; CREATE TABLE `darling_project` ( `project_id` int(32) NOT NULL AUTO_INCREMENT, `project_name` varchar(20) NOT NULL, `create_time` int(32) N

  • asp.net实现的MVC跨数据库多表联合动态条件查询功能示例

    本文实例讲述了asp.net实现的MVC跨数据库多表联合动态条件查询功能.分享给大家供大家参考,具体如下: 一.控制器中方法 [HttpGet] public ActionResult Search() { ViewBag.HeadTitle = "搜索"; ViewBag.MetaKey = "\"123\""; ViewBag.MetaDes = "\"456\""; string whereText

  • MyBatis XML方式的基本用法之多表查询功能的示例代码

    1. 多表查询 在之前,我们示例的2个查询都是单表查询,但实际的业务场景肯定是需要多表查询的,比如现在有个需求: 查询某个用户拥有的所有角色.这个需求要涉及到sys_user,sys_user_role,sys_role三张表,如何实现呢? 首先,在SysUserMapper接口中定义如下方法. /** * 根据用户id获取角色信息 * * @param userId * @return */ List<SysRole> selectRolesByUserId(Long userId); 然后

随机推荐