基于SpringBoot的SSMP整合案例(开启日志与分页查询条件查询功能实现)

news2024/10/7 8:26:45

开启事务

导入Mybatis-Plus框架后,我们可以使用Mybatis-Plus自带的事务,只需要在配置文件中配置即可
使用配置方式开启日志,设置日志输出方式为标准输出
mybatis-plus:
  global-config:
    db-config:
      table-prefix: tb_
      id-type: auto
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
只有最后一行有用

数据层开发-分页功能

分页操作需要设定分页对象IPage,Page第一个参数当前页码值,第二个是每一页中条数
@Test
    void testPage(){
        IPage page = new Page(2,2);
        bookDao.selectPage(page,null);
        System.out.println(page.getRecords());
    }
IPage对象中封装了分页操作中的所有数据
	 数据
	 当前页码值
	 每页数据总量
	 最大页码值
	 数据总量

这样就直接实现分页了吗?
答案是否定的

分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,
因此需要增强对应的功能,使用MyBatisPlus拦截器实现
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}
执行测试代码
@Test
    void testPage(){
        IPage page = new Page(1,2);
        bookDao.selectPage(page,null);
        System.out.println(page.getRecords());
    }

在这里插入图片描述
可以看出执行了两次查询,第一次执行的查询获取了总条数,为下面的分页做准备

数据层开发-条件查询功能

上面的分页查询中 bookDao.selectPage(page,null);
第二个参数赋成null,你可能好奇它的功能是什么,那里是用来放条件对象QueryWrapper的。

QueryWrapper解析
QueryWrapper 是 MyBatis-Plus 的一个核心功能,它是用来构造 SQL 查询语句的。MyBatis-Plus 是一款 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
QueryWrapper 主要提供了以下几个功能:
链式调用: QueryWrapper 支持链式调用,使得代码更加简洁易读。
条件构造器: QueryWrapper 提供了丰富的条件构造方法,如 eq (等于)、ne (不等于)、gt (大于)、ge (大于等于)、lt (小于)、le (小于等于) 等。
SQL函数支持: QueryWrapper 支持 SQL 函数,比如 count、sum、avg 等。
子查询支持: QueryWrapper 支持子查询,可以在查询条件中嵌套子查询。
排序支持: QueryWrapper 支持 orderBy 方法进行排序。

下面是一个事例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三")
            .ne("age", 20)
            .like("email", "test")
            .orderByAsc("age");

等价于SQL语句
SELECT * FROM user WHERE name = '张三' AND age != 20 AND email LIKE '%test%' ORDER BY age ASC;
了解完基础知识点,下面是实际使用
@Test
    void testGetBy(){
        QueryWrapper<Book> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("name","Spring");
        List list = bookDao.selectList(queryWrapper);
    }
执行结果

在这里插入图片描述

缺点:有的时候我们可能会打错,比如将name打成了nmae,有没有什么可以解决呢?有LambdaQueryWrapper。

LambdaQueryWrapper 是 MyBatis-Plus 提供的一个查询条件构造器,它是 QueryWrapper 的一个变种,主要使用 Java 8 的 Lambda 表达式语法。
LambdaQueryWrapper 提供了与 QueryWrapper 类似的功能,包括链式调用、条件构造器、SQL函数支持、子查询支持、排序支持等。
相比于 QueryWrapper,LambdaQueryWrapper 的主要优点在于:
类型安全:LambdaQueryWrapper 使用了 Java 8 的 Lambda 表达式,使得其具有类型安全的特性。你可以在编译时检查到类型错误,而 QueryWrapper 在编译时无法检查到类型错误,只能在运行时通过抛出异常来发现错误。
代码可读性更强:由于使用了 Lambda 表达式,LambdaQueryWrapper 的代码可读性更强。你可以直接看到正在操作的是哪个字段,而不需要通过字符串来指定字段名,这样也避免了因为字段名拼写错误导致的问题。

例如,我们可以使用 LambdaQueryWrapper 构造如下的查询语句:
LambdaQueryWrapper<User> lambdaQuery = new QueryWrapper<User>().lambda();
lambdaQuery.eq(User::getName, "张三")
           .ne(User::getAge, 20)
           .like(User::getEmail, "test")
           .orderByAsc(User::getAge);

等价于SQL语句
SELECT * FROM user WHERE name = '张三' AND age != 20 AND email LIKE '%test%' ORDER BY age ASC;
User::getName 表示字段名是 "name",其他的类推,这样我们就不会因为因为不小心而出错了。
实战如下
@Test
    void testGetBy2(){
        LambdaQueryWrapper<Book> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(Book::getName,"Spring");
        List list = bookDao.selectList(queryWrapper);
    }
执行结果如下

在这里插入图片描述

仅学习记录,如有错误欢迎指正~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1196367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【黑客】最适合小白的学习顺序

一、黑客是什么 原是指热心于计算机技术&#xff0c;水平高超的电脑专家&#xff0c;尤其是程序设计人员。但后来&#xff0c;黑客一词已被用于泛指那些专门利用电脑网络搞破坏或者恶作剧的家伙。 二、学习黑客技术的原因 其实&#xff0c;网络信息空间安全已经成为海陆空之…

Python基础教程:类--继承和方法的重写

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 什么是继承 继承就是让类与类之间产生父子关系&#xff0c;子类可以拥有父类的静态属性和方法 继承就是可以获取到另一个类中的静态属性和普通方法&#xff08;并非所有成员&#xff09; 在python中&#xff0c;新建的类可…

【紫光同创国产FPGA教程】——【PGL22G第十一章】以太网传输实验例程

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注www.meyesemi.com) 适用于板卡型号&#xff1a; 紫光同创PGL22G开发平台&#xff08;盘古22K&#xff09; 一&#xff1a;盘古22K开发板&#xff08;紫光…

建筑能源管理(9)——公共建筑能源管理技术

现阶段&#xff0c;在我国经济高速发展的同时&#xff0c;也面临着资源有限、能源消费急剧增长、能源供给与需求之间的矛盾日益突出等问题。数据显示&#xff0c;现阶段我国单位GDP的能耗水平是发达国家的3倍左右&#xff0c;这正是能源总体利用率较低所造成的。建筑能耗作为我…

2023年初学者入门 CV 指南概述

计算机视觉&#xff0c;是一个迅速发展的领域&#xff0c;将让你大开眼界。它的核心是教计算机像我们人类一样看和理解视觉信息。这份全面指南&#xff0c;将为我们揭示计算机视觉的基本概念&#xff0c;探索流行的应用程序&#xff0c;并瞥见计算机视觉的未来趋势。 计算机视觉…

FM8317-USB TYPE-C PD 多协议控制器

产品描述&#xff1a; FM8317是一款集成了USB Type-C、USB Power Delivery&#xff08;PD3.0&#xff09;、PPS的多协议端口控制器&#xff0c;为AC-DC适配器、车载充电器等设备提供高性价比的USB Type-C 端口充电解决方案。 FM8317内置的Type-C协议可以支持Type-C设备插入自动…

SparkAi创作系统ChatGPT网站源码+详细搭建部署教程+AI绘画系统+支持GPT4.0+Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

Leetcode-145 二叉树的后序遍历

递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this…

字节和美团软件测试面试1000问(含文档)

一、Linux系统应用和环境配置 1、Linux系统的操作命令给我说10个&#xff0c;一般用什么工具远程连接Linux服务器&#xff1f; 2、Linux中的日志存储在哪里&#xff1f;怎么查看日志内容&#xff1f; 3、Linux中top和ps命令的区别&#xff1f; 4、Linux命令运行的结果如何写…

iOS 17.2更新:15Pro支持拍摄空间视频!

苹果又为开发者预览版用户推送了iOS 17.2 Beta2测试版的更新&#xff0c;已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为750M左右&#xff0c;内部版本号为&#xff08;21C5040g&#xff09;&#…

c语言,将奇数和偶数分类

题目&#xff1a;输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 思路&#xff1a;像冒泡排序那样&#xff0c;相邻两个数比较&#xff0c;两个都是偶数则不…

(免费版?)CLion Nova 强势登陆 C 和 C++ 开发领域

系列文章目录 文章目录 系列文章目录前言一、CLion Nova二、目标三、优势和改进四、显著差异五、如何安装 CLion Nova六、分享您的反馈意见总结 阿纳斯塔西娅-卡扎科娃 2023 年 11 月 9 日 前言 今天&#xff0c;我们宣布推出免费的 CLion 早期预览版&#xff0c;它使用 ReSh…

【Linux】Linux 中关于文件和文件夹的常用命令

Linux 中关于文件和文件夹的常用命令 讲解 Linux 常用命令的文章已经非常多了&#xff0c;而且有的文章也说的非常清楚详细。我们可能不会记住所有的命令&#xff0c;但对于工作中常用的命令应该熟记于心&#xff0c;最好的方式就是多多实践。 我们可以直接或者通过虚机的方式…

24 _ 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?

上一节我们学习了树、二叉树以及二叉树的遍历,今天我们再来学习一种特殊的二叉树,二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。 我们之前说过,散列表也是支持这些操作的,并且散列表的这些操作比二叉查找树更高效,时间复杂度是O(…

Leetcode-101 对称二叉树

递归&#xff1a;主要思想&#xff1a;对称二叉树是左子树的左孩子右子树的右孩子&#xff0c;左子树的右孩子右子树的左孩子&#xff0c;递归实现思路较为清晰 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* Tr…

同城跑腿服务预约小程序的作用如何

无论是互联网服务化加快还是前几年疫情冲击&#xff0c;在同城生活服务场景中出现了很多商机&#xff0c;如外卖跑腿、校园跑腿、代买代送等&#xff0c;无论公司还是个人都借势不断提升自己品牌的影响力&#xff0c;并且依赖朋友圈不断提升生意营收。 同城跑腿品牌不少&#…

跨域:利用iframe实现跨域DOM互访的四种方式

注&#xff1a;跨域的知识点详见&#xff1a;跨域相关知识点 目录 实验验证环境配置&#xff1a; 1、利用document.domain降域 方法1&#xff1a; 方法2&#xff1a; 2、利用location.hash 3、利用window.name 4、利用postMessage(最推荐) 使用postmessage实现跨域访问…

linux发展史(必看系列)

Linux介绍&#xff1a; Linux&#xff0c;Linux Is Not UniX 的首字母缩写。是一款开源的&#xff0c;能自由传播的类Unix的操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到…

表格图片太大怎么批量压缩?最简单的批量压缩图片

我们在给表格添加图片的时候&#xff0c;如果体积太大&#xff0c;就会导致图片导入不进去&#xff0c;所以在使用之前最好是选择将图片压缩&#xff0c;有的小伙伴会说几张图片处理起来比较方便&#xff0c;如果是大量的话&#xff0c;就比较废时间了&#xff1b;所以今天就特…

贪心

【深基12.例1】部分背包问题 题目描述 阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N ( N ≤ 100 ) N(N \le 100) N(N≤100) 堆金币&#xff0c;第 i i i 堆金币的总重量和总价值分别是 m i , v i ( 1 ≤ m i , v i ≤ 100 ) m_i,v_i(1\le m_i,v_i \le 100) mi​,vi​(…