MyBatisPlus——基础入门

目录

一、Mybatis-plus概述

1、简介

2、特性

3、支持数据库

4、框架结构

二、Mybatis-plus快速上手

1、创建Maven工程

2、pom.xml 引⼊ MyBatis Plus 的依赖

3、创建实体类

4、创建Mapper接口

5、配置application.yml文件中的数据库链接

6、启动类需要添加 @MapperScan("mapper所在的包"),否则⽆法加载 Mppaer bean。

7、测试

8、结果

三、Mybatis-plus常用注解

1、@TableName

2、@TableId

3、@TableField

4、@Version

5、@EnumValue

6、@TableLogic


一、Mybatis-plus概述

1、简介

(1)MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。我们可以理解为它已经封装好了一些 CRUD 方法,我们不需要再写 xml 了,直接调用对应的CRUD的方法就行。

 (2)官网愿景

2、特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

3、支持数据库

  • mysql 、 mariadb 、 oracle 、 db2 、 h2 、 hsql 、 sqlite 、 postgresql 、 sqlserver 、 presto
  • 达梦数据库 、 虚谷数据库 、 人大金仓数据库

4、框架结构

framework

二、Mybatis-plus快速上手

Spring Boot(2.5.4) + MyBatis Plus(国产的开源框架,并没有接⼊到 Spring 官⽅孵化器中)

1、创建Maven工程

2、pom.xml 引⼊ MyBatis Plus 的依赖

<!-- MyBatis-Plus依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1.tmp</version>
</dependency>

(如果不是新建的工程的话需要引入新的依赖)

<!-- MyBatis-Plus依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1</version>
</dependency>
 
<!-- 数据库驱动依赖 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
 
<!-- 数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.9</version>
</dependency>
 
<!-- Lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

3、创建实体类

package com.exerciseitems.mybatisplus.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.exerciseitems.mybatisplus.enums.AgeEnum;
import com.exerciseitems.mybatisplus.enums.StatusEnum;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : User
 * @description : [描述说明该类的功能]
 * @createTime : [2021/9/11 20:45]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2021/9/11 20:45]
 * @updateRemark : [描述说明本次修改内容]
 */
@Data
@TableName("user")
@Accessors(chain = true) //访问器允许链式操作
public class User {
    private String id;
    private String name;
    private Integer age;
    private String gender;
}

4、创建Mapper接口

package com.exerciseitems.mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.exerciseitems.mybatisplus.entity.User;

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : UserMapper
 * @description : [描述说明该类的功能]
 * @createTime : [2021/9/11 20:48]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2021/9/11 20:48]
 * @updateRemark : [描述说明本次修改内容]
 */

public interface UserMapper extends BaseMapper<User> {
}

5、配置application.yml文件中的数据库链接

spring:
 datasource:
   driver-class-name: com.mysql.cj.jdbc.Driver
   url: jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8
   username: root
   password: 123456
   mybatis-plus:
    configuration: 
    log-impl: 
     org.apache.ibatis.logging.stdout.StdOutImpl

6、启动类需要添加 @MapperScan("mapper所在的包"),否则⽆法加载 Mppaer bean。

package com.exerciseitems.mybatisplus;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.exerciseitems.mybatisplus.mapper")
public class MybatisplusApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisplusApplication.class, args);
    }

}

7、测试

package com.exerciseitems.mybatisplus;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class MybatisplusApplicationTests {

    @Autowired
    private UserMapper mapper;

    /*
     * @version V1.0 
     * Title: test
     * @author LiuYanQiang 
     * @description 测试
     * @createTime  2021/9/18 11:51
     * @param [] 
     * @return void*/
    @Test
    void test(){
        mapper.selectList(null).forEach(System.out::println);
    }
}

8、结果

三、Mybatis-plus常用注解

1、@TableName

@TableName 映射数据库的表名

package com.exerciseitems.mybatisplus.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : User
 * @description : [描述说明该类的功能]
 * @createTime : [2021/9/11 20:45]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2021/9/11 20:45]
 * @updateRemark : [描述说明本次修改内容]
 */
@Data
@TableName(value = "user")
public class User {
    private String id;
    private String name;
    private Integer age;
}

2、@TableId

@TableId 设置主键映射,value映射主键字段名;type设置主键类型,主键的生成策略

AUTO(0),
NONE(1),
INPUT(2),
ASSIGN_ID(3),
ASSIGN_UUID(4),
/** @deprecated */
@Deprecated
ID_WORKER(3),
/** @deprecated */
@Deprecated
ID_WORKER_STR(3),
/** @deprecated */
@Deprecated
UUID(4);

描述

AUTO

数据库自增

NONE

MybatisPlus set 主键,雪花算法实现

INPUT

需要开发者⼿动赋值

ASSIGN_ID

MP 分配 ID,Long、Integer、String

ASSIGN_UUID

分配 UUID,Strinig

INPUT 如果开发者没有⼿动赋值,则数据库通过⾃增的⽅式给主键赋值,如果开发者⼿动赋值,则存⼊该值。

AUTO 默认就是数据库⾃增,开发者⽆需赋值。

ASSIGN_ID MybatisPlus⾃动赋值,雪花算法。

ASSIGN_UUID 主键的数据类型必须是 String,⾃动⽣成 UUID 进⾏赋值

3、@TableField

@TableField 映射非主键字段,value映射字段名

描述

value

数据库字段名

el

映射为原生 #{ ... } 逻辑,相当于写在 xml 里的 #{ ... } 部分

exist

是否为数据库表字段(默认true存在,false不存在)

condition

预处理WHERE实体条件自定义运算规则

update

字段 update set 部分注入

select

是否进行 select 查询

fill

字段自动填充策略

4、@Version

@Version 标记乐观锁,通过version字段来保证数据的安全性,当修改数据的时候,会与version作为条件,当条件成立的时候才会修改成功

version = 2

线程 1:update ... set version = 2 where version = 1

线程2 :update ... set version = 2 where version = 1

(1)、数据库表添加 version 字段,默认值为 1

(2)、实体类添加 version 成员变量,并且添加 @Version

@Version
private Integer version;

(3)、注册配置类

package com.exerciseitems.mybatisplus.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : MyBatisPlusConfig
 * @description : [描述说明该类的功能]
 * @createTime : [2021/9/14 16:25]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2021/9/14 16:25]
 * @updateRemark : [描述说明本次修改内容]
 */
@Configuration
public class MyBatisPlusConfig {

    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

5、@EnumValue

@EnumValue 通用枚举类注解,将数据库字段映射成实体类的枚举类型成员变量

(1)、数据库表添加 status字段,默认值为 1

(2)、添加枚举类

package com.exerciseitems.mybatisplus.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : StatusEnum
 * @description : [描述说明该类的功能]
 * @createTime : [2021/9/15 9:04]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2021/9/15 9:04]
 * @updateRemark : [描述说明本次修改内容]
 */
public enum StatusEnum {
    WORK(1,"上课"),
    REST(0,"下课");

    StatusEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @EnumValue
    private Integer code;
    private String msg;
}

(3)、实体类添加 statusEnum 成员变量,并且添加 @TableField(value = "status")

import com.exerciseitems.mybatisplus.enums.AgeEnum;

@TableField(value = "status")
private StatusEnum statusEnum;

(4)、添加相关application.yml配置

type-enums-package:
           com.exerciseitems.mybatisplus.enums

(5)、实现接口

package com.exerciseitems.mybatisplus.enums;

import com.baomidou.mybatisplus.core.enums.IEnum;

/**
 * @author : [LiuYanQiang]
 * @version : [v1.0]
 * @className : AgeEnum
 * @description : [描述说明该类的功能]
 * @createTime : [2021/9/15 9:04]
 * @updateUser : [LiuYanQiang]
 * @updateTime : [2021/9/15 9:04]
 * @updateRemark : [描述说明本次修改内容]
 */
public enum AgeEnum implements IEnum<Integer> {
    ONE(1,"一岁"),
    TWO(2,"两岁"),
    THREE(3,"三岁");

    private Integer code;
    private String msg;

    AgeEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    @Override
    public Integer getValue() {
        return this.code;
    }
}

6、@TableLogic

@TableLogic 映射逻辑删除

(1)、数据表添加is_delete字段,默认值为0

(2)、实体类添加注解

@TableLogic
@TableField(value = "is_delete")
private Integer isDelete;

(3)、添加相关application.yml配置

global-config:
           db-config:
             logic-not-delete-value: 0
             logic-delete-value: 1

猜你喜欢

转载自blog.csdn.net/weixin_44684272/article/details/120364151
今日推荐