mybatis中关于example类详解mybatis的Example[Criteria]的使用
一、什么是example类
mybatis-generator会为每个字段产生如上的Criterion,如果表的字段比较多,产生的Example类会十分庞大。理论上通过example类可以构造你想到的任何筛选条件。在mybatis-generator中加以配置,配置数据表的生成操作就可以自动生成example了。具体配置可以参考MBG有关配置。下面是mybatis自动生成example的使用。
二、了解example成员变量
//升序还是降序//参数格式:字段+空格+asc(desc)protected String orderByClause;//去除重复//true是选择不重复记录protected boolean distinct;//自定义查询条件//Criteria的集合,集合中对象是由or连接protected List<Criteria> 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使用前的准备
比如我的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<User> userList=userMapper.selectByExample(example);类似于:select * from user where name={#user.name} and sex={#user.sex} order by age asc;UserExample.Criteria criteria1 = example.createCriteria();UserExample.Criteria criteria2 = example.createCriteria();if(!StringUtils.isNotBlank(user.getName())){Criteria1.andNameEqualTo(user.getName());}if(!StringUtils.isNotBlank(user.getSex())){Criteria2.andSexEqualTo(user.getSex());}Example.or(criteria2);List<User> userList=userMapper.selectByExample(example);类似于:select * from user where name={#user.name} or sex={#user.sex} ;
六、模糊查询
if(!StringUtils.isNotBlank(user.getName())){criteria.andNameLIke(‘%’+name+’%’);}List<User> userList=userMapper.selectByExample(example);
类似于:select * from user where name like %{#user.name}%
七、分页查询
int start = (currentPage - 1) * rows;//分页查询中的一页数量example.setPageSize(rows); //开始查询的位置example.setStartRow(start);List<User> userList=userMapper.selectByExample(example);
类似于:select * from user limit start to rows
在使用常规的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();}
}
JavaBeans类的成员变量一般称为属性(property)。对每个属性访问权限一般定义为private或protected,而不是定义为public的。注意:属性名必须以小写字母开头。
对每个属性,一般定义两个public方法,它们分别称为访问方法(getter)和修改方法(setter),允许容器访问和修改bean的属性。
public String getColor();public void setColor(String);
一个例外是当属性是boolean类型时,访问器方法应该定义为isXxx()形式。
对象类型
虽然可以明确的引用对象的属性名了,但如果要在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类。
mybatis中关于example类详解mybatis的Example[Criteria]的使用相关推荐
- mybatis中关于example类详解
这几天刚接触example,很多内容都是破碎的,写一篇博文加深理解. 一.什么是example类 mybatis-generator会为每个字段产生如上的Criterion,如果表的字段比较多,产生的 ...
- Java中的Runtime类详解
Java中的Runtime类详解 1.类注释 /**Every Java application has a single instance of class Runtime that allows ...
- java configuration类_JAVA中的Configuration类详解
本文主要研究的是java中的configuration类的用法,涉及maven自动加载,pom.xml配置和简单的java代码,具体如下. properties文件是java平台默认的配置文件格式,其 ...
- stringtokenizer java_基于Java中的StringTokenizer类详解(推荐)
StringTokenizer是字符串分隔解析类型,属于:Java.util包. 1.StringTokenizer的构造函数 StringTokenizer(String str):构造一个用来解析 ...
- mbg中的Example类详解
Mybatis逆向工程中生成的Example类 MyBatis Generator:简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及be ...
- java中的example_mybatis中关于example类详解
这几天刚接触example,很多内容都是破碎的,写一篇文章加深理解. 一.什么是example类 mybatis-generator会为每个字段产生Criterion,为底层的mapper.xml创建 ...
- js中的Class类详解
目录 什么是类? 定义一个简单的类 定义一个类为Person,每个Person都会跑,都有名字 看一下Person类 和 Person的实例 但是为什么Person实例多出来的两个属性? new 一个 ...
- Mybatis中Mapper映射文件详解(默认值)
Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd.我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个屏: 从上图可以看出, ...
- MyBatis 中的mapper.xml详解
<mapper namespace="com.mapper.UserMapper",为这个mapper指定一个唯一的namespace,一般习惯为mapper接口的包路径名, ...
最新文章
- angular @ViewChild使用
- 产品设计的Kawaiization
- 班级日常分享,一天一瞬间
- Qt 信号槽 signals slots 特点 限定符的区别
- 0118——UIButtton
- 【POJ 1456】Supermarket【两种做法】【二叉堆贪心】【并查集】
- OpenSSL密码库算法笔记——第2.3.3章 Montgomery模数与相关函数
- Php生成图片的大小单位是cm,php生成图片缩略图代码类
- GTK开发(二)控件和布局
- 点评互联网产品经理面试问题汇总(18问)
- 事件起泡 Event bubbling
- 转--各种文件后缀名与打开方式大全
- Es refresh index
- EasyRecovery15Mac全面好用的苹果电脑数据恢复app
- 开关磁阻电机的直接瞬时转矩控制(DITC)
- Material Design【Android-Toolbar,滑动菜单,悬浮按钮,卡片布局,下拉刷新和可折叠式标题栏及案例】
- 机器学习实战——训练模型
- 天文学论文写作时需要注意的点
- Google 百度 图标收藏
- 微软 CTO 韦青:“程序员 35 岁就被淘汰”是个伪概念 | 人物志 胡巍巍 CSDN 4月3日
热门文章
- Perceptual Losses for Real-Time Style Transfer and Super-Resolution 解读
- 解决qt中单击和双击冲突的问题!
- Android开源项目及库
- mac androidstudio 无法连接魅蓝手机进行调试
- vivo浏览器的神奇操作
- itoa函数c语言原型,深入C++实现函数itoa()的分析
- busybox telnetd登录流程
- (转载)Peter Norvig:十年学会编程
- centos mysql双机备份_[原创]CentOS下Mysql双机互为备份
- 在Python中FITS格式文件数据的读取 (转载)