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类详解的更多相关文章

  1. 转载 Spring、Spring MVC、MyBatis整合文件配置详解

    Spring.Spring MVC.MyBatis整合文件配置详解   使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. ...

  2. 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解

    http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...

  3. 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. ...

  4. Mybatis SQL映射文件详解

    Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...

  5. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

  6. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  7. java之StringBuffer类详解

    StringBuffer 线程安全的可变字符序列. StringBuffer源码分析(JDK1.6): public final class StringBuffer extends Abstract ...

  8. java之AbstractStringBuilder类详解

    目录 AbstractStringBuilder类 字段 构造器 方法   public abstract String toString() 扩充容量 void  expandCapacity(in ...

  9. java之StringBuilder类详解

    StringBuilder 非线程安全的可变字符序列 .该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍).如果可能,建议优先采用该类,因为在 ...

  10. Java String类详解

    Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...

随机推荐

  1. 期盼已久全平台支持-开源IM项目OpenIM之uniapp更新

    国内uniapp使用广泛,OpenIM的uniapp sdk以及文档和demo (https://github.com/OpenIMSDK/Open-IM-Uniapp-Demo)都已更新,本文主要展 ...

  2. vim 从嫌弃到依赖(13)——motion 进阶

    在最开始的时候我们介绍了一些vim中的motion 包括如何在字符间.单词间.行间以及多行间移动.·但是motion中的内容可远不止我们介绍的这些,平时用到的也远不止之间介绍的那些. 之所以没有一次介 ...

  3. vue 动态路由刷新页面404

    1.如果你的静态路由最后有如下代码: // 404 page must be placed at the end !!! { path: "*", redirect: " ...

  4. 从零开始搭建医药领域知识图谱实现智能问答与分析服务(含码源):含Neo4j基于垂直网站数据的医药知识图谱构建、医药知识图谱的自动问答等

    从零开始搭建医药领域知识图谱实现智能问答与分析服务(含码源):含Neo4j基于垂直网站数据的医药知识图谱构建.医药知识图谱的自动问答等 项目介绍 关于知识图谱概念性的介绍就不在此赘述.目前知识图谱在各 ...

  5. 编译Nginx服务部署静态网站

    Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件 (IMAP/POP3) 代理服务器,并在一个BSD-like协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在 ...

  6. ajax中的同步异步和跨域请求

    ajax中的同步异步和跨域请求 同步异步 demo.html <script> $.ajax({ type: "get", async: false, data: &q ...

  7. Linux RDP 会话中无法打开VSCode 解决办法

    github issue: VS Code "and still" won't open in a Linux xrdp session Workaround- Linux RDP ...

  8. MarkDown书写语法(常用格式)

    实际上每个 Markdown 应用程序都实现了稍有不同的 Markdown 语法,熟悉MarkDown书写语法常用格式,满足日常文字编辑需求 1.标题 请在单词或短语前面添加井号 (#) .# 的数量 ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (193)-- 算法导论14.3 1题

    一.用go语言,写出作用于区间树的结点且在 〇(1) 时间内更新 max 属性的过程 LEFT-ROTATE 的伪代码. 文心一言: 以下是一个简单的LEFT-ROTATE的伪代码,它对一个二叉搜索树 ...

  10. 《ASP.ENT Core 与 RESTful API 开发实战》(第3章)-- 读书笔记(下)

    第 3 章 ASP.NET Core 核心特性 3.5 配置 要访问配置,需要使用 ConfigurationBinder 类,它实现了 IConfigurationBuilder 接口,该接口包括两 ...