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

news2025/1/16 15:40:46

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 增:

    @Test
    public 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种方式):

    @Test
    public 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方法返回一个当前对象。

    @Test
    public 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 查(两种方式):

    @Test
    public 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 {

    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true));//可优化1对1连接查询效率
    }
}

        3.1内置分页查询:

    @Test
    public 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
              *
        FROM
              user
    </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一致。

        添加测试:

    @Test
    public 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>

        添加拦截器:

    //两个分页插件不冲突
    @Bean
    public 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);

        测试:

    @Test
    public 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.coloradmin.cn/o/1623046.html

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

相关文章

【JAVA】java 中的Stream 常用函数

java 中的Stream 常用函数 一、简介1.1、什么是Stream&#xff1f;1.2、创建Stream1.3、Stream的特性 二、Stream的操作2.1、中间操作&#xff1a;2.2、终端操作&#xff1a;2.3、Stream的并行处理 三、Stream 常用函数四、使用示例4.1、计算集合中偶数的平方和&#xff1a;4.2…

新手也能学会的甘特图制作教程

甘特图是什么&#xff1f; 甘特图(Gantt Chart)是一种以图表形式直观展示项目计划的工具,由20世纪初的管理学家亨利甘特(Henry Gantt)发明并命名。它具有以下几个主要特点: 水平时间轴 甘特图的横轴是一条时间轴,通常按天、周或月来刻度,直观展示了项目从开始到结束的整个时间…

【信息收集】端口扫描masscan负载均衡识别lbd

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、什么是masscan masscan在kali系统上是自带的端口扫描…

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测 目录 回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测&#xff1b; 2.输入7个特征&#xf…

考研日常记录(upd 24.4.24)

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 文章目录 2024.4.18 周四课程情况&#xff1a;时间规划&#xff1a; 2024.4.19 周五课程情况&#xff1a;时间规划&#xff1a; 2024.4.20 周六2024.4.2…

Java知识总结---并发篇

线程 线程的状态 Java中线程可以有如下6中状态&#xff1a; NEW 新创建 RUNNABLE 可运行 BLOCKED 阻塞 WAITING 等待 TIMED WAITING 计时等待 TERMINATED 终止 线程的创建 &#xff08;1&#xff09;继承Thread类 public class ExtendsThread extends Thread { O…

学习Docker笔记

在23号刚刚学完新版本的docker还想说回去继续学习老版本的springcloud课程里面的docker 结果一看黑马首页新版本课程出了&#xff0c;绷不住了。以下是我学习新版本docker的笔记&#xff0c;记录了我学习过程遇到的各种bug和解决&#xff0c;也参考了黑马老师的笔记&#xff1a…

SLMs之Phi-3:Phi-3的简介、安装和使用方法、案例应用之详细攻略

SLMs之Phi-3&#xff1a;Phi-3的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年4月23日&#xff0c;微软发布Phi-3&#xff0c;这是微软推出的一款新的开源AI模型家族Phi-3。背景痛点&#xff1a;小语言模型(SLM)尽管规模不大&#xff0c;但在语言理解、代码…

three.js 制作卡牌正反面 旋转

1.效果图 2.代码 <template><div><div id"container"></div></div> </template><script> import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.…

C语言指针进阶:各类型指针变量详解

目录 1. 字符指针变量2. 数组指针变量2.1 什么是数组指针变量2.2 数组指针变量的初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 代码分析4.3.1 typedef 关键字 5. 函数指针数组6. 转移表 正文开始。 1. 字符指针变量 我们可以…

融合算法:引力融合

问题&#xff1a; 有一批数据&#xff0c;如&#xff1a; [ 1, 2, 3, 45, 46, 55, 89, 101 ]想把它分成3块&#xff0c;如&#xff1a; [1, 2, 3] [45, 46, 55] [89, 101]算法&#xff1a; 参考万有引力公式&#xff0c;想象坐标轴上这8个点的分布&#xff1a; 每一个点都会…

偏执型人格的症状和起因,偏执型人格测试和应对方法

偏执型人格&#xff0c;主打一个敏感多疑&#xff0c;过分的固执&#xff0c;过度的警觉。无论别人怎么解析&#xff0c;都难以说服。偏执型人格常常毫无根据的怀疑他人的忠诚&#xff08;动机&#xff09;&#xff0c;曲解别人的言语&#xff08;或行为&#xff09;&#xff0…

MySQL--表的操作

目录 创建表 查看表结构 修改表 新增列 修改列类型 修改列名 修改表名&#xff1a; 删除列 删除表 创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引…

数据结构 - 顺序表

一. 线性表的概念 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的…

分类算法——决策树(五)

认识决策树 决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-else结构&#xff0c;最早的决策树就是利用这类结构分割数据的一种分类学习方法。 决策树分类原理详解 为了更好理解决策树具体怎么分类的&#xff0c;通过一个问题例子&#xff1a; 问题…

每日OJ题_BFS解决拓扑排序③_力扣LCR 114. 火星词典

目录 力扣LCR 114. 火星词典 解析代码 力扣LCR 114. 火星词典 LCR 114. 火星词典 难度 困难 现有一种使用英语字母的外星文语言&#xff0c;这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words &#xff0c;作为这门语言的词典&#xff0c;words 中的字符串已…

[Java EE] 多线程(三):线程安全问题(上)

1. 线程安全 1.1 线程安全的概念 如果多线程环境下代码运行的结果不符合我们的预期,则我们说存在线程安全问题,即程序存在bug,反之,不存在线程安全问题. 1.2 线程不安全的原因 我们下面举出一个线程不安全的例子:我们想要在两个线程中对count进行操作 public class Demo9 …

RC电路延时时间常数在线计算器

RC电路延时时间常数在线计算器: https://www.838dz.com/calculator/1888.html 急用时&#xff0c;找不到。

后端通过@jsonformat格式化数据转发,前端无法正确显示

后端发送给前端的updatatime是有格式的 后端接收的数据没有任何变化&#xff0c;前端代码也很正常 显示时间也乱码 原因应该是某个注释和jsonformat冲突了&#xff0c;所幸就不用jesonformat 用手动配置的消息转换器 // 消息转换器&#xff0c;后端返回给前端数据格式化Overri…

用斐波那契数列感受算法的神奇(21亿耗时0.02毫秒)

目录 一、回顾斐波那契数列 二、简单递归方法 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;代码展示 &#xff08;三&#xff09;性能分析 三、采用递归HashMap缓存 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;代码展示 &…