mybatis中关于example类详解mybatis的Example[Criteria]的使用

2023-11-16

一、什么是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层,UserMapper.xml是对应的映射文件
 UserMapper接口:

long countByExample(CompetingStoreExample example);
List selectByExample(CompetingStoreExample example);
在我们的测试类里:

 UserExample example = new UserExample();
 UserExample.Criteria criteria = example.createCriteria();

四、查询用户数量

long count = UserMapper.countByExample(example);
类似于:select count(*) from user

五、where条件查询或多条件查询

 example.setOrderByClause("age asc");//升序
 example.setDistinct(false);//不去重

 if(!StringUtils.isNotBlank(user.getName())){
      Criteria.andNameEqualTo(user.getName());
 }

 if(!StringUtils.isNotBlank(user.getSex())){
      Criteria.andSexEqualTo(user.getSex());
 }

 List<User> userList=userMapper.selectByExample(example);
 类似于:select * from user where name={#user.name} and sex={#user.sex} order by age asc;

 UserExample.Criteria criteria1 = example.createCriteria();
 UserExample.Criteria criteria2 = example.createCriteria();

 if(!StringUtils.isNotBlank(user.getName())){
      Criteria1.andNameEqualTo(user.getName());
 }

 if(!StringUtils.isNotBlank(user.getSex())){
      Criteria2.andSexEqualTo(user.getSex());
 }

 Example.or(criteria2);
 List<User> userList=userMapper.selectByExample(example);
 类似于:select * from user where name={#user.name} or sex={#user.sex} ;

六、模糊查询

 	  if(!StringUtils.isNotBlank(user.getName())){
           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 = 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);
 
        // 获取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对象和传入对象属性

example如何使用? 简单查询 这个例子展示了如何用生成后的Example类去生成一个简单的where子句:

TestTableExample example = new TestTableExample();

example.createCriteria().andField1EqualTo(5);
作为另一种选择, 下面的方式也是可以的:

TestTableExample example = new TestTableExample();

example.or().andField1EqualTo(5);
在上面的例子中, 动态生成的where子句是:

where field1 = 5

下面的例子展示了如何用生成后的Example类去生成一个复杂的where子句 (用到了 JSE 5.0 的泛型):

TestTableExample example = new TestTableExample();

example.or()
.andField1EqualTo(5)
.andField2IsNull();

example.or()
.andField3NotEqualTo(9)
.andField4IsNotNull();

List field5Values = new ArrayList();
field5Values.add(8);
field5Values.add(11);
field5Values.add(14);
field5Values.add(22);

example.or()
.andField5In(field5Values);

example.or()
.andField6Between(3, 7);

在上面的例子中, 动态生成的where子句是:

where (field1 = 5 and field2 is null)
or (field3 <> 9 and field4 is not null)
or (field5 in (8, 11, 14, 22))
or (field6 between 3 and 7)
将会返回满足这些条件的记录结果.

去重复查询
您可以在所有的Example类中调用 setDistinct(true) 方法进行强制去重复查询.

Criteria类
Criteria 内部类的每个属性都包含 andXXX 方法,以及如下的标准的SQL查询方法:

IS NULL - 指相关的列必须为NULL
IS NOT NULL - 指相关的列必须不为NULL
= (equal) - 指相关的列必须等于方法参数中的值
<> (not equal) - 指相关的列必须不等于方法参数中的值

(greater than) - 指相关的列必须大于方法参数中的值
= (greater than or equal) - 指相关的列必须大于等于方法参数中的值
< (less than) - 指相关的列必须小于于方法参数中的值
<= (less than or equal) - 指相关的列必须小于等于方法参数中的值
LIKE - 指相关的列必须 “like” 方法参数中的值. 这个方法不用必须加入 ‘%’, 您必须设置方法参数中的值.
NOT LIKE - 指相关的列必须 “not like” 方法参数中的值. 这个方法不用必须加入 ‘%’, 您必须设置方法参数中的值.
BETWEEN - 指相关的列必须在 “between” 方法参数中的两个值之间.
NOT BETWEEN - 指相关的列必须不在 “not between” 方法参数中的两个值之间.
IN - 指相关的列必须在传入的方法参数的list中.
NOT IN - 指相关的列必须不在传入的方法参数的list中.

如何生成Example类?
mybatis的的配置文件可以使用mybatis-generator工具生成,它就可以帮我们生成example类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis中关于example类详解mybatis的Example[Criteria]的使用 的相关文章

  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • SQL Server 标识列值从 0 而不是 1 开始

    我遇到了一个奇怪的情况 数据库中的某些表的 ID 从 0 开始 即使 TABLE CREATE 的 IDENTITY 1 1 也是如此 对于某些表来说是这样 但对于其他表则不然 它一直有效到今天 我尝试过重置身份列 DBCC CHECKID
  • SQL Server查询麻烦,多对多关系

    不知道如何用一行字来表达这个问题 对标题表示歉意 我的数据库中有3个表 例如 Shop Item 商店库存 Shop 和 Item 具有多对多关系 因此 ShopStock 表将它们链接起来 ShopStock 中的字段是 ID ShopI
  • 从两个表中搜索然后删除

    我有两个包含成员数据的表 与 member id 列链接 我需要搜索所有记录email列以 pl 结尾 然后 我需要为此删除两个表中的所有记录 基于 member id 是否可以通过一条 SQL 语句完成此操作 SELECT member
  • 从 SQL Server 2012 查询结果中减去小时数

    我正在 SQL Server 2012 Management Studio 中的警报系统信号自动化平台数据库上运行查询 但遇到了一些问题 我的查询运行得很好 但我无法将结果细化到我想要的水平 我正在选择一些格式为的列DATETIME 我只想
  • 使用 hibernate 进行动态查询

    我有一个应用程序 我需要使最终用户能够通过某种类型的向导定义选项来创建临时报告 其过程如下 1 User selects the table s he wants to query eg person project activities
  • 如何在 Hibernate 中使用 Oracle 查询提示

    我试图在 Hibernate 中使用 Oracle 提示来调用强制索引 但在 Hibernate 3 6 10 Final 中没有找到任何合适的 API 我以某种方式尝试了 Hibernate 标准中的预测 proList add Proj
  • 标记个体内事件发生后发生的日期

    我有一组长格式的数据 每人几行 人 id 其中事件 事件 1 应该只发生一次 事件发生后 该人不应再有任何数据 如果事件发生后出现任何记录 我想使用名为 flag flag 1 的新变量创建一个查询 例如 下面标记了 id 5 因为在该人的
  • SQL 用新值替换旧值

    我有一个名为tbl Products 其中有一列名为articlenumber并且充满了像这样的数字s401 s402 etc 我生成了一个包含新商品编号的列表 它将替换旧的商品编号 s401 I00010 s402 I00020 s403
  • Python SQLite3 SQL注入漏洞代码

    我知道下面的代码片段由于 format 的原因很容易受到 SQL 注入的攻击 但我不知道为什么 有谁明白为什么这段代码容易受到攻击以及我从哪里开始修复它 我知道这些代码片段使输入字段保持打开状态 以便通过 SQL 注入执行其他恶意命令 但不
  • 使用另一个表中的数据查找并替换 MySQL 中的字符串

    我有两个 MySQL 表 我想使用另一个表中的数据查找和替换一个表中的文本字符串 Table texts messages thx guys i think u r great thx again u rock Table dictiona
  • 从多个表中选择 - 一对多关系

    我有这样的表 表产品 身份证 姓名 表格图像 产品 ID 网址 订单号 表价 产品 ID 组合 货币 价格 表数量 产品 ID 组合 数量 表 Product 与其他表是一对多关系 我需要查询表并得到类似这样的结果 伪数组 ProductI
  • 如何在没有 EF 的 ASP.NET MVC 中使用普通 sql?

    我有一个使用 linq to sql 的类 如何在 ASP NET MVC 3 中使用普通 sql 而不使用 EF 来实现相同的功能 public ActionResult Index var List from c in db OFFIC
  • 按小时拆分日期/时间数据并将日期/时间范围展开为行

    我正在尝试使用 SQL Server 将一系列日期 时间数据扩展为多行 例如 我的数据看起来像 Date StartTime EndTime EmployeeID ShiftType 10 1 2019 8 30 00AM 4 57 00P
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • 在同一个表上组合两个 SQL SELECT 语句

    我想结合这两个 SQL 查询 SELECT FROM Contracts WHERE productType RINsell AND clearTime IS NULL AND holdTime IS NOT NULL ORDER BY g
  • MySQL 子查询返回多行

    我正在执行这个查询 SELECT voterfile county Name voterfile precienct PREC ID voterfile precienct Name COUNT SELECT voterfile voter
  • Hibernate Envers:如何捕获谁删除了审计表中的实体

    我在用hibernate envers with spring 一切工作正常 除了当我删除一个实体时 它不会改变的值updated by and updated date在审计表内 它会在之后保存一个与之前完全相同的实体 仅复制 sprin
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • 如何将 Hibernate 5 安装到 Apache Karaf v4 中

    我已经安装了 Apache Karaf v4 03 并查询了 Hibernate 的可用功能列表 如下所示 不幸的是 我使用的是 Hibernate v5 hibernate 3 3 2 GA Uninstalled enterprise

随机推荐

  • html输入框文字颜色_HTML5颜色输入

    html输入框文字颜色 Currently supported in all modern browsers with the exception of Safari and Internet Explorer the potential
  • 使用正则匹配标签

    在我写上一个试题管理项目时 有一个需求是需要匹配HTML文档节点的 因为有些试题是有图片的 所以需要把图片给匹配出来 他储存在数据库的形式如下 img src xxx xx x x png xxxxxxxxxxxxxxxxxxxxxxxxx
  • An exception occurred processing JSP page

    今天在整个Mybatis SSM 练习时 运行程序一直报一下错误 说是 An exception occurred processing JSP page处理JSP页面时发生异常 Type Exception Report Message
  • JMS 学习 一

    JMS 作为一个ActiveMQ的实现 在JAVA开发中经常使用 一 环境准备 从最新的网站上获取最新版本 下载地址为 http activemq apache org download html 可以看到有2个版本 一个windows版本
  • MySQL为什么使用B+树作为索引? 索引原理?

    目录 一 Mysql索引主要有两种结构 B Tree索引和Hash索引 什么是索引 为什么要使用索引 举例说明使用索引的好处 数据库中使用什么数据结构作为索引 各种树的名字 平衡二叉树 为什么平衡二叉树也不适合作为索引 B Tree适合作为
  • linux内核安装编译

    Linux内核下载及编译 下载Linux内核 可以从官网下载linux内核 也可以通过第三方网站进行下载 官网网址 https www kernel org 由于官网可能存在被墙的原因 所以下在很慢 这里也提供一个更加便捷的下载地址 htt
  • 爬虫小练手

    目录 一 简介 了解爬虫 二 网络协议 2 1 http协议 2 2 https协议 三 入门案例 3 1 爬取搜狗首页的页面数据 3 2 爬取搜狗指定词条对应的搜索结果页面 简易网页采集器 3 3 破解百度翻译 获取想要的翻译结果 3 4
  • Windows10家庭版添加组策略编辑器

    1 新建批处理文件test bat 内容如下 echo off pushd dp0 dir b SystemRoot servicing Packages Microsoft Windows GroupPolicy ClientExtens
  • Unity实战(1):Unity点击按钮,打印按钮文字内容

    目录 前言 一 准备工作 1 在场景中新建一个按钮 这里使用的是Button TextMeshPro 如果没有需要更新UNITY版本 2 将Button的文字内容在这里改为123456以便测试 新建好以后默认的内容是Button 3 新建一
  • c++学习

    7 指针 7 1 指针的基本概念 作用 可以通过指针间接访问内存 指针是用来记录内存地址编号的 指针就是一个地址 1 定义指针 语法 数据类型 指针变量名 int a 10 int p p a 或者int p a cout lt lt a的
  • PTA 基础编程题目集 7-27 冒泡法排序 C语言

    PTA 基础编程题目集 7 27 冒泡法排序 C语言 将N个整数按从小到大排序的冒泡排序法是这样工作的 从头到尾比较相邻两个元素 如果前面的元素大于其紧随的后面元素 则交换它们 通过一遍扫描 则最后一个元素必定是最大的元素 然后用同样的方法
  • Nacos配置文件 Param ‘serviceName‘ is illegal, serviceName is blank

    今天学习NACOS配置文件时 报错Param serviceName is illegal serviceName is blank 但是我在bootstrap yml文件中配置了服务名 父工程引入的依赖版本为最新的2021 1
  • AndroidStudio将module变为library

    文章注明出处可随意转载 请尊重别人的劳动成果 前言 在一个application当中 可能会存在多个module 有时也会有一个module包含其他module的需求 在完成这个需求时 Google了很多 全是2014年之前的一些老文章 现
  • Gateway配合sentinel自定义限流_Spring Cloud Gateway 扩展支持动态限流

    之前分享过 一篇 限流实现 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现 原生RequestRateLimiter 的不足 配置方式 RequestRateLimiterGatewayFilterFacto
  • react+ts+vite从0搭建项目

    一 创建项目 1 创建一个基础项目 npm create vite latest 项目名 template react ts eg 输入命令后需要回答几个问题 按照自己需求选择即可 此处选择react ts 2 格式化代码的配置 a vsc
  • 京东、阿里、小米IoT平台设备接入对比分析

    概述 京东 阿里 小米都在积极布局物联网 智能家居方向 经过几年的运营和积累 各家平台接入了不同产品 形成了各自的发展模式 本报告从平台设备的视角 通过分析各平台设备接入情况 对比已接入的设备品类 摸清平台的布局 分析各平台优劣势 为物联网
  • 车载以太网工具链

    一 什么是车载以太网 随着近年汽车电子的快速发展 车内ECU数量的持续增加 带宽需求也随之不断增长 对此 汽车制造商的电子系统 线束系统等成本也在提高 而相比于传统总线技术 车载以太网不仅可以满足汽车制造商对带宽的需求 同时还能降低车内的网
  • 2.树莓派上程序自启动方式总结(带桌面)

    在树莓派上设置程序上电自动启动的几种方法 1 在pi config中新建autostart文件夹 在下面新建 desktop后缀的文件 具体方式问度娘 忘了 2 在pi文件夹下 修改 bashrc和 profile文件 比如直接运行py文件
  • 图像基本变换---图像二值化(包含OSTU/迭代法/统计法/双峰法/P分位法/最大熵法)

    OSTU法图像二值化 算法说明 Ostu法又叫做最大类间方差法 是一种常用的图像分割算法 基本算法思想是根据初始阈值把图像分为两类 然后计算两类之间的方差 更新阈值 重新计算类间方差 当满足类间方差最大时的阈值 即为所求最佳阈值 具体过程如
  • mybatis中关于example类详解mybatis的Example[Criteria]的使用

    一 什么是example类 mybatis generator会为每个字段产生如上的Criterion 如果表的字段比较多 产生的Example类会十分庞大 理论上通过example类可以构造你想到的任何筛选条件 在mybatis gene