【Java Web开发指南】mybatis的Example[Criteria]的使用
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]的使用相关推荐
- 【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 ...
- 【Java Web开发指南】ELJSTL笔记
文章目录 今日内容 JSP: MVC:开发模式 EL表达式 JSTL 三层架构:软件设计架构 案例:用户信息列表展示 今日内容 1. JSP:1. 指令2. 注释3. 内置对象2. MVC开发模式 3 ...
- 【Java Web开发指南】Mybatis 中的延迟加载
延迟加载和立即加载 延迟加载 在真正的使用数据时才发起查询,不用的时候不查.按需加载(懒加载).立即加载 不管用不用,只要一调用方法,马上发起查询. 使用方法: <settings>< ...
- 【Java Web开发指南】Mybatis一对多关联映射
文章目录 1 嵌套查询 2 嵌套结果 1 嵌套查询 <select id="findUserWithOrders2" parameterType="Integer& ...
- 【Java Web开发指南】Spring一些基础问题整理
文章目录 1. 请简述文件上传时中文乱码的解决思路(4分),并写出文件上传表单的基本示例代码(4分) 2. 请简述如何实现登录验证 3. 请简述使用包装 POJO 类型数据绑定时,前端请求的参数名编写 ...
- 【Java Web开发指南】ORM一些基础问题整理
文章目录 1.什么是ORM?请说明两种常用的ORM框架的区别是什么. 2.在进行实体关系映射时,如果遇到实体类中的属性名与表中的字段名不一致的情况,该如何解决.请给出至少两种解决方案. 3.从线程安全 ...
- 【Java Web开发指南】redis笔记
今日内容 1. redis1. 概念2. 下载安装3. 命令操作1. 数据结构4. 持久化操作5. 使用Java客户端操作redis 文章目录 今日内容 Redis 案例: Redis 1. 概念: ...
- 【Java Web开发指南】解析Spring中Ioc和DI(入门Demo)
文章目录 1 Spring概述 2 Spring的体系结构 3 Ioc代码实现 4 DI代码实现 5 代码目录 1 Spring概述 一种Java应用开发框架,而SpringMVC是针对Web的框架. ...
- 【Java Web开发指南】云服务器部署项目供外网访问(Tomcat)
文章目录 1 前言 2 流程 3 项目部署 1 前言 首先清楚云服务器本地ip和入口ip区别,本地ip没什么可说的,对于入口ip: 这个东西是这样,就是你看到这个IP地址,这个公网IP地址,它是出口I ...
最新文章
- python修改文件内容_Python批量修改文本文件内容的方法详解
- KMP算法具体解释(转)
- android 工厂方法模式应用场景,Android设计模式(四)- 工厂方法模式
- 店宝宝电脑版_用店宝宝是为了什么?客服全权负责开启属于您的个人店铺
- 【加权并查集】bzoj 4602 齿轮
- c++ STL 工程实践的15条建议
- gitgithub拾遗(一)——git
- 开发环境、生产环境、测试环境的基本理解和区别
- 精业科技(天津)有限公司 Game Over
- 数字劳工与下一代互联网
- KVM: Guest CPU doesn’t match specification: missing features: hle,rtm 无法启动虚拟机,解决方法
- android toast显示时间,Android Toast自定义显示时间
- BIOS 从FFFF0H处开始执行指令的理解
- 基于 Vue 2.0 的 UI 组件库 KUI for Vue
- 苹果html 闪退,苹果打开软件闪退是怎么回事_苹果手机一打开软件就闪退如何解决-win7之家...
- 阿里面试:设计一个电商平台积分兑换系统!
- PowerPoint储存此文件时发生错误 出现错误的问题解决方法
- 华为云容器镜像服务 SWR 加速镜像的拉取和推送
- Rk3326 Android8.0HAL服务添加
- Java程序员的技术进阶成长路线
热门文章
- PowerShell因为在此系统中禁止执行脚本
- C++ auto 关键字的使用
- Python Excel操作模块XlsxWriter之插入图片worksheet.insert_image
- TensorFlow如何充分使用所有CPU核数,提高TensorFlow的CPU使用率,以及Intel的MKL加速
- 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
- numpy的random模块
- mina、netty消息边界问题
- c语言中getc与gets,getc()和gets()的用法
- golang 关闭制定名称的 tomcat_Tomcat原理详解及请求过程
- html需要顺序阅读吗,前端知识:HTML5所有的标签-按顺序排列 | 前端面试题