MyBatis的Example类详解
Example类的定义?
第一次幕课网教程看到关于这方面教时,没有懂example起什么用,感觉不用example也可以查询了,后来认真一看才知道这是查询条件生成器

mybatis-generator会为每个字段产生Criterion,为底层的mapper.xml创建动态sql。如果表的字段比较多,产生的example类会十分庞大。理论上通过example类可以构造你想到的任何筛选条件。在mybatis-generator中加以配置,配置数据表的生成操作就可以自动生成example了。
mybatis 的mapper接⼝提供了增、删、改、查的⽅法。避免过多使⽤xml来直接写sql。
核心方法,通过mapper . 弹出方法名

Example类指定如何构建一个动态的where子句. 表中的每个non-BLOB列可以被包括在where子句中. 例子是展示此类用法的最好方式.
Example类可以用来生成一个几乎无限的where子句.
Example类包含一个内部静态类 Criteria 包含一个用 anded 组合在where子句中的条件列表. Example类包含一个 List 属性,所有内部类Criteria中的子句会用 ored组合在一起. 使用不同属性的 Criteria 类允许您生成无限类型的where子句.
创建 Criteria 对象 可以使用Example类中的 createCriteria() 或者 or() . 如果 Criteria 对象是用 createCriteria() 创建的,它会自动为 List 属性添加一个 Criteria 对象 - 这使得它更容易写一个简单的where子句, 如果您不需要 or 或者其他几个子句组合的话. 用 or(Criteria criteria) 方法创建 Criteria 对象, 方法里的 criteria 对象会被添加进 Criteria 对象的列表中.
重要 我们推荐您只使用 or() 方法创建 Criteria 对象. 我们相信这种方法使代码更有可读性
Mybatis Example 用法手册,接口方法和实例方法
近几个项目一直使用的mybatis来对数据库做查询,期间用到了很多高效简洁的查询方法,特此记录和分享。
一. mapper接口中的函数及方法,
| 方法名 | 功能 |
|---|---|
| int countByExample(UserExample example) | 按条件计数 |
| int deleteByPrimaryKey(Integer id) | 按主键删除 |
| int deleteByExample(UserExample example) | 按条件查询 |
| String/Integer insert(User record) | 插入数据(返回值为ID) |
| User selectByPrimaryKey(Integer id) | 按主键查询 |
| ListselectByExample(UserExample example) | 按条件查询 |
| ListselectByExampleWithBLOGs(UserExample example) | 按条件查询(包括BLOB字段)。只有当数据表中的字段类型有为二进制的才会产生。 |
| int updateByPrimaryKey(User record) | 按主键更新 |
| int updateByPrimaryKeySelective(User record) | 按主键更新值不为null的字段 |
| int updateByExample(User record, UserExample example) | 按条件更新 |
| int updateByExampleSelective(User record, UserExample example) | 按条件更新值不为null的字段 |
二. example实例方法
example 用于添加条件,相当于where后面的部分,理论上单表的任何复杂条件查询都可以使用example来完成。
| 方法 | 说明 |
|---|---|
| example.setOrderByClause(“字段名 ASC”); | 添加升序排列条件,DESC为降序 |
| example.setDistinct(false) | 去除重复,boolean型,true为选择不重复的记录。 |
| example.and(Criteria criteria) | 为example添加criteria查询条件,关系为与 |
| example.or(Criteria criteria) | 为example添加criteria查询条件,关系为或 |
| 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之间条件 |
三. 使用案例
1.基本字段查询
// 1.使用criteria
Example example = new Example(User.class);
Criteria criteria = example.createCriteria();
criteria.andEqualTo("name", name);
criteria.andNotEqualTo("id", id);
criteria.andEqualTo("userId", uid);
List<User> list = userMapper.selectByExample(example); // 不使用criteria,实则example.and()本质底层还是返回的criteria,倒是可以简便写法。
Example example = new Example(User.class);
example.and()
.andEqualTo("name", name)
.andEqualTo("id", id)
.andEqualTo("userId", uid);
List<User> list = userMapper.selectByExample(example);
等效于:select * from user where name = #{name} and id = #{id} and uid = #{uid}
2. 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 将不会加到此条件中
3. 数组参数的条件查询
public Example test(List<String> names, String sex) {
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} ,'%') )
}
说说Mybatis Example常见用法
一. 说明
我们在使用mybatis example做业务 增/删/改/查时,会遇到一些场景。做一下记录。
二. 排序查询
使用mybatis example方式做查询时候,业务需要按照条件排序,比如:创建时间倒序
example.setOrderByClause("create_time desc");
2.1 示例:
@Override
public UpgradeNotifyInfoDTO queryLatestNotify(Integer appType) {
UpgradeNotifyInfoDTO notifyDTO=new UpgradeNotifyInfoDTO();
SportAppUpgradeNotifyExample example = new SportAppUpgradeNotifyExample();
example.setOrderByClause("`create_time` desc");
SportAppUpgradeNotifyExample.Criteria criteria = example.createCriteria();
criteria.andAppTypeEqualTo(appType);
// 0- 禁用 1-启用
criteria.andStatusEqualTo(1);
List<SportAppUpgradeNotify> list = upgradeNotifyMapper.selectByExample(example);
if (!CollectionUtils.isEmpty(list)){
BeanUtils.copyProperties(list.get(0),notifyDTO);
}
return notifyDTO;
}
注: 多条件排序写法如下:
ReservationProductOrderDetailExample example = new ReservationProductOrderDetailExample();
example.setOrderByClause("`reservate_time` desc,`reservate_start_time` desc, `create_time` desc");
ReservationProductOrderDetailExample.Criteria criteria = example.createCriteria();
三. 查询limit, 只返回前50条数据
3.1 借助PageHelper
我们通过Pagehelper做分页查询,那么limit同样可以使用Pagehelper。如下,查询符合条件中的前50条。这里不会返回数据总数 count
PageHelper.startPage(1, 50);
public List<ShopCityInfoRespDTO> queryShopList(String shopCityName,String shopCityId) {
List<ShopCityInfoRespDTO> shopCityList = new ArrayList<>();
ShopInfoExample example = new ShopInfoExample();
ShopInfoExample.Criteria criteria = example.createCriteria();
criteria.andStatusEqualTo("0");
if(!StringUtils.isEmpty(shopCityId)) {
criteria.andShopIdEqualTo(shopCityId);
}
if(!StringUtils.isEmpty(shopCityName)) {
criteria.andShopNameLike("%" + shopCityName + "%");
}
// 这里限制查询50条数据,但不能返回总数
PageHelper.startPage(1, 50);
List<ShopInfo> shopInfoList = shopInfoMapper.selectByExample(example);
if(CollectionUtils.isEmpty(shopInfoList)){
return shopCityList;
}
for (ShopInfo shopInfo : shopInfoList){
ShopCityInfoRespDTO respDTO = new ShopCityInfoRespDTO();
respDTO.setCompanyId(shopInfo.getCompanyId());
respDTO.setShopCityId(shopInfo.getShopId());
respDTO.setShopCityName(shopInfo.getShopName());
respDTO.setShopCityCode(shopInfo.getShopCode());
respDTO.setShopType(1);
shopCityList.add(respDTO);
}
return shopCityList;
}
其它示例:均来自别的网站,以作方例实用时参考
1.按条件统计:
Example example = new Example(User.class);
//Criteria criteria = example.createCriteria();
example.createCriteria().andEqualTo("id", "1001" )
UserMapper.countByExample(example);
//等同于:select count(*) from user where id='1001'
2.查询:
(1)主键查询:selectByPrimaryKey
User user = UserMapper.selectByPrimaryKey("1001");
//等同于:select * from user where id = "1001"
(2)条件查询:selectByExample (and条件)
Example example = new Example(User.class);
example.createCriteria().andEqualTo("id", "1001" )
.andEqualTo("name", "小杨");
User user = UserMapper.selectByExample(example);
//等同于:select * from user where id = "1001" and name = '小杨'
selectByExample (or条件)
Example example = new Example(User.class);
example.or.andEqualTo("id", "1001" )
example.or.andEqualTo("name", "小杨");
User user = UserMapper.selectByExample(example);
//等同于:select * from user where id = "1001" or name = '小杨'
selectByExample (and+or多条件查询)
Example example = new Example(User.class);
example.createCriteria().andEqualTo("id", "1001" )
.andEqualTo("name", "小杨");
example.and().orEqualTo("age","18")
.orEqualTo("sex","1");
List<User> user = UserMapper.selectByExample(example);
//等同于:
SELECT id,user_id,user_name,pass_word FROM user WHERE ( id = "1001" and name= "小杨" ) and ( age= "18" or sex= "1" )
3.插入:
User user = new User();
user.setId("1002");
user.setAge("18");
user.setName("小王");
user.setSex("0")
UserMapper.insert(user);
//等同于:
insert into user(id,age,name,sex) values ('1002','18','小王','0');
4.更新:
(1)updateByPrimaryKeyimaryKey 按主键更新(会把没有设置的值设置为空)
User user = new User();
user.setId("1002");
user.setName("小王");
user.setAge("18");
user.setSex("0")
UserMapper.updateByPrimaryKey(user);
//等同于:update user set sex= "0" name='小王', age='18' where id='1002'
(2)updateByExampleSelective 按主键更新(不会把null 更新)
/*注意:updateByExample()更新所有的字段,包括字段为null的,建议使用 updateByExampleSelective()更新需要更新的字段*/
Example example = new Example(User.class);
example.createCriteria().andEqualTo("id","1002");
User user = new User();
user.setName("小王");
UserMapper.updateByExampleSelective(user,example);
//等同于:update user set Name='小王' where id='1002'
5.删除:
(1)deleteByPrimaryKey 按主键删除
UserMapper.deleteByPrimaryKey("1002");
//相当于:delete from user where id="1002"
(2)deleteByExample 按条件删除
Example example = new Example(User.class);
example.createCriteria().andEqualTo("name","小王");
UserMapper.deleteByExample(example);
//等同于:delete from user where name ='小王'
版权声明:本文为CSDN博主「leaf__yang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leaf__yang/article/details/125273086
MyBatis的Example类详解的更多相关文章
- 转载 Spring、Spring MVC、MyBatis整合文件配置详解
Spring.Spring MVC.MyBatis整合文件配置详解 使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. ...
- 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解
http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...
- idea spring+springmvc+mybatis环境配置整合详解
idea spring+springmvc+mybatis环境配置整合详解 1.配置整合前所需准备的环境: 1.1:jdk1.8 1.2:idea2017.1.5 1.3:Maven 3.5.2 2. ...
- Mybatis SQL映射文件详解
Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...
- Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解
封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
- java之StringBuffer类详解
StringBuffer 线程安全的可变字符序列. StringBuffer源码分析(JDK1.6): public final class StringBuffer extends Abstract ...
- java之AbstractStringBuilder类详解
目录 AbstractStringBuilder类 字段 构造器 方法 public abstract String toString() 扩充容量 void expandCapacity(in ...
- java之StringBuilder类详解
StringBuilder 非线程安全的可变字符序列 .该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍).如果可能,建议优先采用该类,因为在 ...
- Java String类详解
Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...
随机推荐
- 期盼已久全平台支持-开源IM项目OpenIM之uniapp更新
国内uniapp使用广泛,OpenIM的uniapp sdk以及文档和demo (https://github.com/OpenIMSDK/Open-IM-Uniapp-Demo)都已更新,本文主要展 ...
- vim 从嫌弃到依赖(13)——motion 进阶
在最开始的时候我们介绍了一些vim中的motion 包括如何在字符间.单词间.行间以及多行间移动.·但是motion中的内容可远不止我们介绍的这些,平时用到的也远不止之间介绍的那些. 之所以没有一次介 ...
- vue 动态路由刷新页面404
1.如果你的静态路由最后有如下代码: // 404 page must be placed at the end !!! { path: "*", redirect: " ...
- 从零开始搭建医药领域知识图谱实现智能问答与分析服务(含码源):含Neo4j基于垂直网站数据的医药知识图谱构建、医药知识图谱的自动问答等
从零开始搭建医药领域知识图谱实现智能问答与分析服务(含码源):含Neo4j基于垂直网站数据的医药知识图谱构建.医药知识图谱的自动问答等 项目介绍 关于知识图谱概念性的介绍就不在此赘述.目前知识图谱在各 ...
- 编译Nginx服务部署静态网站
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件 (IMAP/POP3) 代理服务器,并在一个BSD-like协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在 ...
- ajax中的同步异步和跨域请求
ajax中的同步异步和跨域请求 同步异步 demo.html <script> $.ajax({ type: "get", async: false, data: &q ...
- Linux RDP 会话中无法打开VSCode 解决办法
github issue: VS Code "and still" won't open in a Linux xrdp session Workaround- Linux RDP ...
- MarkDown书写语法(常用格式)
实际上每个 Markdown 应用程序都实现了稍有不同的 Markdown 语法,熟悉MarkDown书写语法常用格式,满足日常文字编辑需求 1.标题 请在单词或短语前面添加井号 (#) .# 的数量 ...
- 文心一言 VS 讯飞星火 VS chatgpt (193)-- 算法导论14.3 1题
一.用go语言,写出作用于区间树的结点且在 〇(1) 时间内更新 max 属性的过程 LEFT-ROTATE 的伪代码. 文心一言: 以下是一个简单的LEFT-ROTATE的伪代码,它对一个二叉搜索树 ...
- 《ASP.ENT Core 与 RESTful API 开发实战》(第3章)-- 读书笔记(下)
第 3 章 ASP.NET Core 核心特性 3.5 配置 要访问配置,需要使用 ConfigurationBinder 类,它实现了 IConfigurationBuilder 接口,该接口包括两 ...