MybatisPlus知识

news2024/11/15 22:35:08

mybatis与mybatisplus的区别:

mybatisplus顾名思义时mybatis的升级版,提供了更多的API和方法,是基于mybatis框架基础上的升级,更加方便开发。mybatisplus继承BaseMapper接口并调用其中提供的方法来操作数据库,不需要再写mapper映射文件和sql语句。

一:基本入门案例

Dao层:

package com.itheima.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserDao extends BaseMapper<User> {
}

实体类:

        

package com.itheima.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;

//lombok

@Data
//指定表名(映射匹配兼容性)
@TableName("tbl_user")
public class User {
    private long id;
    private String name;
    //字段名和属性名不一致
    @TableField(value = "pwd")
    private String password;
    private Integer age;
    private String tel;
    //数据库中没有该字段不参与查询
    @TableField(exist = false)
    private Integer online;
}

 application.yml配置文件信息:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
    username: root
    password: root
    # 关闭日志
  main:
    banner-mode: off
# 开启mp的日志(输出到控制台可以得到sql语句)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#清除日志中多余的标志
  global-config:
    banner: false

logback.xml文件用于减少代码运行时的日志信息

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>

测试类:

@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {

    @Autowired
    private UserDao userDao;
    @Test
    void testSave(){
        User user=new User();
        user.setName("弗拉唐");
        user.setPassword("123456");
        user.setAge(20);
        user.setTel("123456789");
        userDao.insert(user);
    }
    @Test
    void testDelete(){
        userDao.deleteById(4);
    }

    @Test
    void testUpdate(){
        User user=new User();
        user.setId(3L);
        user.setPassword("654321");
        user.setName("李华");
        userDao.updateById(user);
    }
    @Test
    void testGetById(){
        User user = userDao.selectById(3);
        System.out.println(user);
    }
    @Test
    void testAll() {
        List<User> users = userDao.selectList(null);
        users.stream().forEach(System.out::println);
}

二:条件查询

@Test
    void testGetAll(){
        //按条件查询方式一:使用QueryWrapper
        QueryWrapper wrapper=new QueryWrapper();
        //查询18岁以下的人
        wrapper.lt("age",19);
        List list = userDao.selectList(wrapper);
        System.out.println(list );

        //按条件查询方式二:使用lambda表达式
        QueryWrapper<User> wrapper1=new QueryWrapper<User>();
        wrapper1.lambda().lt(User::getAge,20);
        List<User> users = userDao.selectList(wrapper1);
        System.out.println(users);

        //按条件查询方式三:使用
        LambdaQueryWrapper<User> lqw=new LambdaQueryWrapper<>();
        lqw.lt(User::getAge,20);
        List<User> users1 = userDao.selectList(lqw);
        System.out.println(users1);

        //多条件查询
        LambdaQueryWrapper<User> lqw1=new LambdaQueryWrapper<>();
        //and关系
//        lqw1.lt(User::getAge,20);
//        lqw1.gt(User::getAge,18);
        //or关系
        lqw1.lt(User::getAge,18).or().gt(User::getAge,20);
        List<User> users2 = userDao.selectList(lqw1);
        System.out.println(users2);

        //模拟页面传过来的数值
        UserQuery uq=new UserQuery();
        uq.setAge(18);
        uq.setAge2(20);
        //null值判定方法
        LambdaQueryWrapper<User> lqw2=new LambdaQueryWrapper<>();
        //添加参数判断是否为null,如果不为null,则添加该条件
        lqw2.lt(uq.getAge2()!=null,User::getAge,uq.getAge2());
        lqw2.gt(uq.getAge()!=null,User::getAge,uq.getAge());
        List<User> users4 = userDao.selectList(lqw2);
        System.out.println(users4);

//        查询投影(只显示某一些字段或者某一个字段)
        LambdaQueryWrapper<User> lqw3=new LambdaQueryWrapper<>();
        //只查询名字和年龄
        lqw3.select(User::getName,User::getAge);
        List<User> users5 = userDao.selectList(lqw3);
        System.out.println(users5);

//        查询数量和年龄统计
        QueryWrapper<User> qw=new QueryWrapper<>();
        qw.select("count(*) as count,age");
        qw.groupBy("age");
        List<Map<String, Object>> maps = userDao.selectMaps(qw);
        System.out.println(maps);

        //条件查询
        LambdaQueryWrapper<User> lqw4=new LambdaQueryWrapper<>();
        //等同于(登录验证)
        lqw4.eq(User::getName,"张三").eq(User::getPassword,"123");
        User loginuser = userDao.selectOne(lqw4);
        System.out.println(loginuser);

        //范围查询
        LambdaQueryWrapper<User> lqw5=new LambdaQueryWrapper<>();
        lqw5.between(User::getAge,18,20);
        List<User> users6 = userDao.selectList(lqw5);
        System.out.println(users6);

        //模糊匹配
        LambdaQueryWrapper<User> lqw6=new LambdaQueryWrapper<>();
        lqw6.like(User::getName,"三");
        //这里的额left或者right指的是前后模糊匹配,也就是百分号在左边还是右边
//        lqw6.likeLeft(User::getName,"三");
//        lqw6.likeRight(User::getName,"三");
        List<User> users7 = userDao.selectList(lqw6);
        System.out.println(users7);
    }

三:分页操作

分页拦截器:

定义一个Mp(mmybatisplus)拦截器,然后在里面设置具体的拦截器

package com.itheima.config;

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 MpConfig {
    @Bean
    public MybatisPlusInterceptor mpInterceptor(){
        //1.定义Mp拦截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2.添加具体的拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }
}

测试类:

@Test
    void testGetByPage(){
        //这里需要一个分页拦截器,否则数据还是会被全部打印
        IPage page = new Page(1,3);
        userDao.selectPage(page,null);
        System.out.println("当前页码"+page.getCurrent());
        System.out.println("一共多少页:"+page.getPages());
        System.out.println("一共多少条数据:"+page.getTotal());
        System.out.println("当前页数据:"+page.getRecords());
        System.out.println("每页显示数"+page.getSize());
    }

测试结果:

online为null是因为数据库中没有该字段

四:添加和删除操作:

//Id生成策略:自增,none不设置策略,Input手动添加,
// ASSIGN_ID雪花算法生成id,第一位占位符,接着41位时间戳,10位机器码,12位序列号,
// ASSIGN_UUID,UUID生成算法
package com.itheima.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;

//lombok

@Data
//指定表名(映射匹配兼容性)
@TableName("tbl_user")
public class User {
    //Id生成策略:自增,none不设置策略,Input手动添加,
    // ASSIGN_ID雪花算法生成id,第一位占位符,接着41位时间戳,10位机器码,12位序列号,
    // ASSIGN_UUID,UUID生成算法
    @TableId(type = IdType.AUTO)
    private long id;
    private String name;
    //字段名和属性名不一致
    @TableField(value = "pwd")
    private String password;
    private Integer age;
    private String tel;
    //数据库中没有该字段不参与查询
    @TableField(exist = false)
    private Integer online;
}

yml全局配置,简化代码

批量删除:

 @Test
    void testDelete(){
//        userDao.deleteById(4);
        List<Long> list = new ArrayList<>();
        list.add(1L);
        list.add(2L);
        userDao.deleteBatchIds(list);
    }

逻辑删除:

因为两个表的连接,可能会导致一个人的数据的删除,另一张表的数据也丢失或者说成为脏数据。

所以逻辑删除就是在字段中添加了一个标记,避免删除操作对业务的影响

全局配置

单个配置

五:更新操作中的乐观锁(修改操作中的并发现象):

乐观锁是为了防止同一条数据被多个线程争抢,原理时在执行更新操作的sql时添加一个字段version(示例),让版本号更新,那样其他的线程就会找不到这个数据。

这时候就需要使用mp中的拦截器

@Test
    void testUpdate(){
//        User user=new User();
//        user.setId(3L);
//        user.setVersion(1);
//        user.setPassword("654321");
//        user.setName("jack666");
//        userDao.updateById(user);


        //先通过id查询出该对象
        User user = userDao.selectById(3);
        User user1 = userDao.selectById(3);
        //将要求改的数据一起添加进去
        //模拟两个用户修改
        user1.setName("jack a");
        userDao.updateById(user1);//version+=1
        //此时下面的version找不到version=3就不会再执行成功
        user.setName("jack b");
        userDao.updateById(user);

    }

 

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

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

相关文章

利用飞书多维表格自动发布版本

文章目录 背景尝试1&#xff0c;轮询尝试2&#xff0c;长连接 背景 博主所在的部门比较奇特&#xff0c;每个车型每周都需要发版&#xff0c;所以实际上一周会发布好几个版本。经过之前使用流水线自动发版改造之后&#xff0c;发版的成本已经大大降低了&#xff0c;具体参考&a…

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述 随着人工智能技术的迅猛发展&#xff0c;多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型&#xff0c;融合了视觉与语言处理能力&#xff0c;旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域…

蓝桥杯每日真题 - 第7天

题目&#xff1a;&#xff08;爬山&#xff09; 题目描述&#xff08;X届 C&C B组X题&#xff09; 解题思路&#xff1a; 前缀和构造&#xff1a;为了高效地计算子数组的和&#xff0c;我们可以先构造前缀和数组 a&#xff0c;其中 a[i] 表示从第 1 个元素到第 i 个元素的…

家政服务小程序,家政行业数字化发展下的优势

今年以来&#xff0c;家政市场需求持续增长&#xff0c;市场规模达到了万亿级别&#xff0c;家政服务行业成为了热门行业之一&#xff01; 家政服务种类目前逐渐呈现了多样化&#xff0c;月嫂、保姆、做饭保洁、收纳、维修等家政种类不断出现&#xff0c;满足了居民日益增长的…

蓝桥杯每日真题 - 第12天

题目&#xff1a;&#xff08;数三角&#xff09; 题目描述&#xff08;14届 C&C B组E题&#xff09; 解题思路&#xff1a; 给定 n 个点的坐标&#xff0c;计算其中可以组成 等腰三角形 的三点组合数量。 核心条件&#xff1a;等腰三角形的定义是三角形的三条边中至少有…

Linux系统下svn新建目录

Linux安装svn自行查找 新建目录 新建一个自定义库的文件夹&#xff1a;mkdir security 使用svnadmin命令在新创建的目录中创建一个新的SVN版本库。例如&#xff1a; svnadmin create security 执行完成以上命令就会生成默认配置文件 通过pwd命令查找当前目录路径 路径&…

SpringCloud基础 入门级 学习SpringCloud 超详细(简单通俗易懂)

Spring Cloud 基础入门级学习 超详细&#xff08;简单通俗易懂&#xff09; 一、SpringCloud核心组件第一代&#xff1a;SpringCloud Netflix组件第二代&#xff1a;SpringCloud Alibaba组件SpringCloud原生组件 二、SpringCloud体系架构图三、理解分布式与集群分布式集群 四、…

性能调优专题(9)之从JDK源码级别解析JVM类加载机制

一、类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到JVM。 package com.tuling.jvm;public class Math {public static final int initData 666;public static User user new User();public int compute() {…

【全面系统性介绍】虚拟机VM中CentOS 7 安装和网络配置指南

一、CentOS 7下载源 华为源&#xff1a;https://mirrors.huaweicloud.com/centos/7/isos/x86_64/ 阿里云源&#xff1a;centos-vault-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 百度网盘源&#xff1a;https://pan.baidu.com/s/1MjFPWS2P2pIRMLA2ioDlVg?pwdfudi &…

「JVM详解」

JVM JVM概述 基本介绍 JVM&#xff1a;全称 Java Virtual Machine&#xff0c;即 Java 虚拟机&#xff0c;一种规范&#xff0c;本身是一个虚拟计算机&#xff0c;直接和操作系统进行交互&#xff0c;与硬件不直接交互&#xff0c;而操作系统可以帮我们完成和硬件进行交互的…

正点原子IMX6ULL--嵌入式Linux开发板学习中常用命令和笔记记录

学习路线图 传驱动文件 sudo cp chrdevbase.ko chrdevbaseApp /home/txj/linux/nfs/rootfs/lib/modules/4.1.15/ -f bootcmd setenv bootcmd tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000 setenv bootcmd tftp 80800000 zImag…

DVWA靶场通关——SQL Injection篇

一&#xff0c;Low难度下unionget字符串select注入 1&#xff0c;首先手工注入判断是否存在SQL注入漏洞&#xff0c;输入1 这是正常回显的结果&#xff0c;再键入1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for…

CSS回顾-基础知识详解

一、引言 在前端开发领域&#xff0c;CSS 曾是构建网页视觉效果的关键&#xff0c;与 HTML、JavaScript 一起打造精彩的网络世界。但随着组件库的大量涌现&#xff0c;我们亲手书写 CSS 样式的情况越来越少&#xff0c;CSS 基础知识也逐渐被我们遗忘。 现在&#xff0c;这种遗…

SSH和NFS

文章目录 SSH和NFS1 SSH远程管理1.1 概述1.2 ssh服务端和客户端1.3 用法1.3.1 服务器命令行的远程登录方式1.3.2 scp1.3.3 sftp1.3.4 ssh的密钥登录 2 NFS2.1 概述2.2 nfs操作步骤 SSH和NFS 1 SSH远程管理 1.1 概述 SSH&#xff08;Secure Shell&#xff09;协议是一种用于远…

Springboot 启动端口占用如何解决

Springboot 启动端口占用如何解决 1、报错信息如下 *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 9010 was already in use.Action:Identify and stop the process thats listening o…

SpringBoot 打造图片阅后即焚功能

阅后即焚”&#xff08;Snapchat-like feature&#xff09;是指一种社交媒体或信息传递功能&#xff0c;用户在阅读某条信息或查看某张图片后&#xff0c;该信息或图片会自动销毁&#xff0c;无法再次查看。这种功能的主要目的是保护用户的隐私和信息安全&#xff0c;防止敏感信…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析

前提&#xff1a; 注意的是&#xff1a;我们这里是从avframe转换成avpacket 后&#xff0c;从avpacket中查看NALU。 在实际开发中&#xff0c;我们有可能是从摄像头中拿到 RGB 或者 PCM&#xff0c;然后将pcm打包成avframe&#xff0c;然后将avframe转换成avpacket&#xff0…

Vue之插槽(slot)

插槽是vue中的一个非常强大且灵活的功能&#xff0c;在写组件时&#xff0c;可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽&#xff0c;可以极大提高组件的客服用和灵活性。 插槽大体可以分为三类&#xff1a;默认插槽&#xff0c;具名插槽和作用域插槽。 下面…

华为鸿蒙HarmonyOS NEXT升级HiCar:打造未来出行新体验

随着科技的不断进步&#xff0c;智能出行已成为我们生活中不可或缺的一部分。华为凭借其在智能科技领域的深厚积累&#xff0c;推出了全新的鸿蒙HarmonyOS NEXT系统&#xff0c;旨在为用户打造一个“人车家”的无缝协同出行体验。这一系统的核心亮点之一&#xff0c;就是其内置…

Clickhouse集群新建用户、授权以及remote权限问题

新建用户 create user if not exists user on cluster 集群名称 IDENTIFIED WITH plaintext_password BY 密码;给用户授查询、建表、删表的权限 GRANT create table,select,drop table ON 数据库实例.* TO user on cluster 集群名称 ;在其他节点下用户建本地表成功&#…