MybatisPlus学习

一.快速入门

1.相关数据库创建


  CREATE TABLE USER
  (
      id BIGINT(20) NOT NULL COMMENT '主键ID',
      NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
      age INT(11) NULL DEFAULT NULL COMMENT '年龄',
      email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
      PRIMARY KEY (id)
  );
  ​
  ​
  INSERT INTO USER (id, NAME, age, email) VALUES
  (1, 'Jone', 18, 'test1@baomidou.com'),
  (2, 'Jack', 20, 'test2@baomidou.com'),
  (3, 'Tom', 28, 'test3@baomidou.com'),
  (4, 'Sandy', 21, 'test4@baomidou.com'),
  (5, 'Billie', 24, 'test5@baomidou.com');

2.Springboot工程创建

3.相关配置

application.propertise

  spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  spring.datasource.url=jdbc:mysql://localhost:3307/mybatis_plus?severTimezone=GMT%2B8
  spring.datasource.username=root
  spring.datasource.password=123456
依赖
<?xml version="1.0" encoding="UTF-8"?>
  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>2.6.6</version>
          <relativePath/> <!-- lookup parent from repository -->
      </parent>
      <groupId>com.hjj</groupId>
      <artifactId>onlearn_parent</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>onlearn_parent</name>
      <description>onlearn_parent</description>
      <properties>
          <java.version>1.8</java.version>
          <mybatis-plus.version>3.4.2</mybatis-plus.version>
      </properties>
  ​
      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter</artifactId>
          </dependency>
  ​
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-test</artifactId>
              <scope>test</scope>
          </dependency>
  ​
          <dependency>
              <groupId>com.mysql</groupId>
              <artifactId>mysql-connector-j</artifactId>
              <version>8.0.33</version>
              <scope>runtime</scope>
          </dependency>
          //记得装插件
          <dependency>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
              <optional>true</optional>
          </dependency>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-test</artifactId>
              <scope>test</scope>
          </dependency>
  <!--        Mp:苞米谷-->
          <dependency>
              <groupId>com.baomidou</groupId>
              <artifactId>mybatis-plus-boot-starter</artifactId>
              <version>3.4.2</version>
  ​
          </dependency>
      </dependencies>
  ​
      <build>
          <plugins>
              <plugin>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-maven-plugin</artifactId>
                  <configuration>
                      <image>
                          <builder>paketobuildpacks/builder-jammy-base:latest</builder>
                      </image>
                  </configuration>
              </plugin>
          </plugins>
      </build>
  ​
  </project>

4.相关代码

1.User实体类
   package com.hjj.onlearn_parent.entity;
  ​
  import lombok.Data;
  ​
  /**
   * @author:嘉佳 Date:2023/11/12 11:13
   **/
  @Data
  public class User {
      private Long id;
      private String name;
      private Integer age;
      private String email;
  }
2.mapper接口
package com.hjj.onlearn_parent.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hjj.onlearn_parent.entity.User;
import org.springframework.stereotype.Repository;

/**
 * @author:嘉佳 Date:2023/11/12 11:14
 **/
//不用写xml,mp已经封装,只要继承BaseMapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
3.springboot启动类
@SpringBootApplication
  @MapperScan("com.hjj.onlearn_parent.mapper")//扫描mapper接口
  public class OnlearnParentApplication {
  ​
      public static void main(String[] args) {
          SpringApplication.run(OnlearnParentApplication.class, args);
      }
  ​
  }
4.测试类
 @SpringBootTest
  class OnlearnParentApplicationTests {
  ​
      @Autowired
      private UserMapper userMapper;
  ​
  //    查询user表所有
      @Test
      void findAll() {
          List<User> users = userMapper.selectList(null);
          System.out.println(users);
      }
  ​
  }

5.日志配置

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

二.主键生成策略

1.策略种类

策略介绍缺点
数据库自增长AUTO INCREMENT分表时需获取上张表id
UUID每次生成随机唯一值排序不便
Redis生成id
mp自带策略snowflake算法

2.设置主键生成策略

MyBatis-Plus中使用 @TableId(type = IdType.xxx ) 注解来标注使用哪种主键生成策略

  • AUTO: 自动增长

  • INPUT: 需要自行输入

  • ASSIGN_UUID: 自动生成随机唯一值

  • NONE: 不使用任何策略 也属于是自行输入

  • ASSIGN_ID: Mybatis-Plus自带策略 自动生成19为值

三.自动填充

步骤:

  • 1.在实体类中为要自动填充的属性加注解@TableFiled(fill=XX

    • FieldFill.INSERT 表示在插入操作时填充字段的值。

    • FieldFill.INSERT_UPDATE 表示在插入和更新操作时填充字段的值。

  • 2.创建一个类实现MetaObjectHandler接口

四.乐观锁

乐观锁:主要解决丢失更新问题丢失更新:多人同时修改同一条记录,最后提交的会把之前已经提交过的数据覆盖

解决方法:

  • 1 . 悲观锁:串行执行

  • 2.乐观锁: 添加version 使用版本号进行控制 比较数据与数据库中的版本号,版本号不同,不能进行更改

乐观锁的具:体实现:

  • 1.表中添加字段 作为乐观锁版本号

  • 2.对应实体类添加版本号属性和@Version注解

  • 3.在配置类中配置乐观锁插件

  
  //配置乐观锁插件
  @Configuration
  @MapperScan("com.hjj.onlearn_parent.mapper")//扫描mapper接口
  public class MpConfig {
      @Bean
      public MybatisPlusInterceptor mybatisPlusInterceptor() {
          MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
          mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
          return mybatisPlusInterceptor;
      }
  }
  • 乐观锁修改时要先查再改

  • 原因:当执行更新操作时,需要比较当前数据的版本信息与更新前获取的版本信息是否一致。如果没有查询操作,就无法知道其他线程是否已经修改了该数据。

五.mp简单查询

1.根据id查询

2.多个id批量查询

userMapper.selectBatchIds(Arrays.asList(x,x,...))

六.分页查询

1.在配置类中配置分页插件(新版)

//    分页插件
       @Bean
      public MybatisPlusInterceptor mybatisPlusInterceptor() {
          MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
          interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
          return interceptor;
      }

2.编写分页代码

  • 1.创建page对象

  • 2.调用mp分页查询方法,把分页数据封装到page中

  • //    分页查询
          @Test
          public void testPage(){
      //   1.创建page对象
      //      传入两个参数(当前页,每页显示记录数)
              Page<User> page = new Page<>(1, 3);
      //   2.调用mp分页查询方法,把分页数据封装到page中
      //          selectPage(分页对象,条件)
              userMapper.selectPage(page,null);
      }

3.通过page对象获取分页数据

  System.out.println(page.getCurrent());//当前页
  System.out.println(page.getRecords());//每页数据list集合
  System.out.println(page.getSize());//每页显示记录数
  System.out.println(page.getTotal());//总记录数
  System.out.println(page.getPages());//总页数
  System.out.println(page.hasNext());//是否有下一页
  System.out.println(page.hasPrevious());//是否有上一页

七.删除

物理删除:直接删除数据库中的记录

逻辑删除:使用标识符 表示记录已被删除,但是还存在于表中,逻辑删除的数据不能被查询,需要使用xml写复杂sql查询

1.物理删除

  • 删除单条

    //    简单删除
          @Test
          public void deleteById(){
              int result = userMapper.deleteById(1L);
              System.out.println(result);
          }
  • 删除多条

     //    批量删除
          @Test
          public void testDeleteByBatchIds(){
              int result = userMapper.deleteBatchIds(Arrays.asList(1, 2));
              System.out.println(result);
          }

2.逻辑删除

  • 1.数据库添加deleted字段

  • 2.实体类添加deleted字段并加上@TableLogin和 @TableField(fill = FieldFill.INSERT)注解

  • 3.新版无需添加逻辑删除插件

  • 底层:UPDATE user SET deleted=1 WHERE id=? AND deleted=0

  @TableLogic//标识逻辑删除字段
      @TableField(fill = FieldFill.INSERT)
      private Integer deleted;

八.Mybatis-Plus构造器查询 --复杂条件查询

1.wrapper

一般使用QueryWrapper进行mp复杂条件查询

2.QueryWrapper进行mp复杂条件查询

  • 1.创建QueryWrapper对象

  • 2.通过QueryWrapper设置条件

    @Test
        public void testSelectQuery(){
    //        创建QueryWrapper对象
            QueryWrapper<User> wrapper = new QueryWrapper<>();
    
    //        通过QueryWrapper设置条件
    //        ge、gt、le、lt   >=  >   <=  <
    //        查询age>=20记录
    //        第一个参数 字段名  第二个参数 设置值
    //        wrapper.ge("age",20);
    
    //        eq、ne 等于  不等于
    //        wrapper.eq("name","Tom");
    //        wrapper.ne("name","tom");
    
    //        between   范围查询
    //        wrapper.between("age",21,30);
    
    //        orderByDesc 降序排序
    //        wrapper.orderByDesc("id");
    
    //        like  模糊查询
    //        wrapper.like("name","吴");
    
    //        last  追加sql语句
    //        wrapper.last("limit 1");
    
    //        指定要查询的列
            wrapper.select("age","name");
    
            List<User> users = userMapper.selectList(wrapper);
            System.out.println(users);
        }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BUG:编写springboot单元测试,自动注入实体类报空指针异常

原因:修饰测试方法的Test注解导入错误 造成错误的原因是 import org.junit.Test;正确的应该是 import org.junit.jupiter.api.Test前者是Junit4,后者是Junit5 junit4的使用似乎要在测试类除了添加SpringbootTest还要添加RunWith(SpringRunner.class) 同时要注意spring-boot-s…

制作翻页电子相册,这个工具你必须了解!

电子相册作为一种很有纪念意义的载体&#xff0c;无论是生日、旅行、结婚、毕业纪念等等&#xff0c;可以应用在很多场合当中&#xff0c;如何制作呢&#xff1f; 而对于不会制作电子相册的人来说&#xff0c;使用套用模板是最直接快速的方式了。所以&#xff0c;推荐大家使用…

Find My充电宝|苹果Find My技术与充电宝结合,智能防丢,全球定位

充电宝是一种个人可随身携带&#xff0c;自身能储备电能&#xff0c;主要为手持式移动设备等消费电子产品&#xff08;例如无线电话、笔记本电脑&#xff09;充电的便携充电器&#xff0c;特别应用在没有外部电源供应的场合。其主要组成部分包括&#xff1a;用作电能存储的电池…

C++软件开发面试场景题

自己在秋招过程中遇到的一些场景题 海量数据N取Top K个元素&#xff0c;复杂度是多少 在处理海量数据中获取前K个元素&#xff08;Top K&#xff09;的问题中&#xff0c;通常会使用一些高效的算法来减少时间和空间复杂度。以下是两种常见的解决方案和它们的复杂度&#xff1…

LeetCode热题100——图论

图论 1. 岛屿的数量2. 腐烂的橘子 1. 岛屿的数量 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆…

PHP排序sort()、asort() 和 ksort() 的区别及用法

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

Centos(Linux)服务器安装Dotnet8 及 常见问题解决

1. 下载dotnet8 sdk 下载 .NET 8.0 SDK (v8.0.100) - Linux x64 Binaries 拿到 dotnet-sdk-8.0.100-linux-x64.tar.gz 文件 2. 把文件上传到 /usr/local/software 目录 mkdir -p /usr/local/software/dotnet8 把文件拷贝过去 mv dotnet-sdk-8.0.100-linux-x64.tar.gz /usr/loc…

多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 …

混沌系统在图像加密中的应用(基于哈密顿能量函数的混沌系统构造1.4)

混沌系统在图像加密中的应用&#xff08;基于哈密顿能量函数的混沌系统构造1.4&#xff09; 前言一、逆时间对称性分析二、具有逆时间对称性的单晶格状混沌与拟周期流1.逆时间对称性及哈密顿能量函数2.数值仿真 python代码 前言 续接混沌系统在图像加密中的应用&#xff08;基…

数据科学家应该知道的 10 个高级深度学习架构!

一、介绍 跟上深度学习的最新进展变得非常困难。几乎每天都会出现深度学习的新创新或新应用。然而&#xff0c;这些进步大部分都隐藏在 ArXiv / Springer 等媒体上发表的大量研究论文中。 本文包含深度学习的一些最新进展以及 keras 库中的实现代码。我还提供了…

批量替换WordPress文章内图片链接

在WordPress使用过程中&#xff0c;如果中途更换了域名&#xff0c;原先文章内的图片使用的是原来的域名&#xff0c;就会造成文章页里面的图片链接无法显示。如果从后台文章挨个修改就比较麻烦。可以通过数据库进行批量替换即可。 使用 PHPMyadmin 打开 数据库&#xff0c;登…

【DataV可视化工具详解】

文章目录 前言一、什么是DataV&#xff1f;二、主要特点1. 强大的图表库2. 灵活的数据接入3.实时数据展示4. 易于定制的仪表盘 三、应用场景1.业务监控与分析2.大屏展示3.数据洞察与决策支持 四、例图总结我是将军&#xff0c;我一直都在&#xff0c;。&#xff01; 前言 今天…

如何下载到正确版本的Steam?正确使用实现多开搬砖不被封号

各位游戏玩家们&#xff0c;你们是否也曾因为无法在Steam平台上正常下载游戏而感到烦恼呢&#xff1f;盗版问题已经严重影响了Steam的用户体验&#xff0c;也给玩家们带来了不必要的经济损失。但是&#xff0c;作为玩家&#xff0c;我们需要更多的方法来区分正版和盗版&#xf…

西南科技大学814考研一

C语言基础 字节大小 char&#xff1a;1 字节 unsigned char&#xff1a;1 字节 short&#xff1a;2 字节 unsigned short&#xff1a;2 字节 int&#xff1a;通常为 4 字节&#xff08;32 位平台&#xff09;或 8 字节&#xff08;64 位平台&#xff09; unsigned int&#x…

for,while,do-while,死循环,嵌套循环,跳转关键字,随机数

1.for循环 public class ForDemo1 {public static void main(String[] args) {for (int i 0; i < 5; i) {System.out.println("HelloWorld");}System.out.println("--------------------------------------------");for (int i 1; i <10 ; i) {Sy…

Linux基础知识(1)——目录结构,绝对/相对路径,指令等(配图)

目录 1.目录结构 2.路径 3.认识指令 文章内容并不聚焦于Linux命令&#xff0c;而是针对Linux的基础知识进行讲解&#xff0c;相信这部分知识更能帮助大家了解Linux系统。 本文只是带大家简单了解一下Linux的入门知识&#xff0c;在之后的文章中&#xff0c;我们将讲解Linux中…

三、程序员指南:数据平面开发套件

定时器库 定时器库为DPDK执行单元提供了定时器服务&#xff0c;以便异步执行回调函数。该库的特点包括&#xff1a; 定时器可以是周期性的&#xff08;多次触发&#xff09;或单次的&#xff08;一次性触发&#xff09;。定时器可以从一个核加载并在另一个核上执行。这必须在…

4.6 Windows驱动开发:内核遍历进程VAD结构体

在上一篇文章《内核中实现Dump进程转储》中我们实现了ARK工具的转存功能&#xff0c;本篇文章继续以内存为出发点介绍VAD结构&#xff0c;该结构的全程是Virtual Address Descriptor即虚拟地址描述符&#xff0c;VAD是一个AVL自平衡二叉树&#xff0c;树的每一个节点代表一段虚…

网络工程师沦为IT行业里的“二等公民”了?

大家好&#xff0c;我是老杨。 都说网工难&#xff0c;都说网工苦&#xff0c;都说网工行业已经不行了、网工成为最底层、“二等公民”&#xff0c;已经彻底没落了…… 这些在互联网里持续不断散发出来的负能量&#xff0c;有没有让你在深夜耍手机的时候一次又一次的扎心过&a…

提升工作效率,打造精细思维——OmniOutliner 5 Pro for Mac

在当今快节奏的工作环境中&#xff0c;如何高效地组织和管理我们的思维和任务成为了关键。而OmniOutliner 5 Pro for Mac正是为此而生的一款强大工具。无论你是专业写作者、项目经理还是学生&#xff0c;OmniOutliner 5 Pro for Mac都能帮助你提升工作效率&#xff0c;打造精细…