之前用Mybatis框架反向的实体,还有实体里面的Example,之前只是知道Example里面放的是条件查询的方法,可以一直不知道怎么用,到今天才开始知道怎么简单的用。

在我们前台查询的时候会有许多的条件传过来:先看个例子:

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.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();

  }

}

  javaBeans类的成员变量一般称为属性(property)。对每个属性访问权限一般定义为private或protected,而不是定义为public的。注意:属性名必须以小写字母开头。

  对每个属性,一般定义两个public方法,它们分别称为访问方法(getter)和修改方法(setter),允许容器访问和修改bean的属性。

public String getColor();

public void setColor(String);

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

对象类型

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

测试user对象:

<if test="_parameter != null">

传入对象属性

<if test="name != null">

map类型

  传入map类型,直接通过#{keyname}就可以引用到键对应的值。使用@param注释的多个参数值也会组装成一个map数据结构,和直接传递map进来没有区别。

mapper接口:

int updateByExample(@Param("user") User user, @Param("example") UserExample example);

sql映射:

<update id="updateByExample" parameterType="map" >

update tb_user set id = #{user.id,jdbcType=INTEGER}, ...

 <if test="_parameter != null" >

   <include refid="Update_By_Example_Where_Clause" />

 </if>

  注意这里测试传递进来的map是否为空,仍然使用_parameter

再来看看我的项目中的,我写的是项目的接口开发,前端要穿写条件进来查询,前端的传参格式:

传参格式:

{

  "currPage": 0,

  "startRow": 0,

  "pageSize": 20,

  "map":{

    "andStealtollTypeEqualTo":1

   }

}

  注意map里面的传的参数格式:全部是example里面的参数格式,如果还要传入什么参数直接在里面加(相当于前端传过来的条件),这些条件全部放进map里面。

  HisVehReviewHandleExample example = new HisVehReviewHandleExample();

  example.setPage(page);//将前面传过来的page数据放进example中

  popQeuryExample(example.getPage().getMap(), example.createCriteria());

  vehReviewService.queryPage(example);

  Map<String, Object> map = new HashMap<String, Object>();

  map.put("page", page);

  //map.put("typeCount", value);

  result.setData(map);

  writeJson(response, JSON.toJSON(result));

service层:

 public Page<HisVehReviewHandle> queryPage(HisVehReviewHandleExample example) {

  Page<HisVehReviewHandle> page = example.getPage();

  List<HisVehReviewHandle> list = HisVehReviewHandleMapper.selectByExample(example);

  System.out.println("查询list成功"+list.get(0).getStealtollType()+" "+list.get(0).getStealtollTypeName());

  int count = HisVehReviewHandleMapper.countByExample(example);

  page.setRows(list);

  page.setTotalCount(count);

  return page;

}

sql语句查询exaple的:

<select id="selectByExample" parameterType="com.vrview.ssm.model.example.HisVehReviewHandleExample" resultMap="BaseResultMap">

<!--

WARNING - @mbggenerated

This element is automatically generated by MyBatis Generator, do not modify.

This element was generated on Wed Jan 17 10:03:58 CST 2018.

-->

<include refid="OracleDialectPrefix" />

  select

  <if test="distinct">

  distinct

  </if>

    <include refid="Base_Column_List" />

  from HIS_VEH_REVIEW_HANDLE

  <if test="_parameter != null">

    <include refid="Example_Where_Clause" />

  </if>

  <if test="orderByClause != null">

    order by ${orderByClause}

  </if>

    <include refid="OracleDialectSuffix" />

</select>

sql语句,用来查询数量的:

<select id="countByExample" parameterType="com.vrview.ssm.model.example.HisVehReviewHandleExample" resultType="java.lang.Integer">

  select count(*) from HIS_VEH_REVIEW_HANDLE

  <if test="_parameter != null">

    <include refid="Example_Where_Clause" />

  </if>

</select>

  关于参数_paramerter:参考:http://blog.csdn.net/u014476019/article/details/45878771

  这部分就是对criteria里面的参数进行判断,进而根据条件查询。

<sql id="Example_Where_Clause"><where>

<foreach collection="oredCriteria" item="criteria" separator="or">

<if test="criteria.valid">

  <trim prefix="(" prefixOverrides="and" suffix=")">

  <foreach collection="criteria.criteria" item="criterion">

  <choose>

    <when test="criterion.noValue">//没有值

      and ${criterion.condition}

    </when>

    <when test="criterion.singleValue">//单个值

      and ${criterion.condition} #{criterion.value}

    </when>

    <when test="criterion.betweenValue">//区间值,范围查询

      and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}

    </when>

    <when test="criterion.listValue">//一组值

      and ${criterion.condition}

      <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">

        #{listItem}

      </foreach>

    </when>

  </choose>

</foreach>

</trim>

</if>

</foreach>

</where>

</sql>

Mybatis-技术专区-中的条件查询createCriteria example里面的条件的更多相关文章

  1. mybatis xml 文件中like模糊查询

    1.直接传参法 直接传参法,就是将要查询的关键字keyword,在代码中拼接好要查询的格式,如%keyword%,然后直接作为参数传入mapper.xml的映射文件中. 2.CONCAT()函数 My ...

  2. Mybatis 的分页条件查询语句编写

    刚来到一家新公司, 翻看项目代码, 发现一位同事写的查询逻辑很好, 不用插件, 一个语句完成了分页条件查询. 而我之前一般都是在业务层对参数进行判断, 如果有条件,就调用条件查询的方法, 如果没有条件 ...

  3. hibernate的Criteria条件查询

    项目中用到了criteria的查询方式,觉得挺好用的,下班后找了一下资料,一边测试,一边在博客上面记录下来 1.初解 快速浏览了资料,大致了解了以下的内容: 1. Hibernate 定义了Crite ...

  4. EasyUI ComboGrid的绑定,上下键和回车事件,输入条件查询

    首先我们先看一下前台的绑定事件 1.先定义标签 <input id="cmbXm" type="text" style="width: 100p ...

  5. 基于Solr的HBase多条件查询测试

    背景: 某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询.HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级 的快 速检索,对于多字段的组合查询却无能为力.针对HBa ...

  6. Spring Data JPA,一种动态条件查询的写法

    我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实现. 如果是查询条件是动态的,框架也提供了查询接口. Jpa ...

  7. Sql学习笔记(二)—— 条件查询

    上篇简单介绍了一下sql的一些基础增删改查语句,而针对多种多样的查询语句则未详细说明,这一篇继续记录一下关于各种条件查询的知识. 1.按列名进行查询 语句: select stuName , stuA ...

  8. Spring Data JPA中的动态查询 时间日期

    功能:Spring Data JPA中的动态查询 实现日期查询 页面对应的dto类private String modifiedDate; //实体类 @LastModifiedDate protec ...

  9. SQL语言学习-DQL条件查询

    条件查询 1. where子句后跟条件 2. 运算符 * > .< .<= .>= .= .<> * BETWEEN...AND * IN( 集合) * LIKE: ...

随机推荐

  1. SSM中前台传数组。后台接受的问题

    当时写得时候,忘记考虑json的jar,做个记录. 第一步:先带入jar <dependency> <groupId>com.fasterxml.jackson.core< ...

  2. Ansible笔记(2)---常用模块之文件操作

    一.copy模块 1.1作用: copy模块是将ansible主机上的文件拷贝到远程受控主机 1.2常用参数: src参数 :用于指定需要copy的文件或目录. dest参数 :用于指定文件将被拷贝到 ...

  3. java程序员必知的 8大排序

    Java常用的八种排序算法与代码实现 排序问题一直是程序员工作与面试的重点,今天特意整理研究下与大家共勉!这里列出8种常见的经典排序,基本涵盖了所有的排序算法. 1.直接插入排序 我们经常会到这样一类 ...

  4. 股票交易 (单调队列优化DP)

    股票交易 $ solution: $ 这道题以前就写了,题目很好,但自己没有发题解,来补一篇: 首先,题目出得很有迷惑性,但我们不难想到状态要设天数,和自己手上的股票数目(因为这两个就是充要信息).而 ...

  5. 《Webkit技术内幕》之页面渲染过程

    文章同步到github<Webkit技术内幕>之页面渲染过程 最近拜读了传说中的<Webkit技术内幕>一书,有很大收获,尤其是对页面渲染有了较深的认识.由于功力有限,而且书中 ...

  6. 【leetcode】1030. Matrix Cells in Distance Order

    题目如下: We are given a matrix with R rows and C columns has cells with integer coordinates (r, c), whe ...

  7. 循序渐进实现仿QQ界面(一):园角矩形与双缓冲贴图窗口

    印象里仿QQ界面的程序应该有很多,搜了一下,虽然出来一大堆,排除了重复的,却只有两三个,没我想象的好.经常看到CSDN上有人问,QQ这个功能怎么实现,那个界面怎么实现,归纳了一下,决定写这么一个仿QQ ...

  8. 20180826(01)-Java数据结构

    Java 数据结构 Java工具包提供了强大的数据结构.在Java中的数据结构主要包括以下几种接口和类: 枚举 (Enumeration) 位集合(BitSet) 向量 (Vector) 栈 (Sta ...

  9. scrapy电影天堂实战(二)创建爬虫项目

    公众号原文 创建数据库 我在上一篇笔记中已经创建了数据库,具体查看<scrapy电影天堂实战(一)创建数据库>,这篇笔记创建scrapy实例,先熟悉下要用到到xpath知识 用到的xpat ...

  10. Ubuntu 18.04 截图工具 Shutter(可以标记重点)-安装及使用

    Shutter 是一个功能丰富的屏幕截图程序.您可以屏幕的某个特定区域.特定的窗口. 或者是整个屏幕,甚至一整个网站截图.可以对截图应用各种效果,标记重点,然后上 传到一个图片托管网站——所有的任务在 ...