SpringBoot框架——8.MybatisPlus常见用法(常用注解+内置方法+分页查询)

1.MybatisPlus常用注解:

        1.1 当数据库、表名和字段名和实体类完全一致时无需加注解,不一致时:

        @TableName指定库名

        @TableId指定表名

        @TableField指定字段名

        1.2 自增主键:

        @TableId(type=IdType.AUTO)

        private Long id;

        1.3 实体类中属性不是表字段:

        @TableField(exist=false)

2.内置增删改查:

        这里如果加了@Data注解但无法生效,应该是没有安装Lombok插件,在plugin中添加即可

        2.1 增:

    @Testpublic void testInsert(){User user=new User();user.setName("lxj");user.setEmail("lxj@163.com");user.setAge(30);Assert.assertTrue(userMapper.insert(user)>0);userMapper.selectList(null).forEach(System.out::println);}

        2.1 删(3种方式):

    @Testpublic void testDelete(){//主键删除
//        userMapper.deleteById(1l);//长整型需添加l
//        userMapper.selectList(null).forEach(System.out::println);//批量删除//userMapper.delete(new QueryWrapper<User>().like("name","J"));//userMapper.delete(Wrappers.<User>query().like("name","J"));userMapper.delete(Wrappers.<User>query().lambda().like(User::getName,"J"));userMapper.selectList(null).forEach(System.out::println);}

        2.3 改:

        这里可以在实体类中添加@Accessors(chain=true)注解使set方法返回一个当前对象。

    @Testpublic void testUpdate(){//基本修改
//        userMapper.updateById(new User().setId(1l).setName("wayaya"));
//        userMapper.selectList(null).forEach(System.out::println);//批量修改
//        userMapper.update(null,Wrappers.<User>update().set("email","ppp@163.com").like("name","J"));
//        userMapper.selectList(null).forEach(System.out::println);//批量修改userMapper.update(new User().setEmail("ppp@163.com"),Wrappers.<User>update().like("name","J"));userMapper.selectList(null).forEach(System.out::println);}

        2.4 查(两种方式):

    @Testpublic void testSelectNew(){//System.out.println(userMapper.selectOne(Wrappers.<User>query().eq("name","Tom")));userMapper.selectList(new QueryWrapper<User>().select("id","name")).forEach(user -> {System.out.println(user);});}

3.分页

        原理一样都是通过分页拦截器,查询前先查询总行数,然后再查询当前页记录。

        先添加一个分页拦截器:MybatisPlusConfig

package com.lxj.quickstart.config;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true));//可优化1对1连接查询效率}
}

        3.1内置分页查询:

    @Testpublic void testPage(){IPage<User> page=new Page<>(2,2);IPage<User> pr = userMapper.selectPage(page, Wrappers.<User>query());System.out.println("总行数"+pr.getTotal());System.out.println("总页数"+pr.getPages());System.out.println("每页行数"+pr.getSize());pr.getRecords().forEach(user -> {System.out.println(user);});}

        3.2自定义xml分页查询:

        添加配置项:

    
#mybatisplus
mybatis-plus:type-aliases-package: com.lxj.quickstart.entity   #别名搜索mapper-locations: classpath:/mappers/*.xml         #加载映射文件

        添加xml查询:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.lxj.quickstart.mapper.UserMapper"><sql id="selectSql">SELECT*FROMuser</sql><select id="selectUserByPage" resultType="user"><include refid="selectSql"></include><where><if test="u.age != null">age = #{u.age}</if><if test="u.email != null">and email like '%${u.email}%'</if></where></select>
</mapper>

        添加mapper接口:

package com.lxj.quickstart.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.lxj.quickstart.entity.User;
import org.apache.ibatis.annotations.Param;public interface UserMapper extends BaseMapper<User> {//映射的接口中有2个参数需要@Param定义参数名,映射文件中使用p.和c.调用属性public IPage<User> selectUserByPage(@Param("p") IPage<User> page, @Param("u") User condition);}

        这里注意第二个参数’u‘必须和xml中的u一致。

        添加测试:

    @Testpublic void testPage2(){IPage<User> page=new Page<>(1,2);//条件对象User u=new User();u.setAge(18);u.setEmail("@163.com");IPage<User> pr = userMapper.selectUserByPage(page, u);System.out.println("总行数"+pr.getTotal());System.out.println("总页数"+pr.getPages());System.out.println("每页行数"+pr.getSize());pr.getRecords().forEach(user -> {System.out.println(user);});}

        3.3 pageHelper分页

        添加依赖:

        <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.11</version></dependency>

        添加拦截器:

    //两个分页插件不冲突@Beanpublic PageInterceptor pageInterceptor(){return  new PageInterceptor();}

        映射文件 :

<select id="selectUserByPage2" resultType="user"><include refid="selectSql"></include><where><if test="age != null">age = #{age}</if><if test="email != null">and email like '%${email}%'</if></where></select>

        映射文件对呀接口:

public List<User> selectUserByPage2(User condition);

        测试:

    @Testpublic void testPageHelper(){//条件对象User u=new User();u.setAge(18);u.setEmail("@163.com");PageInfo<User> page=PageHelper.startPage(1,2).doSelectPageInfo(()->{//映射文件userMapper.selectUserByPage2(u);//内置方法userMapper.selectList(Wrappers.<User>query());});List<User> list = page.getList();page.getList().forEach(System.out :: println);System.out.println("总行数"+page.getTotal());System.out.println("总页数"+page.getPages());System.out.println("每页行数"+page.getPageSize());System.out.println("当前页数"+page.getPageNum());System.out.println("起始行数"+page.getStartRow());System.out.println("每页行数"+page.getSize());System.out.println("是第一页"+page.isIsFirstPage());System.out.println("是最后一页"+page.isIsLastPage());System.out.println("有上一页"+page.isHasPreviousPage());System.out.println("有下一页"+page.isHasNextPage());System.out.println("页码列表"+Arrays.toString(page.getNavigatepageNums()));}

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

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

相关文章

2000-2022年各省人力资本水平数据(含原始数据+计算过程+计算结果)(无缺失)

2000-2022年各省人力资本水平数据&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;普通高等学校在校学生数(万人)、年末常住人口&#xff08;万人&#xff09;、人力资本水平 4、范…

CTFshow-PWN-前置基础(pwn20)

提交ctfshow{【.got表与.got.plt是否可写(可写为1&#xff0c;不可写为0)】,【.got的地址】,【.got.plt的地址】 前置基础知识&#xff1a; .got 和 .got.plt 是 ELF&#xff08;Executable and Linkable Format&#xff0c;可执行和可链接格式&#xff09;二进制文件中的两个…

(四)qt中使用ffmpeg播放视频,可暂停恢复

一、在qt中添加ffmpeg库及头文件 INCLUDEPATH /usr/local/ffmpeg/include LIBS -L/usr/local/lib -lavutil -lavcodec -lavformat -lswscale 二、详细代码 FFempegVideoDecode 视频解码类&#xff08;放入线程中&#xff09; ffmpegvideodecode.h #ifndef FFMPEGVIDEODE…

Qt | 自定义事件第三节

Qt | 事件第一节Qt | 事件第二节书接上回 六、自定义事件与事件的发送 1、发送事件由以下两个函数完成 static void QCoreApplication::postEvent (QObject* receiver, QEvent* event, int priority=Qt::NormalEventPriority);

RHCE作业二

一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 2.server主机的IP为&#xff1a; 172.25.254.100 3.server主机的时间为1984-11-11 11&#xff1a;11&#xff1a;11 4.配置server主机的时间同步服务要求可以被所有人使用 二.设定cli…

C++高级特性:可变长模板参数和折叠表达式(八)

1、可变长参数模板 可变长参数是C类模板编程中非常重要的一个东西&#xff0c;也是C11引入的新特性&#xff0c;通过使用…来表示参数长度不固定 可以通过sizeof…(args)获取传入参数的个数数量 &&表示万能引用&#xff0c;需要注意的是如果不使用万能引用&#xff0…

JVM基础面试题第一篇

目录 内存区域面试与分析 1.运行时数据区是什么 2.Java虚拟机栈的作用 3.本地方法栈的作用 4.堆的作用 5.方法区作用 6.运行时常量池的作用 7.直接内存是什么 8.内存溢出和内存泄漏的区别 9.栈溢出的原因 10.方法区溢出的原因 垃圾回收器与内存分配策略-面试与分析 …

LeetCode 49.字母异位词分组

目录 题目描述 方法一 思路&#xff1a; 代码&#xff1a; 题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", &qu…

Http 请求偶发400错误

1. 背景 生产环境偶发400请求错误&#xff0c;发生概率万分之一&#xff0c;异常信息如下&#xff1a; 1&#xff09; 从异常信息可以看到&#xff0c;skywalking的sw8 header解析失效导致异常信息。 2&#xff09; 0x0d0x0a 作为回车换行符号&#xff0c;没有被正确处理&#…

OpenGL:图元

OpenGL的图元 点 GL_POINTS: 将顶点绘制成单个的点 线 GL_LINES:将顶点用于创建线段,2个点成为一条单独的线段。如果顶点个数是奇数,则忽略最后一个。 顶点:v0, v1, v2, v3, … , vn,线段:v0-v1, v2-v3, v4-v5, … , vn-1 - vn GL_LINE_STRIP:将顶点用于创建线段,…

谈谈Python中的分布式计算和大数据处理

谈谈Python中的分布式计算和大数据处理 Python作为一种通用、解释型的高级编程语言&#xff0c;因其简洁易读、强大的库支持和广泛的应用领域&#xff0c;近年来在分布式计算和大数据处理领域也获得了显著的关注和应用。 分布式计算是一种计算方法&#xff0c;它将大型问题划…

学习笔记(4月18日)vector底层模拟实现(1)

1.迭代器 vector实际上是由迭代器进行维护的&#xff0c;关于迭代器是什么&#xff0c;为什么要叫这个名字&#xff0c;后面的学习会逐渐了解&#xff0c;现在先将迭代器是作为指针即可。 vector底层有三个迭代器&#xff0c;用来起到容量、数组头、元素个数的作用。 同时为…

带头节点的单链表练习(写加注释花了5小时,已废)

目录 1.test.c 2.LinList.c 3.LinList.h 1.test.c 单链表的操作 #include "LinList.h" //head->a0(头节点)->a1->...->ai->...->an int main() {SLNode* head;int i;DataType x, y;ListInitiate(&head);//初始化链表for (i 1; i < 11;…

基于XML配置bean(一)

文章目录 1.获取bean的两种方式1.通过id获取bean&#xff08;前面用过&#xff09;2.通过类型获取bean&#xff08;单例时使用&#xff09;1.案例2.代码1.beans.xml2.SpringBeanTest.java3.结果 3.注意事项 2.三种基本依赖注入方式1.通过属性配置bean&#xff08;前面用过&…

DDoS攻击趋势分析及防御建议:网络安全新挑战与应对策略

在数字化日益普及的今天&#xff0c;网络安全问题日益凸显。其中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击以其巨大的破坏力和难以防范的特性&#xff0c;发起简单、效果显著、难以追踪等特点&#xff0c;因此被黑客广泛使用&#xff0c;已经成为网络安全领…

Python(九十四)变量的作用域

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

CSS 设置空格原样显示 white-space:pre-wrap;

CSS 设置空格原样显示 问题描述 html 渲染内容时&#xff0c;对于 空格、回车、Tab 键的 默认处理方式是 &#xff1a; 无论存在多少个连续的空格&#xff0c;都只会保留一个。 结论 由于以上的特性&#xff0c;导致了我们无法直接渲染出原格式的文本。pre 标签 了解一下 &…

element-plus中的图标和文字水平对齐

<span><el-icon size"14px"><Delete /></el-icon> <span>删除</span> </span>解决方法&#xff1a;加上vertical-align: middle样式就可以了 <span><el-icon size"14px" style"vertical-align: …

【STM32CubeIDE 1.15.0】汉化包带路径配置过程

一、IDE软件下载 二、汉化版包路径 三、IDE软件板载汉化包 一、IDE软件下载 ST官网IDE下载链接 二、汉化版包路径 https://mirrors.ustc.edu.cn/eclipse/technology/babel/update-site/ 找不到就到.cn后面一级一级进 三、IDE软件板载汉化包 https://mirrors.ustc.edu…

数据库工具解析之 OceanBase 数据库导出工具

背景 大多数的数据库都配备了自己研发的导入导出工具&#xff0c;对于不同的使用者来说&#xff0c;这些工具能够发挥不一样的作用。例如&#xff1a;DBA可以使用导数工具进行逻辑备份恢复&#xff0c;开发者可以使用导数工具完成系统间的数据交换。这篇文章主要是为OceanBase…