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

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

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

avaBeans类的成员变量一般称为属性(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_userset id = #{user.id,jdbcType=INTEGER},...<if test="_parameter != null" ><include refid="Update_By_Example_Where_Clause" /></if>

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

以上参考:http://blog.51cto.com/tianxingzhe/1741268

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

传参格式:* {    "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 - @mbggeneratedThis 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"><!--WARNING - @mbggeneratedThis element is automatically generated by MyBatis Generator, do not modify.This element was generated on Wed Jan 17 10:03:58 CST 2018.-->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中的关联查询

    mybatis中的关联查询 (尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_39778516/article/details/84191429 consistence ...

  2. 关于mybatis中的时间段查询

    ** 关于mybatis中的时间段查询 在最近的开发中使用比较频繁的一个点,咱就是说浅浅的记录一下!! 相信大家对于mybatis框架并不陌生,我使用它在开发过程中需要对一个时间段进行查询,前端设置的 ...

  3. mybatis中LIKE模糊查询的几种写法以及注意点(亲测第三种CONCAT()函数的)

    mybatis中对于使用like来进行模糊查询的几种方式: (1)使用${...} 注意:由于$是参数直接注入的,导致这种写法,大括号里面不能注明jdbcType,不然会报错 org.mybatis. ...

  4. mybatis中LIKE模糊查询的几种写法以及注意点

    From: https://blog.csdn.net/zhenwei1994/article/details/81876278 mybatis中对于使用like来进行模糊查询的几种方式: (1)使用 ...

  5. Mybatis中的模糊查询

     今天下午做的一个功能,要用到模糊查询,字段是description,刚开始我的写法用的是sql中的模糊查询语句, 但是这个有问题,只有将字段的全部值传入其中,才能查询,所以不是迷糊查询. 后来经 ...

  6. php ci model条件查询,Laravel关系模型指定条件查询方法

    对于关系模型来说,有时候我们需要甄别关联后结果,例如,班级和学生是一对多关联,我现在查询班级,但是想只显示正常状态,即状态为1的学生,因为有的学生从这个班级里面删除了,状态是4,那么我们在查询的时候就 ...

  7. mybatis中sql语句查询操作

    动态sql where if where可以自动处理第一个and. <!-- 根据id查询用户信息 --><!-- public User findUserById(int id); ...

  8. MyBatis中多表查询(多表查询语句实现)重点

    –查询所有学生所在班级的信息(一对一) –班级查询学生的操作(一对多) –遇到的问题: 查询的SQL语句非常的简单,但是如何把查询的数据接受这个就是一个问题 [1]把每一个实体中的字段拿出来组建成一个 ...

  9. MyBatis中多表查询(N+1方式)

    N+1查询方式 [1]什么是N+1的查询方式 如果没有N+1的方式我们想要实现多表的查询,自己书写查询的业务逻辑代码(java) mybatis希望通过自己标签配置的方式来解决这个问题 [2]执行的操 ...

  10. MyBatis中多表查询(业务代码方式)

    业务代码的方式 (实现的方式,书写业务逻辑的java代码实现) ------查询学生所在班级的信息 (一对一查询) 1.先把所有学生查询出来(clazzno) select* from student ...

最新文章

  1. 一个古老的问题HashMap与Hashtable区别
  2. Anaconda3 离线安装 Django-3.2.7 及依赖项setuptools、sqlparse 、asgiref、typing_extensions等模块
  3. python数字和运算_Python学习笔记:数字类型和运算符,与
  4. Vagrant的用法
  5. python 为什么元组中只包含一个元素时,需要在元素后面添加逗号?(消除歧义)
  6. ARC 100 C - Linear Approximation题解---三分法
  7. 673. 最长递增子序列的个数
  8. (转)Java初始化顺序
  9. Android写的一个设置图片查看器,可以调整透明度
  10. 嵌入式linux的驱动程序
  11. 微软双机双柜方案讨论
  12. Android开发人员必看的资料
  13. ISO27001认证的主要步骤
  14. 0基础学MySQL数据库—从小白到大牛(19)字符集
  15. php追加append,PHP ArrayObject append()用法及代码示例
  16. ipados 蓝牙 android,iPadOS 体验:走出 iOS,iPad 终于能取代 PC 了?
  17. 各大国外网站后台管理模块
  18. labview—word报表使用
  19. 实现自动按键的方法 驱动级模拟(硬件模拟)
  20. tools1.0.1

热门文章

  1. 腾讯云WebIM和阿里百川即时通讯使用总结
  2. 干货 | 你的 KL 散度 vanish 了吗?
  3. 携手捷普 :让流程立于云端,臻于至善
  4. luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分...
  5. flex 布局列表自动换行
  6. MoveIt轨迹规划问题
  7. 优选法中的黄金分割法
  8. zookeeper安装配置的时候zoo.cfg配置信息分成了两个文件zoo.cfg.dynamic
  9. 计算机在幼儿园课程中的教学,计算机技术在幼儿教学中的运用策略
  10. POJ 2954-Triangle(计算几何+皮克定理)