MyBatis代码生成器-Example讲解

2023-11-02

什么是example类

mybatis-generator会为每个字段产生Criterion,为底层的mapper.xml创建动态sql。如果表的字段比较多,产生的example类会十分庞大。理论上通过example类可以构造你想到的任何筛选条件。在mybatis-generator中加以配置,配置数据表的生成操作就可以自动生成example了。

实例

example成员变量

example.setOrderByClause(“字段名 ASC”);    // 添加升序排列条件,DESC为降序
example.setDistinct(false)     // 去除重复,boolean型,true为选择不重复的记录。
criteria.andXxxIsNull     // 添加字段xxx为null的条件
criteria.andXxxIsNotNull    // 添加字段xxx不为null的条件
criteria.andXxxEqualTo(value)    // 添加xxx字段等于value条件
criteria.andXxxNotEqualTo(value)    // 添加xxx字段不等于value条件
criteria.andXxxGreaterThan(value)    // 添加xxx字段大于value条件
criteria.andXxxGreaterThanOrEqualTo(value)    // 添加xxx字段大于等于value条件
criteria.andXxxLessThan(value)    // 添加xxx字段小于value条件
criteria.andXxxLessThanOrEqualTo(value)    // 添加xxx字段小于等于value条件
criteria.andXxxIn(List<?>)     // 添加xxx字段值在List<?>条件
criteria.andXxxNotIn(List<?>)    // 添加xxx字段值不在List<?>条件
criteria.andXxxLike(“%”+value+”%”)    // 添加xxx字段值为value的模糊查询条件
criteria.andXxxNotLike(“%”+value+”%”)    // 添加xxx字段值不为value的模糊查询条件
criteria.andXxxBetween(value1,value2)   // 添加xxx字段值在value1和value2之间条件
criteria.andXxxNotBetween(value1,value2)    // 添加xxx字段值不在value1和value2之间条件

selectByExample

// 创建 Example 对象
CountryExample example = new CountryExample();
// 设置排序规则
example.setOrderByClause("id desc, name asc");
// 设置是否 distinct 去重
example.setDistinct(true);
// 创建条件,只能有一个 createCriteria
CountryExample.Criteria criteria = example.createCriteria();
// id >= 1
criteria.andIdGreaterThanOrEqualTo(1);
// id < 4
criteria.andIdLessThan(4);
// countrycode like '%U%'
// 最容易出错的地方,注意 like 必须自己写上通配符的位置,不可能默认两边加 %,like 可以是任何情况
criteria.andCountrycodeLike("%U%");
// or 的情况,可以有多个 or
CountryExample.Criteria or = example.or();
// 或者 name = 中国
or.andNameEqualTo("中国");
// 执行查询
List<Country> countryList = countryMapper.selectByExample(example);

updateByExampleSelective

// 创建 Example 对象
CountryExample example = new CountryExample();
// Example对象包含一个static的内部类Criteria,Criteria中的方法用来定义SQL语句where后的查询条件,只能有一个createCriteria
CountryExample.Criteria criteria = example.createCriteria();
// 更新所有 id > 2 的国家
criteria.andIdGreaterThan(2);
// 创建一个要设置的对象
Country country = new Country()
// 将国家名字设置为 China
country.setCountryname("China");
// 执行查询
countryMapper.updateByExampleSelective(country, example);

我们看CountryMapper接口,可以看到有 updateByExample和updateByExampleSelective。 这两个方法的区别是,当对象的属性为空的时候,第一个方法会将值更新为null , 第二个方法不会更新null属性的字段。 通过Example一般都是批量操作,由于country表存在主键id,不能被批量更新, 因此要使用updateByExampleSelective方法进行测试。

deleteByExample+countByExample

// 创建 Example 对象
CountryExample example = new CountryExample();
// Example对象包含一个static的内部类Criteria,Criteria中的方法用来定义SQL语句where后的查询条件,只能有一个createCriteria
CountryExample.Criteria criteria = example.createCriteria();
// 选择所有 id > 2 的国家
criteria.andIdGreaterThan(2);
// 执行查询
countryMapper.deleteByExample(example);
// 使用 countByExample 查询符合条件的数量
int count = countryMapper.countByExample(example);

复杂查询

and or 查询

Example example = new Example(User.getClass());
// where 条件
Criteria criteria = example.createCriteria();
Criteria criteria1 = example.createCriteria();
        
criteria.andIn("id", ids);
criteria1.orLike("des", "%" + des + "%");
criteria1.orLike("name", "%" + name + "%");
example.and(criteria1);
example.and().andEqualTo("status", staus)
// 等效于:where id in ( #{ids} ) and ( name like concat(‘%’, #{name} ,’%’) or des like concat(‘%’, #{des} ,’%’) ) and status = #{status}

注意:如果不加 example.and(criteria1);,则默认example只添加生成的第一个criteria,criteria1 将不会加到此条件中

数组参数的条件查询

Example example = new Example(User.getClass());
example.and().andEqualTo("sex", sex)
Example.Criteria criteria = example.createCriteria();
for (String str : names) {
    criteria.orLike("name", str);
}
example.and(criteria);
List<User> list = userMapper.selectByExample(example);
            
// 等效于:where sex = #{sex} and ( name like concat(‘%’, #{name1} ,’%’) or name like concat(‘%’, #{name2} ,’%’) )

OR 查询

VehDriverExample example = new VehDriverExample();
VehDriverExample.Criteria criteria = example.createCriteria();
criteria.andIdNumberEqualTo(vehDriverParam.getIdNumber());

VehDriverExample.Criteria criteria2 = example.createCriteria();
criteria2.andLicenseNumberEqualTo(vehDriverParam.getLicenseNumber());
example.or(criteria2);

VehDriverExample.Criteria criteria3 = example.createCriteria();
criteria3.andCertificateCodeEqualTo(vehDriverParam.getCertificateCode());
example.or(criteria3);

// 等效于 select * from driver where id_number = ? or license_number = ? or certificate_code = ?

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

MyBatis代码生成器-Example讲解 的相关文章

  • 使用MATLAB实现对信号的EMD分解

    文章目录 0 前言 1 经验模式分解EMD 2 希尔伯特变换HT 3 希尔伯特 黄变换HHT 4 基于EMD的语音信号处理 5 MATLAB实现对信号的EMD分解 5 1 对构造的信号进行EMD 5 2 对实际的信号进行EMD 6 参考文献

随机推荐

  • python pyecharts的基础使用

    python pyecharts的基础使用 导包 from pyecharts charts import Line from pyecharts options import TitleOpts LegendOpts ToolboxOpt
  • 如何用springboot实现发送通知给用户的功能

    可以使用 Spring Boot 中的 Spring Boot Starter Mail 来实现发送通知给用户的功能 首先需要在项目的 pom xml 文件中添加对 spring boot starter mail 的依赖 然后在 appl
  • 【程序人生】5个月从职场打杂到月薪14000的女测试工程师逆袭之路

    大家好 我是来自湖南的一位辣妹子 毕业于一所工业大学 大学的专业是软件与工程 其实也算是本专业 大学期间掌握的知识也算比较广 各个方面都会一丢丢 就是不是特别深入 之所以这么说 是因为一直以来我觉得自己还不错 但毕业设计的时候 怎么也做不出
  • Audition报错:“无法应用设备设置,因为发生了以下错误:MME设备内部错误“

    今天打开AU提示有一个错误如下 打开设置以后就这样显示三条都不可用 查找了相关资料发现都不能解决 后来自己尝试几个地方设置才得以解决 问题出在如下 没有选对相应输入输出设备
  • AF_PACKET套接字解密 --- 02

    AF PACKET套接字解密 02 2012 05 23 22 36 57 分类 LINUX 当AF PACKET套接字注册了prot hook后 怎样进行监听呢 先来看发送 当协议栈准备将数据交给net device发送时 它将调用dev
  • (一维数组)输入N个数,然后逆序输出

    一维数组 1 输入N个数 例题6个数 然后逆序输出 define N 6 include stdio h void main int i a N t for i 0 i
  • 网络安全-js安全知识点与XSS常用payloads

    目录 简介 用法 JS必备知识 输出与注释 输出 注释 语法 函数 字符串方法 事件 表单 Cookie 代码执行 伪协议 XSS常用payload 普通 双写绕过 编码绕过 html标签绕过正则 参考 写给和我一样学习安全的小白 简介 J
  • eMMC分区管理

    目录 0 概述 FLASH分区类型 分区大小 分区编址 1 Boot Area Partitions 1 1 容量大小 1 2 从 Boot Area 启动 1 2 1 Original Boot Operation 1 2 2 Alter
  • 递归与回溯的理解

    递归 程序调用自身的编程技巧称为递归 recursion 递归做为一种算法在程序设计语言中广泛应用 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模 较小的问题来求解
  • 忘了高高在上的Chatgpt吧,更香的Claude和Bard来了

    最近LLM这一领域近年来进步神速 新的产品层出不穷 给我们的生活和工作带来了巨大便利 也引发了广泛关注 首当其冲的 就数OpenAI研发的ChatGPT ChatGPT是一款基于GPT模型打造的对话AI系统 被业内公认为目前进展最快 实力最
  • 大多数女生为什么不适合当程序员?

    最重要的一点 逻辑思维能力 女程序员最大的问题不是压力大而是思维方式切换的挑战 从抽象到具象 平常需要将问题抽象出来 运用抽象思维解决工作上的困难 生活中间又要很具象 很感性地和人交往 这是非常难以达到的一件事 加上工作压力一大 就容易崩溃
  • skywalking 实现收集基于python的Django项目链路追踪案例

    一 python3环境设置 1 1 安装python3 apt get update apt install python3 pip y pip install apache skywalking root skywalking agent
  • 人脸相关公开数据集

    1 皮肤分割和面部检测数据集 FSD 1 数据集名称 Face and Skin Detection FSD Database 2D图像 2 数据集简介 The Face and Skin Detection FSD Database is
  • nodejs使用kafka

    什么是卡夫卡 kafka 是一种分布式的 基于发布 订阅的消息系统 消息以消息队列的形式进行发送 如何使用kafka 安装kafka npm i kafka node 配置config 配置kafka的地址和topic 放在config文件
  • 【VQ-VAE论文精读+代码实战】Neural Discrete Representation Learning

    VQ VAE论文精读 代码实战 Neural Discrete Representation Learning 0 前言 Abstract 1 Introduction 提出现有方法的问题并说明有哪些贡献 2 Related Work 提出
  • vue中click无效问题

    当父元素为relative 子元素为absolute时可能会出现click点击无效 无法触发onClick事件的情况 目前已知两种解决方法 1 最外层div的z index层级设置比里面绝对定位的大 2 用 click prevent也是可
  • 【机器学习】特征工程:时间特征构造以及时间序列特征构造(含源代码理解)

    目录 特征工程 时间特征构造以及时间序列特征构造 一 前言 二 特征构造介绍 三 时间特征构造 3 1 连续值时间特征 3 2 离散值时间特征 3 2 1 时间特征拆解 3 2 2 时间特征判断 3 2 3 结合时间维度的聚合特征 四 时间
  • shell浅谈之三for、while、until循环

    一 简介 Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式 有三种常用的循环语句 for while和until while循环和for循环属于 当型循环 而until属于 直到型循环 循环控制符 break和conti
  • 【Redis速通】基础知识2 - 常用数据结构

    Redis 通用指令 下面是一些 Redis 的通用命令 你可以根据下表进行简单的复习 键操作命令 SET 设置指定键的值 GET 获取指定键的值 DEL 删除指定键 EXISTS 检查指定键是否存在 KEYS 获取匹配指定模式的键列表 字
  • MyBatis代码生成器-Example讲解

    什么是example类 mybatis generator会为每个字段产生Criterion 为底层的mapper xml创建动态sql 如果表的字段比较多 产生的example类会十分庞大 理论上通过example类可以构造你想到的任何筛