MybatisPlus Wrapper构造器(查询篇)

2024-02-06 18:20

本文主要是介绍MybatisPlus Wrapper构造器(查询篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

笔记:* 依赖MybatisPlus 3.5.5* 自动映射:a) 表名和实体类的映射 -> t_stu 表 Student 实体类:1.当表名和实体类名不一样的时候再实体类类名上加上@TableName注解@TableName("t_stu")2.也可以在配置文件中配置数据库表名的前缀,配置之后只要类名称与表名一致就无需@TableName注解mybatis-plus.global-config.db-config.table-prefix: tb_b) 字段名和实体类属性名(不是变量名,属性名是get/set方法中的setStuName中的StuName)的映射c) 字段名下划线命名方式和实体类属性小驼峰命名方式映射:mybatis-plus.configuration.map-underscore-to-camel-case: trued) 字段映射:1.字段名称与实体类属性名称不一致时,使用@TableField注解指定字段的名称即可完成封装@TableField(value= "XXX")2.字段失效,不希望该属性被查询,隐藏这个字段@TableField(select= false)e) 视图属性:有些字段不需要数据库存储,但需要展示,实体类中有这个有这个属性但数据库中不存在,叫视图属性。@TableField(exist = false)* 查询:(条件构造器、等值查询、范围查询、判断为空、包含查询、分组查询、聚合查询、排序查询、func查询、逻辑查询、自定义条件查询、last查询、exists查询、字段查询)1.条件构造器介绍(自己看源码):Wrapper、AbstractWrapper、AbstractLambdaWrapper、QueryWrapper、LambdaQueryWrapper:a) Wrapper抽象类、子类是AbstractWrapperb) AbstractWrapper抽象类、子类是AbstractLambdaWrapper、QueryWrapperc) AbstractLambdaWrapper抽象类、子类是LambdaQueryWrapperd) QueryWrapper(重点掌握)继承于AbstractWrapper,非抽象类,字符串方式表示字段,创建该类对象。继承AbstractWrappere) LambdaQueryWrapper(重点掌握)继承于AbstractLambdaWrapper,非抽象类,方法引用方式表示字段,创建该类对象2.等值(eq)/不等值(ne)查询:a) 单个等值条件查询:QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.eq("stu_name", "张三");LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();lambdaQueryWrapper.eq(Student::getStuName, "张三");* 如果传递参数的值为null,将不作为查询条件(当参数不为null的时候作为查询条件)lambdaQueryWrapper.eq("param" != null, Student::getStuName, null);b) 多个条件查询,再加一个eq(),或者使用allEq(Map)或者allEq(Map, false),后者设置false表示为null的字段舍弃,不进行查询。c) 范围查询:大于(gt): lambdaQueryWrapper.gt(Student::getStuAge, 18);大于等于(ge): lambdaQueryWrapper.ge(Student::getStuAge, 18);小于(lt): lambdaQueryWrapper.lt(Student::getStuAge, 18);小于等于(le): lambdaQueryWrapper.le(Student::getStuAge, 18);范围之间(between): lambdaQueryWrapper.between(Student::getStuAge, 18, 50);不在范围之间(notBetween): lambdaQueryWrapper.notBetween(Student::getStuAge, 18, 50);d) 模糊查询:like/notLike/likeLeft/likeRight/notLikeLeft/notLikeRight等lambdaQueryWrapper.like(Student::getStuName, "张");.......e) 判空查询:isNull/isNotNulllambdaQueryWrapper.isNull(Student::getStuName, "张");.....f) 包含查询: in/notIn/inSqlin/notIn:ArrayList<Integer> arrayList = new ArrayList<>();Collections.addAll(arrayList, 18,50,12);lambdaQueryWrapper.in(Student::getStuAge, arrayList);lambdaQueryWrapper.notIn(Student::getStuAge, arrayList);inSql: notInSql 反之ArrayList<Integer> arrayList = new ArrayList<>();Collections.addAll(arrayList, "18,50,13");demo1:lambdaQueryWrapper.inSql(Student::getStuAge, arrayList);demo2: 还可以传sql语句查询的结果lambdaQueryWrapper.inSql(Student::getStuAge, "select stu_age from t_stu where stu_age > 20");g) 分组查询:假设数据库的分组语句:select stu_sex,count(*) as sex_count from t_stu group by stu_sex;QueryWrapper queryWrapper = new QueryWrapper();// 指定分组的字段queryWrapper.groupBy("stu_sex");// 展示的字段queryWrapper.select("stu_sex,count(*) as sex_count");// 查询结果List<Map<String, Object>> list = studentMapper.selectMaps(queryWrapper);h) 聚合查询:假设数据库的分组语句(不能使用where):select stu_sex,count(*) as sex_count from t_stu group by stu_sex having sex_count > 3;QueryWrapper queryWrapper = new QueryWrapper();// 指定分组的字段queryWrapper.groupBy("stu_sex");// 展示的字段queryWrapper.select("stu_sex,count(*) as sex_count");// 聚合条件筛选queryWrapper.having("sex_count >3");// 查询结果List<Map<String, Object>> list = studentMapper.selectMaps(queryWrapper);i) 排序查询: asc/desc1.orderByAsc:LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();// 指定一个字段lambdaQueryWrapper.orderByAsc(Student::getStuAge);// 指定两个字段//lambdaQueryWrapper.orderByAsc(Student::getStuAge, Student::getId);studentMapper.selectList(lambdaQueryWrapper);2.orderByDesc ===> 同上 orderByAsc改为orderByDesc3.orderByorderBy(boolean condition, boolean isAsc, R column);a) condition – 执行条件,如果排序字段的值为null的时候, 是否还要作为排序字段b) isAsc – 是否是 ASC 排序c) column – 单个字段lambdaQueryWrapper.orderBy(true,true,Student::getStuAge);j) func查询:内嵌逻辑查询LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();// 拼接不同的查询条件lambdaQueryWrapper.func(studentLambdaQueryWrapper -> {// 根据自己实际情况来做判断if (true) {studentLambdaQueryWrapper.gt(Student::getStuAge, 30);} else {studentLambdaQueryWrapper.gt(Student::getStuAge, 10);}});studentMapper.selectList(lambdaQueryWrapper);k) 逻辑查询: and/ora) and逻辑查询,sql: select * from t_stu where stu_age > 10 and stu_age < 30;LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();lambdaQueryWrapper.gt(Student::getStuAge, 10).lt(Student::getStuAge, 30);studentMapper.selectList(lambdaQueryWrapper);b) and嵌套查询,sql: select * from t_stu where stu_sex = '女' and (stu_age> 18 or stu_age < 25);lambdaQueryWrapper.eq(Student::getStuSex, "女").and(studentLambdaQueryWrapper -> {studentLambdaQueryWrapper.gt(Student::getStuAge, 18).or().lt(Student::getStuAge, 25);});studentMapper.selectList(lambdaQueryWrapper);c) or逻辑查询:lambdaQueryWrapper.lt(Student::getStuAge, 30).or().gt(Student::getStuAge, 10);studentMapper.selectList(lambdaQueryWrapper);d) or内嵌套查询与and嵌套查询......e) nested逻辑查询: where后面拼接多个条件lambdaQueryWrapper.nested(i -> i.eq(Student::getStuName, "小舞").ne(Student::getStuAge, 40).eq(Student::getStuSex, "女"));拼接后的Sql: WHERE ((stu_name = ? AND stu_age <> ? AND stu_sex = ?))l) 自定义条件查询apply:直接写sql语句lambdaQueryWrapper.apply("id < 5");拼接后的Sql: WHERE (id < 5)m) last查询: 也是拼接字符串,拼接在SQL语句的最后面lambdaQueryWrapper.last("limit 0,3");拼接后的Sql: FROM t_stu limit 0,3n) exists查询:Sql: select * from t_stu where exists (select id from t_stu where stu_age = 1000);主查询: select * from t_stu子查询: (select id from t_stu where stu_age = 1000)当我们的子查询出的结果有值/结果集的时候,exists函数返回true,否者falseselect * from t_stu where true // 能讲所有数据查询出来select * from t_stu where false // 查询结果无数据1.exists函数返回的是boolean// 构建查询条件lambdaQueryWrapper.exists("select id from t_stu where stu_age = 18");拼接后的Sql: WHERE (EXISTS (select id from t_stu where stu_age = 18))2.notExists相反o) 字段查询:// select 查询要展示的字段lambdaQueryWrapper.select(Student::getId, Student::getStuAge,Student::getStuName);打印出的Sql: SELECT id,stu_age,stu_name FROM t_stu

分页

1.创建一个拦截器。给sql语句增加一个拦截器,然后把分页语句/参数拼接上去a) 创建mybatisPlus配置文件MybatisPlusConfig,在配置文件中添加分页插件// 官网 https://baomidou.com/pages/97710a/#%E6%94%AF%E6%8C%81%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;}b) 测试:方式一LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper<>();// 指定一个分页对象,包含对象的分页信息 IPage// long current 当前页, long size 每页显示条数// Page 是 IPage的接口实现类IPage<Student> studentPage = new Page<>(1, 3);// 执行查询IPage<Student> iPage = studentMapper.selectPage(studentPage, lambdaQueryWrapper);// 获取分页查询的信息System.out.println("当前页: " + iPage.getCurrent());System.out.println("每页显示的条数: " + iPage.getSize());System.out.println("总条数: " + iPage.getTotal());System.out.println("总页数: " + iPage.getPages());// 接受查询的结果List<Student> records = iPage.getRecords();records.forEach(i -> System.out.println(i));c) 测试:方式二1. Mapper层:// 自定义Sql查询IPage<Student> selectByStuName(IPage<Student> page, String stuName);2. XML:<select id="selectByStudentName" resultType="Student">select * from t_stu where stu_name = #{stuName}</select>3.运行:@Testvoid test02() {IPage<Student> studentPage = new Page<>(1,5);IPage<Student> iPage = studentMapper.selectByStudentName(studentPage, "安妮");List<Student> students = iPage.getRecords();students.forEach(i -> System.out.println(i));}

这篇关于MybatisPlus Wrapper构造器(查询篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/685153

相关文章

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

mybatisplus的逻辑删除过程

《mybatisplus的逻辑删除过程》:本文主要介绍mybatisplus的逻辑删除过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录myBATisplus的逻辑删除1、在配置文件中添加逻辑删除的字段2、在实体类上加上@TableLogic3、业务层正常删除即

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3