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);
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值