之前用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. linux grep 设置高亮显示

    [root@eric ~]# vi /etc/profile alias grep='grep --color=auto' [root@eric ~]# source /etc/profile

  2. mv 移动或重命名文件

    1. 命令功能 mv:移动或改文件名 2. 语法格式 mv  [option]  source  dest mv 选项  源文件 目标文件 参数 参数说明 -f 如果目标文件存在,则不会询问而是直接覆 ...

  3. Google Capture The Flag 2018 (Quals) - Beginner's Quest - Reverse - Firmware

    参考链接:https://ctftime.org/task/6263 题目 After unpacking the firmware archive, you now have a binary in ...

  4. [php 拓展开发] hello world

    1.下载php源码包 2.在php-7.0.9/ext 下执行 ./ext_skel --extname=hello  3. 4.拓展代码 5. 6.编译 多了分号,出错. 重新编译成功,但是生成的文 ...

  5. [thinkphp 5.0源码阅读] 缓存(一)

    保存缓存: user表数据: cache()方法保存缓存: 访问 http://mythinkphp.com/index/index/cache ,两个缓存被保存(runtime/cache目录下): ...

  6. UML快速理解

    在团队协作过程中最常见的就是开会.开会最常用的就是图,而图中最常见的就是流程图.时序图.类图,这三个图可以清楚的描述你想解释的内容.学好类图不仅仅能帮助自己更清楚的梳理业务,还能提高开会效率. 上图是 ...

  7. SpringBoot---异步消息

    1.概述 1.1.SpringBoot  对 JMS 的自动配置  位于  org.springframework.boot.autoconfigure.jms下: 1.2.SpringBoot  支 ...

  8. 前端面试题:不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标,,怎么实现好?

    昨天,看这道题,脑子锈住了,就是没有思路,没看明白是什么意思?⊙﹏⊙|∣今天早上起床,想到需要思考一下这个问题. 当然,我没想明白为什么要这样做?(创建一个长度为100的数组,并且每个元素的值等于它的 ...

  9. Test 3.27 T3 矩阵

    Description 给一个 n*n 的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入 k n(n<2000)和一个 n*n 的地图 Output 输 ...

  10. Task10.Bert

    Transformer原理 论文地址:Attention Is All You Need:https://arxiv.org/abs/1706.03762 Transformer是一种完全基于Atte ...