MyBatis的example.createCriteria()方法学习记录

目录

    • 一、mapper的crud方法:
      • 1. insert方法
        • insert(User user)
        • insertSelective(User user)
      • 2. select方法
        • selectByPrimaryKey(id)
        • selectByExample(example)
        • selectCountByExample(example)
      • 3. update方法
        • updateByPrimaryKey(User user)
        • updateByPrimaryKeySelective(User user)
        • updateByExample(User user, Example example)
        • updateByExampleSelective(User user, Example example)
      • 4. delete方法
        • deleteByPrimaryKey(id)
        • deleteByExample(example)
    • 二、and / or方法
      • and方法
        • 1. andEqualTo("field", value)
        • 2. andAllEqualTo(param)
        • 3. andNotEqualTo("field", value)
        • 4. andIn("field", list)
        • 5. andNotIn("field", list)
        • 6. andIsNull("field")
        • 7. andIsNotNull("field")
        • 8. andBetween("field", value1, value2)
        • 9. andNotBetween("field", value1, value2)
        • 10. andLike("field", str)
        • 11. andNotLike("field", str)
        • 12. andGreaterThan("field", value)
        • 13. andGreaterThanOrEqualTo("field", value)
        • 14. andLessThan("field", value)
        • 15. andLessThanOrEqualTo("field", value)
        • 16. andCondition(condition)
      • or方法
        • 1. orEqualTo(param)
        • 2. orIn("field", list)
      • and和or一同使用
        • a and ( b or c)
        • (a and b) or (c or d)

MyBatis 的 Example 是一种用于动态查询构造的工具,允许开发者通过简单的 Java 对象来生成 SQL 语句。使用 Example,可以灵活地设置查询条件,例如使用链式调用指定字段、条件和排序等。它支持多种查询方式,如模糊查询、精确查询和范围查询,使得构建复杂的查询变得更加方便和直观。通过 Example,开发者可以减少手写 SQL 的工作量,提高代码的可读性和维护性。

一、mapper的crud方法:

1. insert方法

insert(User user)

插入一条数据,返回值是id

mapper.insert(User user)
insertSelective(User user)

插入一条数据,值为null的字段会做判空操作,不会添加 (推荐使用)

mapper.insertSelective(user)

2. select方法

selectByPrimaryKey(id)

根据主键查询,返回的是个对象

mapper.selectByPrimaryKey(id)
selectByExample(example)

根据条件查询,返回的是一个list

mapper.selectByExample(example)
selectCountByExample(example)

根据条件查询后计数,返回的是int

mapper.selectCountByExample(example)

3. update方法

updateByPrimaryKey(User user)

根据主键修改,返回的是int

mapper.updateByPrimaryKey(user)
updateByPrimaryKeySelective(User user)

根据主键修改不为null的字段,返回的是int (建议使用)

mapper.updateByPrimaryKeySelective(user)
updateByExample(User user, Example example)

根据条件修改,返回的是int,注意:前面的参数user是要修改的内容,后面的example是查询条件,查到结果后将结果按user的值修改

mapper.updateByExample(user, example)
updateByExampleSelective(User user, Example example)

根据条件修改不为null的字段,返回的是int (建议使用)

mapper.updateByExampleSelective(user, example)

4. delete方法

deleteByPrimaryKey(id)

根据主键删除,返回的是int

mapper.deleteByPrimaryKey(id)
deleteByExample(example)

根据条件删除,返回的是int

mapper.deleteByExample(example)

二、and / or方法

and方法

1. andEqualTo(“field”, value)

表示条件为实体类字段"field"等于value值

Example example = new Example(WorkGuideModel.class);    
example.createCriteria().andEqualTo("createUserId","1").andEqualTo("isDelete",0);
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where( ( create_user_id = ? and is_delete = ? ) )

where后为什么会多两层括号我也不知道…反正查询结果是对的,下面为了美观和方便,就手动把括号去掉了

另一种单参数写法: 参数为map

Map<String, String> param = new HashMap<>();
param.put("createUserId","1"); 
param.put("isDelete","0");    Example example = new Example(WorkGuideModel.class);  
example.createCriteria().andEqualTo(param);      
List<WorkGuideModel> list = mapper.selectByExample(example);   
return list;
2. andAllEqualTo(param)

andEqualTo的单参数形式一样,参数为map

3. andNotEqualTo(“field”, value)

与andEqualTo相反,条件为实体类字段"field"不等于value值,同时此方法没有单参数

Example example = new Example(WorkGuideModel.class); 
example.createCriteria().andNotEqualTo("createUserId","1"); 
List<WorkGuideModel> list = mapper.selectByExample(example);    
return list;

执行sql:

select * from tb_work_guide where create_user_id <> ?

4. andIn(“field”, list)

表示条件为实体类"field"字段的值包含ids里的值,与sql语句中的in()相同

List<Integer> ids = new ArrayList<>(); 
ids.add(1); 
ids.add(2);Example example = new Example(WorkGuideModel.class);        example.createCriteria().andIn("createUserId",ids);    
List<WorkGuideModel> list = mapper.selectByExample(example);   
return list;

执行sql:

select * from tb_work_guide where create_user_id in ( ? , ? )

list中不一定要是Integer类型,也可以是String

List<String> titles = new ArrayList<>();  
titles.add("标题1"); 
titles.add("标题2");   Example example = new Example(WorkGuideModel.class);   
example.createCriteria().andIn("title",titles);   
List<WorkGuideModel> list = mapper.selectByExample(example);  
return list;

举一反三:

与sql语句中的FIND_IN_SET]也相同

需要注意的是,FIND_IN_SET(str,strList),这里的str为数据库中的字段名,如create_user_id,而不是实体类的createUserId

执行sql:

select * from tb_work_guide where FIND_IN_SET (create_user_id , ‘1,2’)


5. andNotIn(“field”, list)

与andIn()相反,查询"field"字段不包含list中的值的结果

执行sql:

select * from tb_work_guide where create_user_id not in ( ? , ? )

6. andIsNull(“field”)

表示实体类"field"字段为null

Example example = new Example(WorkGuideModel.class);
example.createCriteria().andIsNull("createUserId");
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where create_user_id is null

7. andIsNotNull(“field”)

与andIsNull()相反,表示实体类"field"字段不为null

Example example = new Example(WorkGuideModel.class);
example.createCriteria().andIsNotNull("createUserId");
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where create_user_id is not null

8. andBetween(“field”, value1, value2)

表示"field"字段的值在value1和value2之间,注意:这个区间是包头包尾的,1 <= field <= 7

Example example = new Example(WorkGuideModel.class);
example.createCriteria().andBetween("createUserId",1,7);
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where create_user_id between ? and ?


9. andNotBetween(“field”, value1, value2)

与andBetween()相反,表示"field"字段的值不在value1和value2之间,注意:这个区间也是包头包尾的,field < 1 或 field >7

Example example = new Example(WorkGuideModel.class);
example.createCriteria().andNotBetween("createUserId",1,7);
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where create_user_id not between ? and ?

10. andLike(“field”, str)

表示模糊查询,注意:需要自己拼接%或_

String str = "缴费";   
Example example = new Example(WorkGuideModel.class);   
example.createCriteria().andLike("title","%"+str+"%");    
List<WorkGuideModel> list = mapper.selectByExample(example);  
return list;

执行sql:

select * from tb_work_guide where title like ?

11. andNotLike(“field”, str)

与andLike相反的查询,也需要自己拼接%或_

String str = "缴费";     
Example example = new Example(WorkGuideModel.class);
example.createCriteria().andNotLike("title","%"+str+"%");
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where title not like ?

12. andGreaterThan(“field”, value)

表示查询"field"字段中大于value的值

Example example = new Example(WorkGuideModel.class);
example.createCriteria().andGreaterThan("age",20);
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where age > ?

13. andGreaterThanOrEqualTo(“field”, value)

与andGreaterThan()差不多,表示"field"字段中大于等于value的值

执行sql:

select * from tb_work_guide where age >= ?

14. andLessThan(“field”, value)

表示查询"field"字段中小于value的值

Example example = new Example(WorkGuideModel.class);
example.createCriteria().andLessThan("age",20);
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where age < ?

15. andLessThanOrEqualTo(“field”, value)

与andLessThan()差不多,表示"field"字段中小于等于value的值

执行sql:

select * from tb_work_guide where age <= ?

16. andCondition(condition)

在where后直接拼接条件,注意:此时拼接的field字段名是数据库的列名

写法1:

直接写完全where后面的条件语句,会自动将create_user_id = 1拼接到where后

Example example = new Example(WorkGuideModel.class);
example.createCriteria().andCondition("create_user_id = 1");
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where create_user_id = 1

写法2:

andCondition(condition,value)condition写查询字段(注意要记得加上=,不然会报错),value传值,这样value值就可以写活了

Example example = new Example(WorkGuideModel.class);
example.createCriteria().andCondition("create_user_id = ",1);
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where create_user_id = ?

andCondition()这个方法写的大佬都太少了,目前我只知道这是拼接作用的

or方法

or方法跟and方法其实差不多,只是and方法是在多条件中间拼接and,or方法是拼接or,下面就举几个例子加深印象,主要还是and和or一同使用

1. orEqualTo(param)
Map<String, String> param = new HashMap<>();
param.put("createUserId","1");
param.put("isDelete","0");Example example = new Example(WorkGuideModel.class);
example.createCriteria().orEqualTo(param);
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where create_user_id = ? or is_delete = ?

2. orIn(“field”, list)
List<String> titles = new ArrayList<>();  
titles.add("标题1");  
titles.add("标题2");Example example = new Example(WorkGuideModel.class);     
example.createCriteria().orIn("title", titles);  
List<WorkGuideModel> list = mapper.selectByExample(example);   
return list;

执行sql:

select * from tb_work_guide where title in ( ? , ? )

从sql中可以看到,orIn和andIn的执行sql是一样的,其余方法就不测试了,大概是一样的,只有多个条件时,中间的连接符号不同

如下:

Example example = new Example(WorkGuideModel.class);
example.createCriteria().orLike("title","%标题1%").orLike("createUserName","%小明%");    
List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where title like ? or create_user_name like ?

List<String> titles = new ArrayList<>();  
titles.add("标题1");  
titles.add("标题2"); Example example = new Example(WorkGuideModel.class);  
example.createCriteria().orIn("title",titles).orLike("createUserName","%小明%");  
List<WorkGuideModel> list = mapper.selectByExample(example);   
return list;

执行sql:

select * from tb_work_guide where title in ( ? , ? ) or create_user_name like ?

and和or一同使用

a and ( b or c)
Example example = new Example(WorkGuideModel.class);   
Example.Criteria criteria = example.createCriteria();   
criteria.andEqualTo("userId",1);Example.Criteria criteria2 = example.createCriteria();
criteria2.orLike("title","%标题%").orBetween("age",1,5);
example.and(criteria2);List<WorkGuideModel> list = mapper.selectByExample(example);   
return list;

执行sql:

select * from tb_work_guide where ( ( user_id = ? ) and ( title like ? or age between ? and ? ) )

(a and b) or (c or d)
List<String> titles = new ArrayList<>();
titles.add("标题1");    
titles.add("标题2");    Example example = new Example(WorkGuideModel.class);     
Example.Criteria criteria = example.createCriteria();      
criteria.andEqualTo("userId",1).andIn("title",titles);Example.Criteria criteria2 = example.createCriteria();    
criteria2.orLike("name","%小明%").orBetween("age",1,5);       
example.or(criteria2);List<WorkGuideModel> list = mapper.selectByExample(example);
return list;

执行sql:

select * from tb_work_guide where ( create_user_id = ? and title in ( ? , ? ) ) or ( title like ? or open between ? and ? )

将代码中的example.or(criteria2);改成example.and(criteria2);后会发现sql变成了:

select * from tb_work_guide where ( create_user_id = ? and title in ( ? , ? ) ) and ( title like ? or open between ? and ? )

总结:

多条件查询时,可以直接使用同一个条件构造器,往里面直接添加条件就行。多重条件查询时,如上面的两个括号中的条件都要分别满足时,可以分别创建条件构造器,然后分别往里添加条件

Example.Criteria criteria = example.createCriteria();
Example.Criteria criteria2 = example.createCriteria();

两个括号之间(也就是两个条件构造器之间)使用example的and或or来连接

example.and(criteria2);
example.or(criteria2);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391060.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-table 表格序号列前端实现递增,切换分页不从头开始

<el-table-column type"index" width"55" label"序号" :index"hIndex"> </el-table-column> 分页 <el-pagination size-change"handleSizeChange" current-change"handleCurrentChange"> <…

Day29 | 动态规划 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

语言 Java 509. 斐波那契数 斐波那契数 题目 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n -…

Java 中的缓冲流

字符流 前面学习的字节流和字符流都是基本流&#xff0c;其中字符流的底层其实已经在内存中创建了一个长度为8192的字节数组作为缓存区。而字节流中则是没有的。 在内存中增加缓冲区的目的是为了减少内存与硬盘的交互的次数&#xff0c;因为这一操作比较耗时。 下面是一个图…

Pr2024苹果(mac)版剪辑软件安装下载(附下载链接)

Adobe Premiere Pro 2024&#xff08;简称PR 2024&#xff09;是一款由Adobe公司开发的专业视频编辑软件&#xff0c;被广泛应用于电影、电视、广告和社交媒体视频的制作。以下是对PR 2024的详细简介&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rN-3kB3KQgn0JswDa…

基于PFC和ECN搭建无损RoCE网络的工作流程分析

无损RoCE网络概念 RDMA&#xff08;Remote Direct Memory Access&#xff0c;远程直接内存访问&#xff09;是一种为了解决网络传输中服务器端数据处理延迟而产生的技术。RDMA 将用户应用中的数据直接传入服务器的存储区&#xff0c;通过网络将数据从一个系统快速传输到远程系…

Leetcode第136场双周赛题解(c++)

题外话 也是好久没有更新力扣比赛的题解了&#xff0c;前段时间也是比较忙&#xff08;说的好像现在不忙一样哈哈&#xff09;&#xff0c;像我等菜鸟&#xff0c;一般都是保二进三四不写的&#xff0c;笑死。 题目一.求出胜利玩家的数目 给你一个整数 n &#xff0c;表示在…

MySQL·事务

目录 事务是用来做什么的&#xff1f; 什么是事务&#xff1f; 为什么会出现事务 事务提交方式 事务操作前提了解 事务常见操作方式 读未提交(RU) 读提交(RC) 可重复读(RR) 串行化 一致性(Consistency) 事务是用来做什么的&#xff1f; CURD不加控制&#xff0c;会…

Phalco安装过程以及踩的一些坑(mac环境)

一 背景 公司用Phalcon框架好长时间了,中途发现了一些Phalcon使用的上的问题,于是想在本地搭建一套Phalcon的环境,方便排查问题使用。 二 Mac系统下的安装 看了很多说法,最终发现还是官网给力,安装Phalcon使用下列命令即可(前提条件是PHP已安装好,工具pecl也安装好了):…

现代C++多线程编程:C++20 jthread全面解析

目录 一、引言 二、jthread 的基本特点和优势 自动 join 机制 线程取消功能 相对于 std::thread 的改进和便利 三、jthread 的工作原理 线程的生命周期管理 线程取消机制的实现和使用方法 四、jthread 的实际应用案例 服务器编程中的应用 高性能计算中的应用 实时系…

JVM知识总结(内存结构)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 内存模型 内存结构 堆&#xff1a; 存放对象实例, 几乎所有的对象…

GUI:Tkinter(一)

Tkinter文档 一&#xff0c;Tkinter基本流程 1. 创建应用程序主窗口对象 from tkinter import * window Tk() window.mainloop()#开启主循环 2. 在主窗口中&#xff0c;添加各种可视化组件&#xff0c;比如&#xff1a;按钮&#xff08;Button&#xff09;、文本框&#x…

[CP_AUTOSAR]_系统服务_DEM模块(三)功能规范之诊断事件定义

目录 1、诊断事件定义1.1、Event priority&#xff08;事件优先级&#xff09;1.2、Event occurrence&#xff08;事件发生计数器&#xff09;1.3、Event kind&#xff08;事件类别&#xff09;1.4、Event destination&#xff08;故障内存&#xff09;1.5、Diagnostic monitor…

springboot系列教程(三十):springboot整合Zookeeper组件,管理架构中服务协调

一、Zookeeper基础简介 1、概念简介 Zookeeper是一个Apache开源的分布式的应用&#xff0c;为系统架构提供协调服务。从设计模式角度来审视&#xff1a;该组件是一个基于观察者模式设计的框架&#xff0c;负责存储和管理数据&#xff0c;接受观察者的注册&#xff0c;一旦数据…

【数据结构】链表篇

文章目录 1.链表的概念以及结构2.链表的分类2.1 单向或者双向2.2 带头或者不带头2.3 循环或者不循环2.4 无头单向非循环链表和带头双向循环链表 3.单链表的实现3.1 准备工作3.2 节点的创建3.3 单链表的释放3.4 打印链表3.5 单链表的尾插3.6 单链表的尾删3.7 单链表头删3.8 单链…

TiDB系列之:TiCDC同步TiDB数据库数据到Kafka集群Topic

TiDB系列之&#xff1a;TiCDC同步TiDB数据库数据到Kafka集群Topic 一、Changefeed 概述Changefeed 状态流转操作 Changefeed 二、同步数据到Kafka创建同步任务&#xff0c;复制增量数据 KafkaSink URI 配置 kafka最佳实践TiCDC 使用 Kafka 的认证与授权TiCDC 集成 Kafka Connec…

搭建高可用OpenStack(Queen版)集群(一)之架构环境准备

一、搭建高可用OpenStack&#xff08;Queen版&#xff09;集群之架构环境准备 一、架构设计 二、初始化基础环境 1、管理节点创建密钥对&#xff08;方便传输数据&#xff09; 所有控制节点操作 # ssh-keygen #一路回车即可 Generating public/private rsa key pair. Enter f…

算法通关:016:设计循环双端队列

文章目录 题目思路代码运行结果问题为什么能直接调用方法名 题目 leetcode641 设计循环双端队列 思路 代码 import java.util.Deque; import java.util.LinkedList;/*** Author: ggdpzhk* CreateTime: 2024-08-03* 641 双端队列&#xff1a;利用双向链表和动态数组实现*/ pu…

C#和S7-1200PLC S7.NET通信

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏4次。这篇博客作为C#的基础系列,和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先创建一个窗体应用。_s7协议批量…

【uniapp离线打包】(基于Android studio)

文章目录 uniapp打包官方教程入口一、准备工作(工具三大件)Android Studio版本推荐 二、准备工作&#xff08;Android壳和uniapp包&#xff09;导入Android壳生成uniapp包将uniapp包导入android壳降低jdk版本 三、准备工作&#xff08;证书&#xff09;准备Android平台离线签名…

SpringSecurity-1(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)

SpringSecurity 1 初识权限管理1.1 权限管理的概念1.2 权限管理的三个对象1.3 什么是SpringSecurity 2 SpringSecurity第一个入门程序2.1 SpringSecurity需要的依赖2.2 创建web工程2.2.1 使用maven构建web项目2.2.2 配置web.xml2.2.3 创建springSecurity.xml2.2.4 加载springSe…