MyBatisPlus学习笔记【part2】
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】相关推荐
- MyBatis-Plus 学习笔记
MyBatis-Plus 学习笔记 学习官网: https://mp.baomidou.com/guide/ 一.快速入门 1.简介 MyBatis的增强工具,在Mybatis的基础上只做增强功能,兼 ...
- MyBatisPlus 学习笔记_MP的AR模式
狂神说 MyBatisPlus 学习笔记 一.快速入门 文档:https://mp.baomidou.com/ 使用第三方组件: 导入对应依赖 研究依赖如何配置 代码如何编写 提高扩展技术能力 步骤: ...
- 《统计学:从数据到结论》学习笔记(part2)--总体是人们所关心的所有个体的集合
学习笔记 学习书籍:<统计学:从数据到结论>-吴喜之: 参考书目:<统计学>-贾俊平 总体 如果我们想抽样调查马鞍山市民对于建地铁的观点,那么此时,单个马鞍山市民被称为调查的对 ...
- 【精简版】MyBatis-Plus学习笔记
文章目录 1.前言 2.什么是MyBatis-Plus 3.MyBatis-Plus快速入门 3.1 准备工作 3.2 操作流程 3.2.1 根据user表创建实体类 3.2.2 创建Mapper接口 ...
- 《弗洛伊德及其后继者》学习笔记(part2)--自我心理学
笔记 弗洛伊德在 1923年引入的结构模型,描述了更为复杂的心理世界,容纳着三个内部成分--本我.自我和超我--之间的争斗.按照这一模型,神经症是根本上敌对的三个部分之间无意识地做出的妥协形式:本我, ...
- 【cdq分治】cdq分治与整体二分学习笔记Part2.cdq分治
上午的学习学会了整体二分,下午学了cdq分治 发现了二者的区别: 整体二分的主体是在不断地二分答案(把所有询问二分),而cdq分治则是在不断地二分操作. 当然同样的,cdq分治的复杂度也是与区间长度正 ...
- 【Mybatis-Plus 学习笔记】2、日志配置及常用 CRUD
前言 上一篇文章中我们讲了 Mybatis-Plus 的定义以及相关特点,并从零开始编写了一个 SpringBoot + Mybatis-Plus 的实例.今天我们就来看看,如何利用 MP 来实现对数 ...
- Mybatis-plus学习笔记
Mybatis-plus 一.介绍 1. 概述 官网:https://baomidou.com/ 解释:MyBatis-Plus(简称 MP)是一个MyBatis的一个插件 作用:在 MyBatis ...
- 14天学习训练营导师课程-Pygame学习笔记-Part2(第九艺术的召唤)
14天学习训练营导师课程: 李宁<Python Pygame游戏开发入门与实战> 李宁<计算机视觉OpenCV Python项目实战>1 李宁<计算机视觉OpenCV P ...
最新文章
- 无线信号功率计算公式(自由空间模型,地面反射模型)
- 问题解决:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
- JVM_04 对象的实例化+内存布局+访问定位+直接内存
- linux系统编程:自己动手写一个who命令
- ucosii中消息队列、消息邮箱、信号量的区别
- 苹果app商品定价_【知乎问答】苹果 App Store 新推出的 1 元或 3 元定价对开发者有什么影响?...
- OpenJudge NOI 1.7 30:字符环
- MyBatis框架 多表联合查询实现
- 5月8日——iOS中的3D Touch效果
- 创建精简的SharePoint页面
- 中国 AI 的“黄埔军校”?MSRA 被曝停招“国防七子”及北邮学生
- html跨行使用的属性,HTML表格标记详解4:TD参数中设定跨列跨行属性
- c++程序设计语言第四版pdf_寒假攻略 | 开启C语言自学模式
- Python2.6+PyQt4.8+eric4+汉化+开发教程
- iOS IPA包路径,分析百度统计崩溃日志
- 【CSS】span标签设置宽度
- 【云原生】SpringCloud系列之服务调用OpenFeign(基本概念和使用步骤)
- 微信无法定位 请打开定位服务器,微信定位是灰色的点不开是怎么回事?该怎么解决问题呢?...
- javascript能实现什么功能,如何开启javascript功能
- 基于Java+Springboot+Vue+elememt美食论坛平台设计实现
热门文章
- php实现 阿里云视频合成 (音频+视频+图片)
- ps如何切图成html页面,PhotoShop切片工具切割图片转成网页格式教程
- ROS_LOCALHOST_ONLY变量
- git报错:Permission denied (publickey).
- 在mac中使用numbers对数据进行分列
- C语言 qsort()函数详解 (笔记)
- 感受DataGrid给数据操作带来的便利(4)
- Oracle 11g 上安装ASM(RHEL5)
- 2021年化工自动化控制仪表考试题及化工自动化控制仪表新版试题
- 搜苹果ipad版_苹果测试无刘海 iPhone / 三星 S10 指纹支付功能被关停 / 天外世界评分解禁...