之前用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. express 获取post 请求参数

    在 Express 中没有内置获取表单 POST 请求体的 API , 我们需要添加第三方插件库 安装: npm install --save body-parser 配置: var bodyPars ...

  2. git 使用远程分支覆盖本地分支(重置本地分支)

    1 丢弃本地变更 重置为远端分支内容 git reset --hard origin/branchName 如 git reset --hard origin/F_AssetItem

  3. j函数 判断以 什么开头

    1.str.charAt(index) 返回字符串中指定位置的字符. str 是字符串  我们要将获得的数据 转化为字符串 var code = res.statusCode.toString(); ...

  4. CSS3 flexbox弹性布局实例

    常用例子 1.居中对齐 <!DOCTYPE html> <head> <meta charset="utf-8"> <style type ...

  5. LCT的一些坑【已经变成坑点集合了233】

    好了蠢蠢的我写了第一个LCT模板就炸掉了QAQ 开个blog记一下我能出多少锅. 1.splay写挂了hhh这个你真的是蠢 2.这个奇怪的东西 bool not_root(int x){return ...

  6. tomcat 部署指南

    下载与安装 个人建议不要使用发行版带的版本, 始终从主页来下载安装, 下载地址位于[1], 安装方法很简单, 直接解压即可, 建议解压到 /usr/local/ 目录, 再链接到 /usr/local ...

  7. [POJ 1911] 棋盘

    问题描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次切割都只能沿着 ...

  8. django数据库迁移相关【sqlite3迁移到MySQL】(django2.0.3测试通过)

    前言 项目部署到服务器之后,用的数据库还是sqlite3. 发现一些问题,sqlite3是小巧,但是服务器上查看数据库比较费劲,不能直观看到数据.可是我们经常需要即时.直观查看数据,这就用到MySQL ...

  9. 3,LinkedList

    一,LinkedList简介 1,LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. 2,LinkedList 实现 ...

  10. dede标签大全

    想必很多人对后台不熟悉,并且觉得很难.其实不难,只是你们没有找到合适的方法学习而已!只有找到一个合适的学习方法,不管做什么事情,我想都很容易.学习讲究的是效率,而效率又是由思路决定的.就拿网页制作来说 ...