Mybatis—Plus快速入门

本文详细介绍了Mybatis-Plus的项目结构、配置要点,包括pom.xml文件配置、数据库表设计、实体类(Account)的定义,以及如何利用注解进行自动化逆向工程。涵盖了分页插件、乐观锁、日志管理和常见注解的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis—Plus

Mybatis-plus

  • MyBtais Plus
  • 开源框架 基于MyBatis

项目结构

在这里插入图片描述

pom.xml文件

<?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.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.southwind</groupId>
    <artifactId>MyBatis-Plus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>MyBatis-Plus</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <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>

<!--        <dependency>-->
<!--            <groupId>junit</groupId>-->
<!--            <artifactId>junit</artifactId>-->
<!--            <version>4.13.1</version>-->
<!--            <scope>test</scope>-->
<!--        </dependency>-->
<!--        -->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>




        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.2.1</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.0.RELEASE</version>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

数据库表

在这里插入图片描述

在这里插入图片描述

实体类Account

@Data
@TableName(value = "user")
public class Account {

    //  默认方式  是不需要给主键赋值的  自动生成一个随机数(雪花算法)
    @TableId
   //   雪花算法生成的随机数 必须要使用long  对应的数据库中的字段类型要使用 bigint 长度最好大一点
    private  Integer id;
    @TableField(value = "name")
    private  String username;
    private  Integer age;

    @TableField(exist =false)
    //  表示实体类中有这个字段  但是数据库中没有 就可以这样使用
    private  String gender;


    @TableField(fill = FieldFill.INSERT,value = "create_time")
    private Date creatTime;
    @TableField(fill = FieldFill.INSERT_UPDATE,value = "update_time")
    private Date updateTime;

    //  注解方式进行枚举
    @Version
    private  Integer version;

    private StatusEnum  status;

    @TableLogic(value = "0" , delval = "1")
    private  Integer deleted;
    
}

在application.yml中寻找成员变量的值进行配对

在这里插入图片描述

在这里插入图片描述
根据数据表 自动的逆向生成 所有的实体类 所有的Mapper 所有的Service 所有的controller接口

  • 此处的接口 没有实例化的原因是 因为有动态代理
  • 动态生成的(这个实现类 是看不到的) 程序运行 动态生成一个类

在这里插入图片描述

日志操作

在这里插入图片描述

在这里插入图片描述

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/myabtisplus?useUnicode=true&characterEncoding=gbk&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Hongkong
    username: root
    password: 密码

# 打印日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  type-enums-package:
    com.southwind.mybatisplus.enums

#  逻辑没有删除 0  删除是 1
  global-config:
    db-config:
      logic-not-delete-value: 0
      logic-delete-value: 1

常用注解

@TableName

映射数据库的表名

@TableId

设置主键映射  value映射主键字段名字
type设置主键类型  主键的生成策略
public enum IdType {
    /**
     * 数据库ID自增
     * <p>该类型请确保数据库设置了 ID自增 否则无效</p>
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
     */
    NONE(1),
    /**
     * 用户输入ID
     * <p>该类型可以通过自己注册自动填充插件进行填充</p>
     */
    INPUT(2),

    /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
    /**
     * 分配ID (主键类型为number或string),
     * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
     *
     * @since 3.3.0
     */
    ASSIGN_ID(3),
    /**
     * 分配UUID (主键类型为 string)
     * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
     */
    ASSIGN_UUID(4),

在这里插入图片描述

AUTO
数据库自增 (根据数据库当前最大值加一 就是最新的值)

NONE
MP Set主键 雪花算法实现

INPUT
需要开发者手动赋值
如果没有手动赋值 则数据库通过自增的方式给主键赋值,如果手动赋值,则存入该值。

ASSIGN_ID 自动赋值 (雪花算法)
MP 分配 ID Long、Integer、String

ASSIGN_UUID 主键的数据类型必须是String 会自动更生成UUID(是一个字符串)
分配UUID、String

@TableField

映射非主键字段 value映射字段名

  • exist 表示是否为数据库字段 false 如果实体类中的成员变量在数据库中没有对应的字段
  • 则可以用exist 、DTO、 VO对不同的实体类做一个二次封装 (将当前需要用的实体类和其他实体类 组装在一起 进行传入到前端调用 )
  • Select 表示是否查询该字段
  • Fill 表示是否自动填充 将对象存入数据库的时候 由MyBatis Plus自动给某些字段赋值
    ceate_time、update_time。

@Version

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

在这里插入图片描述

设置时间修改值,进行操作的时候 进行设置当前的系统值

//交给spring管理
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    //使用mp实现添加操作,这个方法会执行,metaObject元数据(表中的名字,表中的字段)
    @Override
    public void insertFill(MetaObject metaObject) {
        //根据名称设置属性值
        this.setFieldValByName("creatTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
    //使用mp实现修改操作,这个方法会执行
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

配置Mybatis-plus对应的乐观锁和分页插件


@Configuration
@EnableTransactionManagement
public class MyBatisPlusConfig {


        @Bean
        public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor(){
            return new OptimisticLockerInnerInterceptor();
        }

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

分页插件中 需要考虑的就是

  1. 对应的版本兼容
  2. 导入插件依赖
  3. 对应的扫描类和配置类

问题集合

对应的在 mybatis-plus
分页操作的时候 出现的问题可能存在有
MybatisPlus和SPringboot存在版本的问题
SpringBoot和junit存在版本问题
Mybtaisplus配置分页插件
注意3.4.0之后的版本 会有新的配置方式 分页插件和乐观锁

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

实现接口枚举

实现接口 IEnum<?>

其中方法

Public Integer getValue(){
Return this.code;
}

@TableLogic

映射逻辑删除 (逻辑上已经删除了 但是数据库中还是存在)

在这里插入图片描述

1.注解配置

在这里插入图片描述

2.配置文件配置
在这里插入图片描述

动态sql其实已经进行封装了,实际上就是进行读取实体类的注解 自动判断是否需要添加某个sql,是否追加某个条件。


public interface UserMapper extends BaseMapper<Account> {

    @Select("select p.*,u.name  UserName from product p,user u where p.user_id=u.id and u.id=#{id}")
    List<ProductVO>   productList(Integer id);

}

多表来联查
在这里插入图片描述

查询整个数据库

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值