我是靠谱客的博主 活泼眼睛,最近开发中收集的这篇文章主要介绍MyBatis-Plus 框架简单使用总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 1. 基本使用
    • 2. 常用注解
      • 2.1. @TableName
      • 2.2. @TableId
      • 2.3. @TableField
      • 2.4. @Version
      • 2.5. @EnumValue
      • 2.6. @TableLogic
    • 3. CRUD
      • 3.1. 查询
        • 3.1.1. selectList
          • 3.1.1.1. 单条件查询示例
          • 3.1.1.2. 多条件查询示例
          • 3.1.1.3. 查询结果列的控制
          • 3.1.1.4. 条件作用,非空判断
          • 3.1.1.5. allEq
        • 3.1.2. selectById
        • 3.1.3. selectBatchIds
        • 3.1.4. selectByMap
        • 3.1.5. selectCount
        • 3.1.6. selectMaps
        • 3.1.7. selectPage(分页查询)
        • 3.1.8. selectMapsPage(分页查询)
        • 3.1.9. selectObjs
        • 3.1.10. selectOne
      • 3.2. 添加
        • 3.2.1. insert
        • 3.2.2. insertOrUpdate
      • 3.3. 删除
        • 3.3.1. deleteById
        • 3.3.2. deleteBatchIds
        • 3.3.3. delete
        • 3.3.4. deleteByMap
      • 3.4. 修改
        • 3.4.1. updateById
        • 3.4.2. update
    • 4. Lambda 条件构造器
    • 5. 自定义方法 SQL
      • 5.1. 简单自定义
      • 5.2. 复杂自定义
      • 5.3. 自定义分页
    • 6. service 方法调用
    • 7. MyBatis-Plus 自动生成
    • 8. 其他配置
    • 9. 注意事项


1. 基本使用

1、创建 Maven 工程
在这里插入图片描述2、pom.xml 引入 MyBatis Plus 的依赖

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

3、创建实体类

package com.example.mybatisplus.entity;

import lombok.Data;

@Data
public class User {
   
    private Long id;
    private String name;
    private Integer age;
}

4、创建 Mapper 接口

package com.example.mybatisplus.mapper;

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

public interface UserMapper extends BaseMapper<User> {
   
}

5、application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456789
#SQL语句输出,不设置这个,直接用下边的方法,设置对应包的日志级别也行
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#打印SQL语句,trace级别能把SQL执行结果打印出来,设置mapper包为trace级别
logging.level.com.example.demo.generator.mapper=trace

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

package com.example.mybatisplus;

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

@SpringBootApplication
@MapperScan(basePackages = {
   "com.example.mybatisplus.mapper"})
public class MybatisplusApplication {
   
    public static void main(String[] args) {
   
        SpringApplication.run(MybatisplusApplication.class, args);
    }
}

7、测试

package com.example.mybatisplus.mapper;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class UserMapperTest {
   

    @Autowired
    private UserMapper mapper;

    @Test
    void test(){
   
        mapper.selectList(null).forEach(System.out::println);
    }

}

2. 常用注解

2.1. @TableName

mp 会自动将实体驼峰命名对应为数据库下划线命名,如果命名没有对应上,需要用该注解进行指定表名。

value属性映射数据库的表名。

package com.example.mybatisplus.entity;

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

@Data
@TableName(value = "user")
public class Account {
   
    private Long id;
    private String name;
    private Integer age;
}

2.2. @TableId

设置主键映射。mp 用来指定主键 id,默认会直接将 id 字段作为主键,如果主键不是 id,需要使用该注解进行指定。

value属性映射主键字段名。当主键名和实体类主键字段名不一致的时候使用。

type属性设置主键类型,即主键的生成策略,默认为IdType.NONE

  • AUTO:数据库主键自增,开发者无需赋值。该类型请确保数据库设置了 ID自增,否则无效。主键值会回填到参数对象的主键字段中。如果开发者手动赋值了,赋值无效,依然是数据库自增。
  • NONE:type 的默认类型,如果开发者没有手动赋值,则数据库通过雪花算法算出一个 Long 值给主键赋值,主键值会回填到参数对象的主键字段中。如果开发者手动赋值,则存入该值。
  • INPUT:如果开发者没有手动赋值,则数据库通过自增的方式给主键赋值(该功能需要在数据库表的主键开启自动自增属性,否则会报 id 不能为 null 的错误了),主键值不会回填到参数对象的主键字段中。如果开发者手动赋值,则存入该值。
  • ASSIGN_ID:mp 自动赋值,雪花算法。主键类型可为数值和字符串。如果开发者没有手动赋值,则通过雪花算法的方式给主键赋值,主键值会回填到参数对象的主键字段中。如果开发者手动赋值,则存入该值。
  • ASSIGN_UUID:主键的数据类型必须是 String,自动生成 UUID 进行赋值,主键值会回填到参数对象的主键字段中。如果开发者手动赋值,则存入该值。
package com.example.mybatisplus.entity;

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

@Data
public class User {
   
	@TableId(value = "id", type = IdType.AUTO)
    private Long num;
    private String name;
    private Integer age;
}

2.3. @TableField

映射非主键字段。

value属性映射字段名。

exist属性表示是否为数据库字段,默认 true 是,false 不是。如果实体类中的成员变量在数据库中没有对应的字段,则可以使用该属性。主要用于 VO、DTO。

select属性表示是否查询该字段。大字段可设置为 false 不加入 select 查询范围,逻辑删除字段 deleted 也可以使用该属性。

fill属性表示是否自动填充,将对象存入数据库的时候,由 MyBatis-Plus 自动给某些字段赋值。常用于 create_time、update_time 赋值。也用于新增人、修改人字段赋值。

1、给表添加 create_time、update_time 字段

2、实体类中添加成员变量

package com.example.mybatisplus.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;

import java.util.Date;

@Data
public class User {
   
    private Long id;
    @TableField(value = "name",select = false)
    private String title;
    private Integer age;
    @TableField(exist = false)
    private String gender;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

3、创建自动填充处理器

package com.example.mybatisplus.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
   
    @Override
    public void insertFill(MetaObject metaObject) {
   
        //判断表中是否有对应字段,没有对应字段的时候,不去执行自动填充,提高性能
        boolean hasCreateTimeSetter = metaObject.hasSetter("createTime");
        if (hasCreateTimeSetter){
   
            this.setFieldValByName("createTime", new Date(), metaObject);
        }
        boolean hasUpdateTimeSetter = metaObject.hasSetter("updateTime");
        if (hasUpdateTimeSetter){
   
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
   
        //判断表中是否有对应字段,没有对应字段的时候,不去执行自动填充,提高性能
        boolean hasUpdateTimeSetter = metaObject.hasSetter("updateTime");
        if (hasUpdateTimeSetter) {
   
            //判断该字段是否已经被手动赋值,手动赋值的将不会被自动填充,否则会被覆盖的
            Object val = this.getFieldValByName("updateTime", metaObject);
            if (val == null){
   
                this.setFieldValByName("updateTime", new Date(), metaObject);
            }
        }
    }
}

2.4. @Version

标记乐观锁,通过version字段来保证数据的安全性,当修改数据的时候,会以version作为条件,当条件成立的时候才会修改成功。用于并发update操作。每次updaate语句都会在条件中拼接version字段。

version = 1,线程1和线程2,并发执行,只有一个能成功。
线程 1:update … set version = 2 where version = 1
线程 2:update … set version = 2 where version = 1

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

2、实体类添加 version 成员变量,并且添加 @Version 注解。

package com.example.mybatisplus.entity;

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

import java.util.Date;

@Data
public class User {
   
    private Long id;
    private String name;
    private Integer age;
    @Version
    private Integer version;
}

3、注册配置类

package com.example.mybatisplus.config;

import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {
   
    //老版本
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
   
        return new OptimisticLockerInterceptor();
    }
    //新版本(老版本提示已删除的则写这个)
	@Bean
	public MybatisPlusInterceptor mybatisPlusInterceptor() {
   
	    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
	    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
	    return interceptor;
	}
    
}

2.5. @EnumValue

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

package com.example.mybatisplus.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;

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;
}
package com.example.mybatisplus.entity;

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

import java.util.Date;

@Data
public class User {
   
    private Long id;
    private String name;
    private Integer age;
    
    private StatusEnum status;
}

application.yml 配置枚举包扫描,枚举值和枚举自动转换。

mybatis-plus
  type-enums-package: 
  	com.example.mybatisplus.enums

2、还有一种方法是通过实现接口的方式

package com.example.mybatisplus.enums;

import com.baomidou.mybatisplus.annotation.IEnum;

public enum StatusEnum implements IEnum<Integer> {
   
    WORK(1,"上班"),
    REST(0,"休息");

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

    private Integer code;
    private String msg;
	//这里配置的是转换的值,也就是时候数据库存的是code值,查询出来会被自动转换为枚举 WORK 或者 REST
    @Override
    public Integer getValue() {
   
        return this.code;
    }
}

2.6. @TableLogic

映射逻辑删除。

  • 逻辑删除,则 delete 语句会变为 update 语句,会将 deleted 字段置为已删除的值,比如1。
  • 查询语句和更新语句会自动加过滤条件,比如 deleted=0(0表示未删除,1表示删除)。
  • 自定义 SQL 语句不会添加逻辑删除标志。需要自己添加这个过滤条件 deleted=0。

1、数据表添加 deleted 字段。

2、实体类添加注解和字段。

package com.example.mybatisplus.entity;

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

import java.util.Date;

@Data
public class User {
   
    private Long id;
    private String title;
    private Integer age;
    @TableLogic
    private Integer deleted;
}

3、application.yml 添加配置。配置0表示未删除,1表示已删除。

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

3. CRUD

3.1. 查询

3.1.1. selectList
3.1.1.1. 单条件查询示例
//SELECT * FROM user;
List<User> userList = userMapper.selectList(

最后

以上就是活泼眼睛为你收集整理的MyBatis-Plus 框架简单使用总结的全部内容,希望文章能够帮你解决MyBatis-Plus 框架简单使用总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部