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层,l是对应的映射⽂件    UserMapper接⼝:
long countByExample(CompetingStoreExample example);
List<CompetingStore> selectByExample(CompetingStoreExample example);
在我们的测试类⾥:
UserExample example = new UserExample();
UserExample.Criteria criteria = ateCriteria();
四、查询⽤户数量
long count = untByExample(example);
类似于:select count(*) from user
五、where条件查询或多条件查询
example.setOrderByClause("age asc");//升序
example.setDistinct(false);//不去重isnull的用法
if(!StringUtils.Name())){
Criteria.Name());
}
if(!StringUtils.Sex())){
Criteria.Sex());
}
List<User> userList=userMapper.selectByExample(example);
类似于:select * from user where name={#user.name} and sex={#user.sex} order by age asc;
UserExample.Criteria criteria1 = ateCriteria();
UserExample.Criteria criteria2 = ateCriteria();
if(!StringUtils.Name())){
Criteria1.Name());
}
if(!StringUtils.Sex())){
Criteria2.Sex());
}
<(criteria2);
List<User> userList=userMapper.selectByExample(example);
类似于:select * from user where name={#user.name} or sex={#user.sex} ;
六、模糊查询
if(!StringUtils.Name())){
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 = ateCriteria();
// //
if (this.objectAttrNullCheck(contact, "username"))
cri.Username());
if (this.objectAttrNullCheck(contact, "password"))
cri.Password());
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 t.ApplicationContext;
import t.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();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。