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

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的时候生成的。这两个方法是判断单值的。
简单介绍下,都是百度的:

Criteria

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

oredCriteria

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

其他

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);// 获取SqlSessionFactoryString resource = "SqlMapConfig.xml";Reader reader = Resources.getResourceAsReader(resource);SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);// 获取SqlSessionSqlSession sqlSession = sqlMapper.openSession();}
}

avaBeans类的成员变量一般称为属性(property)。对每个属性访问权限一般定义为private或protected,而不是定义为public的。注意:属性名必须以小写字母开头。
对每个属性,一般定义两个public方法,它们分别称为访问方法(getter)和修改方法(setter),允许容器访问和修改bean的属性。

  public String getColor();public void setColor(String);

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

对象类型

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

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

对象类型

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

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

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

TestTableExample example = new TestTableExample();

example.createCriteria().andField1EqualTo(5);
作为另一种选择, 下面的方式也是可以的:

TestTableExample example = new TestTableExample();

example.or().andField1EqualTo(5);
在上面的例子中, 动态生成的where子句是:

where field1 = 5

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

TestTableExample example = new TestTableExample();

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

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

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

example.or()
.andField5In(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)
将会返回满足这些条件的记录结果.

去重复查询
您可以在所有的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类。
下载代码:https://github.com/zouzg/mybatis-generator-gui


一、 Example 类的作用是什么
mybatis-generator会为每个字段产生Criterion,为底层的mapper.xml创建动态sql。如果表的字段比较多,产生的example类会十分庞大。理论上通过example类可以构造你想到的任何筛选条件。
二、example成员变量
//作用:升序还是降序
//参数格式:字段+空格+asc(desc)
protected String orderByClause;
//作用:去除重复
//true是选择不重复记录,false,反之
protected boolean distinct;
//自定义查询条件
//Criteria的集合,集合中对象是由or连接
protected List 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是根据user表生成的,UserMapper属于dao层,UserMapper.xml是对应的映射文件

// UserMapper接口:
long countByExample(CompetingStoreExample example);
List selectByExample(CompetingStoreExample example);

// 在我们的测试类里:
UserExample example = new UserExample();
UserExample.Criteria criteria = example.createCriteria();

// 查询用户总量
long count = UserMapper.countByExample(example);
// 类似于:select count(*) from user

where条件查询或多条件查询

example.setOrderByClause(“age asc"); //升序

example.setDistinct(false); //不去重

if(!StringUtils.isNotBlank(user.getName())){

Criteria.andNameEqualTo(user.getName());

}
if(!StringUtils.isNotBlank(user.getSex())){

Criteria.andSexEqualTo(user.getSex());

}
List userList=userMapper.selectByExample(example);

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

// 模糊查询
if(!StringUtils.isNotBlank(user.getName())){

criteria.andNameLIke(‘%’+name+’%’);

}
List userList=userMapper.selectByExample(example);
// 类似于:select * from user where name like %{#user.name}%

分页查询
int start = (currentPage - 1) * rows;
//分页查询中的一页数量
example.setPageSize(rows);
//开始查询的位置
example.setStartRow(start);
List userList=userMapper.selectByExample(example);
// 分页我觉的使用pagehelp插件就好啦

【Java Web开发指南】mybatis的Example[Criteria]的使用相关推荐

  1. 【Java Web开发指南】Maven+MyBatis实现增删改查的Demo

    文章目录 1 概述 1.1 Maven 1.2 Mybatis(ORM) 2 Mybatis开发指南 3 DATABASE 4 代码 4.1 目录结构 4.2 详细步骤 5 附录 1 概述 源码: h ...

  2. 【Java Web开发指南】ELJSTL笔记

    文章目录 今日内容 JSP: MVC:开发模式 EL表达式 JSTL 三层架构:软件设计架构 案例:用户信息列表展示 今日内容 1. JSP:1. 指令2. 注释3. 内置对象2. MVC开发模式 3 ...

  3. 【Java Web开发指南】Mybatis 中的延迟加载

    延迟加载和立即加载 延迟加载 在真正的使用数据时才发起查询,不用的时候不查.按需加载(懒加载).立即加载 不管用不用,只要一调用方法,马上发起查询. 使用方法: <settings>< ...

  4. 【Java Web开发指南】Mybatis一对多关联映射

    文章目录 1 嵌套查询 2 嵌套结果 1 嵌套查询 <select id="findUserWithOrders2" parameterType="Integer& ...

  5. 【Java Web开发指南】Spring一些基础问题整理

    文章目录 1. 请简述文件上传时中文乱码的解决思路(4分),并写出文件上传表单的基本示例代码(4分) 2. 请简述如何实现登录验证 3. 请简述使用包装 POJO 类型数据绑定时,前端请求的参数名编写 ...

  6. 【Java Web开发指南】ORM一些基础问题整理

    文章目录 1.什么是ORM?请说明两种常用的ORM框架的区别是什么. 2.在进行实体关系映射时,如果遇到实体类中的属性名与表中的字段名不一致的情况,该如何解决.请给出至少两种解决方案. 3.从线程安全 ...

  7. 【Java Web开发指南】redis笔记

    今日内容 1. redis1. 概念2. 下载安装3. 命令操作1. 数据结构4. 持久化操作5. 使用Java客户端操作redis 文章目录 今日内容 Redis 案例: Redis 1. 概念: ...

  8. 【Java Web开发指南】解析Spring中Ioc和DI(入门Demo)

    文章目录 1 Spring概述 2 Spring的体系结构 3 Ioc代码实现 4 DI代码实现 5 代码目录 1 Spring概述 一种Java应用开发框架,而SpringMVC是针对Web的框架. ...

  9. 【Java Web开发指南】云服务器部署项目供外网访问(Tomcat)

    文章目录 1 前言 2 流程 3 项目部署 1 前言 首先清楚云服务器本地ip和入口ip区别,本地ip没什么可说的,对于入口ip: 这个东西是这样,就是你看到这个IP地址,这个公网IP地址,它是出口I ...

最新文章

  1. python修改文件内容_Python批量修改文本文件内容的方法详解
  2. KMP算法具体解释(转)
  3. android 工厂方法模式应用场景,Android设计模式(四)- 工厂方法模式
  4. 店宝宝电脑版_用店宝宝是为了什么?客服全权负责开启属于您的个人店铺
  5. 【加权并查集】bzoj 4602 齿轮
  6. c++ STL 工程实践的15条建议
  7. gitgithub拾遗(一)——git
  8. 开发环境、生产环境、测试环境的基本理解和区别
  9. 精业科技(天津)有限公司 Game Over
  10. 数字劳工与下一代互联网
  11. KVM: Guest CPU doesn’t match specification: missing features: hle,rtm 无法启动虚拟机,解决方法
  12. android toast显示时间,Android Toast自定义显示时间
  13. BIOS 从FFFF0H处开始执行指令的理解
  14. 基于 Vue 2.0 的 UI 组件库 KUI for Vue
  15. 苹果html 闪退,苹果打开软件闪退是怎么回事_苹果手机一打开软件就闪退如何解决-win7之家...
  16. 阿里面试:设计一个电商平台积分兑换系统!
  17. PowerPoint储存此文件时发生错误 出现错误的问题解决方法
  18. 华为云容器镜像服务 SWR 加速镜像的拉取和推送
  19. Rk3326 Android8.0HAL服务添加
  20. Java程序员的技术进阶成长路线

热门文章

  1. PowerShell因为在此系统中禁止执行脚本
  2. C++ auto 关键字的使用
  3. Python Excel操作模块XlsxWriter之插入图片worksheet.insert_image
  4. TensorFlow如何充分使用所有CPU核数,提高TensorFlow的CPU使用率,以及Intel的MKL加速
  5. 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
  6. numpy的random模块
  7. mina、netty消息边界问题
  8. c语言中getc与gets,getc()和gets()的用法
  9. golang 关闭制定名称的 tomcat_Tomcat原理详解及请求过程
  10. html需要顺序阅读吗,前端知识:HTML5所有的标签-按顺序排列 | 前端面试题