• MybatisPlus学习


    一.快速入门

    1.相关数据库创建

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

    2.Springboot工程创建

    3.相关配置

    application.propertise
    1. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    2. spring.datasource.url=jdbc:mysql://localhost:3307/mybatis_plus?severTimezone=GMT%2B8
    3. spring.datasource.username=root
    4. spring.datasource.password=123456
    依赖
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.   <modelVersion>4.0.0</modelVersion>
    5.   <parent>
    6.       <groupId>org.springframework.boot</groupId>
    7.       <artifactId>spring-boot-starter-parent</artifactId>
    8.       <version>2.6.6</version>
    9.       <relativePath/> <!-- lookup parent from repository -->
    10.   </parent>
    11.   <groupId>com.hjj</groupId>
    12.   <artifactId>onlearn_parent</artifactId>
    13.   <version>0.0.1-SNAPSHOT</version>
    14.   <name>onlearn_parent</name>
    15.   <description>onlearn_parent</description>
    16.   <properties>
    17.       <java.version>1.8</java.version>
    18.       <mybatis-plus.version>3.4.2</mybatis-plus.version>
    19.   </properties>
    20.   <dependencies>
    21.       <dependency>
    22.           <groupId>org.springframework.boot</groupId>
    23.           <artifactId>spring-boot-starter</artifactId>
    24.       </dependency>
    25.       <dependency>
    26.           <groupId>org.springframework.boot</groupId>
    27.           <artifactId>spring-boot-starter-test</artifactId>
    28.           <scope>test</scope>
    29.       </dependency>
    30.       <dependency>
    31.           <groupId>com.mysql</groupId>
    32.           <artifactId>mysql-connector-j</artifactId>
    33.           <version>8.0.33</version>
    34.           <scope>runtime</scope>
    35.       </dependency>
    36.       //记得装插件
    37.       <dependency>
    38.           <groupId>org.projectlombok</groupId>
    39.           <artifactId>lombok</artifactId>
    40.           <optional>true</optional>
    41.       </dependency>
    42.       <dependency>
    43.           <groupId>org.springframework.boot</groupId>
    44.           <artifactId>spring-boot-starter-test</artifactId>
    45.           <scope>test</scope>
    46.       </dependency>
    47. <!--       Mp:苞米谷-->
    48.       <dependency>
    49.           <groupId>com.baomidou</groupId>
    50.           <artifactId>mybatis-plus-boot-starter</artifactId>
    51.           <version>3.4.2</version>
    52.       </dependency>
    53.   </dependencies>
    54.   <build>
    55.       <plugins>
    56.           <plugin>
    57.               <groupId>org.springframework.boot</groupId>
    58.               <artifactId>spring-boot-maven-plugin</artifactId>
    59.               <configuration>
    60.                   <image>
    61.                       <builder>paketobuildpacks/builder-jammy-base:latest</builder>
    62.                   </image>
    63.               </configuration>
    64.           </plugin>
    65.       </plugins>
    66.   </build>
    67. </project>

    4.相关代码

    1.User实体类
    1. package com.hjj.onlearn_parent.entity;
    2. import lombok.Data;
    3. /**
    4. * @author:嘉佳 Date:2023/11/12 11:13
    5. **/
    6. @Data
    7. public class User {
    8.   private Long id;
    9.   private String name;
    10.   private Integer age;
    11.   private String email;
    12. }
    2.mapper接口
    1. package com.hjj.onlearn_parent.mapper;
    2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    3. import com.hjj.onlearn_parent.entity.User;
    4. import org.springframework.stereotype.Repository;
    5. /**
    6. * @author:嘉佳 Date:2023/11/12 11:14
    7. **/
    8. //不用写xml,mp已经封装,只要继承BaseMapper
    9. @Repository
    10. public interface UserMapper extends BaseMapper<User> {
    11. }
    3.springboot启动类
    1. @SpringBootApplication
    2. @MapperScan("com.hjj.onlearn_parent.mapper")//扫描mapper接口
    3. public class OnlearnParentApplication {
    4.   public static void main(String[] args) {
    5.       SpringApplication.run(OnlearnParentApplication.class, args);
    6.   }
    7. }
    4.测试类
    1. @SpringBootTest
    2. class OnlearnParentApplicationTests {
    3.   @Autowired
    4.   private UserMapper userMapper;
    5. //   查询user表所有
    6.   @Test
    7.   void findAll() {
    8.       List<User> users = userMapper.selectList(null);
    9.       System.out.println(users);
    10.   }
    11. }

    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.在配置类中配置分页插件(新版)

    1. //   分页插件
    2.     @Bean
    3.   public MybatisPlusInterceptor mybatisPlusInterceptor() {
    4.       MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    5.       interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    6.       return interceptor;
    7.   }

    2.编写分页代码

    • 1.创建page对象

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

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

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

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

    七.删除

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

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

    1.物理删除

    • 删除单条

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

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

    2.逻辑删除

    • 1.数据库添加deleted字段

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

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

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

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

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

    1.wrapper

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

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

    • 1.创建QueryWrapper对象

    • 2.通过QueryWrapper设置条件

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

  • 相关阅读:
    软件测试——从0开始的ios自动化测试(一)
    观测云产品更新|新增基础设施 YAML 显示;新增日志查看器 DQL 搜索模式;优化应用性能监测等
    安全设备
    OpenSSF 基金会总经理 Brian Behlendorf :预计 2026 年将有 4.2 亿个开源
    Java常见面试题-11-MongoDb
    JS 数组的操作
    fishhook原理
    LibGdx学习记录
    ubuntu设置初始的root密码
    【用unity实现100个游戏之10】复刻经典俄罗斯方块游戏
  • 原文地址:https://blog.csdn.net/GANTENJ/article/details/134474865