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. 初识Kubernetes(K8s):理论基础
  2. 在五分钟内学习使用Python进行类型转换
  3. c#实现SQLServer存储照片,并读取照片
  4. 黑苹果hidp显示不清楚_魔兽世界9.0:盟约指挥台不显示胜率?搞清楚机制,轻松收菜!...
  5. 被裁员 60%,以太坊大神忍不住要洗白了
  6. 令人困惑的strtotime
  7. ABB 机器人DH参数
  8. “智”在这里,图扑软件解码智慧选煤厂
  9. 移动警务综合应用平台(交警)解决方案
  10. ASP.net开发实践系列视频教程(总共53课) 天轰穿新的视频
  11. ArcGIS实验教程——实验二:ArcGIS地理配准完整操作步骤
  12. 【翻译】混沌网+SkyWalking:为混沌工程提供更好的可观察性
  13. mac软件拖到dock,重启后显示问号?,的解决方法
  14. 使用Java模拟登录
  15. 智能家居项目进度控制表
  16. 什么是深度学习?怎么学好深度学习?
  17. 一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。
  18. 这哥们儿的日志让我的心情好得一塌糊涂(ZZ)
  19. 【转载于庄卓然长微博】 阿里2013年双十一准备中的技术突破与亮点
  20. android实时视频方案,Android中实时视频监控方案设计思路

热门文章

  1. 【转载】如何写出低碳环保的 Android 代码
  2. nuc9vxqnx_英特尔® NUC 迷你电脑 9 专业套件 - NUC9VXQNX
  3. 手机搬家新手机便签内容被覆盖怎么解决
  4. Android Studo 真机调试连接 Mysql数据库
  5. 梦醒时分,身边却没有女人。
  6. 制表符(tab 键)的概念
  7. 你用的是苹果手机吗?那你怎么不知道苹果手机拍摄的这几个功能呢
  8. 【Android】用贝塞尔曲线画了一个碗
  9. 尤大在 Vue的生态进展中提到的 <style> 动态变量注入是啥?
  10. 某教程学习笔记(一):15、编辑器漏洞