MyBatisPlus学习笔记【part2】

一、查询操作

1.通过多个id批量查询

调用selectBatchIds方法。

@Test
public void testSelect1(){List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));System.out.println(users);
}

2.简单的条件查询

通过map来封装查询条件,调用selectByMap方法。

注意:map中的key对应数据库中的列名。如:数据库user_id,实体类是userId,这时map的key需要填写数据库的user_id 。

@Test void testSelect2(){Map<String,Object> map = new HashMap<>();map.put("name","zhangsan7");map.put("age",18);List<User> users = userMapper.selectByMap(map);System.out.println(users);
}

3.分页查询

MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能。

第一步,配置类中添加分页插件。

@Configuration
@MapperScan(basePackages = "com.ichuang.swz.mapper")
public class MybatisPlusConfig {/** 分页插件*/@Beanpublic MybatisPlusInterceptor paginationInnerInterceptor(){MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mybatisPlusInterceptor;}
}

第二步,通过page对象获取相关数据。

@Test
public void testSelect3(){Page page = new Page(1,5);Page userPage = userMapper.selectPage(page, null); //返回对象得到所有分页数据long pages = userPage.getPages(); //总页数long pageCurrent = userPage.getCurrent(); //当前页List records = userPage.getRecords(); //查询出来的数据集合long total = userPage.getTotal(); //总记录数boolean hasNext = userPage.hasNext(); //是否有上一页boolean hasPrevious = userPage.hasPrevious(); //是否有上一页log.info("总页数{}页",String.valueOf(pages));log.info("当前页{}页",String.valueOf(pageCurrent));log.info("数据集------{}",String.valueOf(records));log.info("总记录数{}",String.valueOf(total));log.info("是否有下一页---{}",String.valueOf(hasNext));log.info("是否有上一页---{}",String.valueOf(hasPrevious));/*输出结果3-01-13 15:55:14.235  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 总页数2页2023-01-13 15:55:14.235  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 当前页1页2023-01-13 15:55:14.235  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 数据集------[User(id=1, name=Jone, age=18, email=test1@baomidou.com, createTime=null, updateTime=null, version=null), User(id=2, name=Jack, age=20, email=test2@baomidou.com, createTime=null, updateTime=null, version=null), User(id=3, name=Tom, age=28, email=test3@baomidou.com, createTime=null, updateTime=null, version=null), User(id=4, name=Sandy, age=21, email=test4@baomidou.com, createTime=null, updateTime=null, version=null), User(id=5, name=Billie, age=24, email=test5@baomidou.com, createTime=null, updateTime=null, version=null)]2023-01-13 15:55:14.235  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 总记录数82023-01-13 15:55:14.236  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 是否有下一页---true2023-01-13 15:55:14.236  INFO 13852 --- [           main] com.ichuang.swz.SwzApplicationTests      : 是否有上一页---false*/
}

分页查询也可以用 selectMapsPage方法 ,此时返回的结果集是Map类型,但使用情况较少。

二、删除操作

1.根据id删除

@Test
public void testDeleteById(){userMapper.deleteById(1613780561515573250L);
}

2.批量删除

根据存放id的集合进行批量删除。

@Test
public void testDeleteBatchIds() {userMapper.deleteBatchIds(Arrays.asList(1, 2, 3));
}

3.简单条件删除

通过map封装条件,来进行条件删除。

@Test
public void testDeleteByMap() {HashMap<String, Object> map = new HashMap<>();map.put("name", "zhangsan");map.put("age", 25);userMapper.deleteByMap(map);
}

4.逻辑删除

物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据。

逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录。

逻辑删除的使用场景:可以进行数据恢复,或有关联数据,不便直接删除。

MybatisPlus实现逻辑删除,第一步,在数据库中添加 deleted 字段。

ALTERTABLE `user` ADD COLUMN `deleted` boolean DEFAULT false

注:MySQL保存Boolean值时,用1代表TRUE,0代表FALSE,boolean类型在MySQL里的类型为tinyint(1)。

第二步,实体类中添加@TableLogic注解。

@TableLogic
private Integer delete;

第三步,application.properties 加入以下配置,此为默认值,如果你的默认值和mp默认的一样,该配置可无。

mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

第四步,单元测试。

测试后发现,数据并没有被删除,deleted字段的值由0变成了1。

注意:经过上面的配置,记录被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作。

@Test
public void testLogicDelete(){userMapper.deleteById(1613776095357759489L);
}

此时查询所有时,id为已不会被查到。

@Test
public void testLogicDeleteSelect() {List<User> users = userMapper.selectList(null);users.forEach(System.out::println);
}

三、条件构造器

1.Wrapper 条件构造抽象类

AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

​ QueryWrapper : 查询条件封装

​ UpdateWrapper : Update 条件封装

AbstractLambdaWrapper : 使用Lambda 语法

​ LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper

​ LambdaUpdateWrapper : Lambda 更新封装Wrapper

一般会使用Lambda的Wrapper,LambdaWrapper使用时用的是Lambda表达式来表示字段名,而Wrapper使用时需要我们自己填写String类型的字段名,容易写错。LambdaWrapper在编写代码时若字段名写错就会报红,而Wrapper不能,只能在编译时发现。

2.ge、gt、le、lt、isNull、isNotNul

代码如下。

@Test
public void testQuery1(){LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();queryWrapper.isNotNull(User::getName).gt(User::getAge,20);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

3.eq、ne

代码如下。其中selectOne方法只能返回一条记录,多余一条则抛出异常。

@Test
public void testQuery2(){LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();queryWrapper.eq(User::getName,"zhangsan");User user = userMapper.selectOne(queryWrapper);System.out.println(user);
}

4.between、notBetween

包含大小边界。selectCount方法返回的为记录数量。

@Test
public void testQuery3(){LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();queryWrapper.between(User::getAge,20,25);Integer count = userMapper.selectCount(queryWrapper);System.out.println(count);
}

5.like、notLike、likeLeft、likeRight

selectMaps方法返回Map集合列表,通常配合select方法使用。select方法选取列。

@Test
public void testQuery4(){LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();queryWrapper.select(User::getName,User::getAge).like(User::getName,"zhangsan").likeLeft(User::getEmail,"@qq.com");List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);maps.forEach(System.out::println);
}/*拼接出的sql语句
==>  Preparing: SELECT name,age FROM user WHERE deleted=0 AND (name LIKE ? AND email LIKE ?)
==> Parameters: %zhangsan%(String), %@qq.com(String)
*/
/* 输出的map集合
{name=zhangsan, age=30}
*/

6.orderBy、orderByDesc、orderByAsc

代码如下。

@Test
public void testQuery5(){LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();queryWrapper.orderByDesc(User::getAge,User::getName);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

7.查询方式速查

查询方式 说明
setSqlSelect 设置 SELECT 查询字段
where WHERE 语句,拼接 + WHERE 条件
and AND 语句,拼接 + AND 字段=值
andNew AND 语句,拼接 + AND (字段=值)
or OR 语句,拼接 + OR 字段=值
orNew OR 语句,拼接 + OR (字段=值)
eq 等于=
allEq 基于 map 内容等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于<
le 小于等于<=
like 模糊查询 LIKE
notLike 模糊查询 NOT LIKE
in IN 查询
notIn NOT IN 查询
isNull NULL 值查询
isNotNull IS NOT NULL
groupBy 分组 GROUP BY
having HAVING 关键词
orderBy 排序 ORDER BY
orderAsc ASC 排序 ORDER BY
orderDesc DESC 排序 ORDER BY
exists EXISTS 条件语句
notExists NOT EXISTS 条件语句
between BETWEEN 条件语句
notBetween NOT BETWEEN 条件语句
addFilter 自由拼接 SQL
last 拼接在最后,例如:last(“LIMIT 1”)

MyBatisPlus学习笔记【part2】相关推荐

  1. MyBatis-Plus 学习笔记

    MyBatis-Plus 学习笔记 学习官网: https://mp.baomidou.com/guide/ 一.快速入门 1.简介 MyBatis的增强工具,在Mybatis的基础上只做增强功能,兼 ...

  2. MyBatisPlus 学习笔记_MP的AR模式

    狂神说 MyBatisPlus 学习笔记 一.快速入门 文档:https://mp.baomidou.com/ 使用第三方组件: 导入对应依赖 研究依赖如何配置 代码如何编写 提高扩展技术能力 步骤: ...

  3. 《统计学:从数据到结论》学习笔记(part2)--总体是人们所关心的所有个体的集合

    学习笔记 学习书籍:<统计学:从数据到结论>-吴喜之: 参考书目:<统计学>-贾俊平 总体 如果我们想抽样调查马鞍山市民对于建地铁的观点,那么此时,单个马鞍山市民被称为调查的对 ...

  4. 【精简版】MyBatis-Plus学习笔记

    文章目录 1.前言 2.什么是MyBatis-Plus 3.MyBatis-Plus快速入门 3.1 准备工作 3.2 操作流程 3.2.1 根据user表创建实体类 3.2.2 创建Mapper接口 ...

  5. 《弗洛伊德及其后继者》学习笔记(part2)--自我心理学

    笔记 弗洛伊德在 1923年引入的结构模型,描述了更为复杂的心理世界,容纳着三个内部成分--本我.自我和超我--之间的争斗.按照这一模型,神经症是根本上敌对的三个部分之间无意识地做出的妥协形式:本我, ...

  6. 【cdq分治】cdq分治与整体二分学习笔记Part2.cdq分治

    上午的学习学会了整体二分,下午学了cdq分治 发现了二者的区别: 整体二分的主体是在不断地二分答案(把所有询问二分),而cdq分治则是在不断地二分操作. 当然同样的,cdq分治的复杂度也是与区间长度正 ...

  7. 【Mybatis-Plus 学习笔记】2、日志配置及常用 CRUD

    前言 上一篇文章中我们讲了 Mybatis-Plus 的定义以及相关特点,并从零开始编写了一个 SpringBoot + Mybatis-Plus 的实例.今天我们就来看看,如何利用 MP 来实现对数 ...

  8. Mybatis-plus学习笔记

    Mybatis-plus 一.介绍 1. 概述 官网:https://baomidou.com/ 解释:MyBatis-Plus(简称 MP)是一个MyBatis的一个插件 作用:在 MyBatis ...

  9. 14天学习训练营导师课程-Pygame学习笔记-Part2(第九艺术的召唤)

    14天学习训练营导师课程: 李宁<Python Pygame游戏开发入门与实战> 李宁<计算机视觉OpenCV Python项目实战>1 李宁<计算机视觉OpenCV P ...

最新文章

  1. 无线信号功率计算公式(自由空间模型,地面反射模型)
  2. 问题解决:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  3. JVM_04 对象的实例化+内存布局+访问定位+直接内存
  4. linux系统编程:自己动手写一个who命令
  5. ucosii中消息队列、消息邮箱、信号量的区别
  6. 苹果app商品定价_【知乎问答】苹果 App Store 新推出的 1 元或 3 元定价对开发者有什么影响?...
  7. OpenJudge NOI 1.7 30:字符环
  8. MyBatis框架 多表联合查询实现
  9. 5月8日——iOS中的3D Touch效果
  10. 创建精简的SharePoint页面
  11. 中国 AI 的“黄埔军校”?MSRA 被曝停招“国防七子”及北邮学生
  12. html跨行使用的属性,HTML表格标记详解4:TD参数中设定跨列跨行属性
  13. c++程序设计语言第四版pdf_寒假攻略 | 开启C语言自学模式
  14. Python2.6+PyQt4.8+eric4+汉化+开发教程
  15. iOS IPA包路径,分析百度统计崩溃日志
  16. 【CSS】span标签设置宽度
  17. 【云原生】SpringCloud系列之服务调用OpenFeign(基本概念和使用步骤)
  18. 微信无法定位 请打开定位服务器,微信定位是灰色的点不开是怎么回事?该怎么解决问题呢?...
  19. javascript能实现什么功能,如何开启javascript功能
  20. 基于Java+Springboot+Vue+elememt美食论坛平台设计实现

热门文章

  1. php实现 阿里云视频合成 (音频+视频+图片)
  2. ps如何切图成html页面,PhotoShop切片工具切割图片转成网页格式教程
  3. ROS_LOCALHOST_ONLY变量
  4. git报错:Permission denied (publickey).
  5. 在mac中使用numbers对数据进行分列
  6. C语言 qsort()函数详解 (笔记)
  7. 感受DataGrid给数据操作带来的便利(4)
  8. Oracle 11g 上安装ASM(RHEL5)
  9. 2021年化工自动化控制仪表考试题及化工自动化控制仪表新版试题
  10. 搜苹果ipad版_苹果测试无刘海 iPhone / 三星 S10 指纹支付功能被关停 / 天外世界评分解禁...