Mybatis-Plus总结

发布时间 2023-03-22 21:16:01作者: 搭风筝上月球

mybatis-plus

  • mybatis-plus主键id生成使用的是雪花算法所以会比较长,使用bigint类型(在实体中是long类型

  • MySQL驱动8就用:driver-class-name: com.mysql.cj.jdbc.Driver

  • MySQL驱动8需要加时区连接地址URL

  • MySQL驱动5就用:driver-class-name: com.mysql.jdbc.Driver

  • yml文件用#注释

  • wrapper就是mybatisplus的条件构造器

  • alt+enter生成对象(idea)

mybatis-plus控制台打印sql语句,在yml配置文件

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

一、常用注解

@TableId:将这个属性对应的字段作为主键,数据库一般把id作为主键
    假如实体主键是id但是数据库主键id是uid,那么用注解加上value即可 @TableId("uid")
type属性:主键生成策略,@TableId(value = "uid", type = IdType.AUTO),默认是雪花算法

@TableName("user"):设置实体类所对应的表名,如果不加就用实体类决定

@TableField("user_name"):指定属性所对应的字段名    

@TableLogic:逻辑删除,加了之后只会查出逻辑删除为0未删除得数据

@Repository在mapper上加上表明是持久层组件,在其他地方注入使用便不会报错

@EnumValue //将注解所标识的属性的值存储到数据库中

@DS("master") //在serviceimpl,指定数据源

@Service //在serviceimpl,表明是service组件

二、wapper构造器

image

三、baseMapper方法的增删改查

1. 查询操作

// 根据 ID 查询:

	T selectById(Serializable id);

// 根据 entity 条件,查询一条记录:

	T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);

// 查询(根据ID 批量查询):

	List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

// 根据 entity 条件,查询全部记录:

	List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);

// 查询(根据 columnMap 条件):

	List selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

// 根据 Wrapper 条件,查询全部记录:

	List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper);

// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值:

	List selectObjs(@Param(Constants.WRAPPER) Wrapper queryWrapper);

// 根据 entity 条件,查询全部记录(并翻页):

	IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

// 根据 Wrapper 条件,查询全部记录(并翻页):

	IPage<Map<String, Object>> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

// 根据 Wrapper 条件,查询总记录数:

	Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);


// #参数类型说明:
Serializable: 主键ID
Wrapper :实体对象封装操作类(可以为 null)
Collection<? extends Serializable>:主键ID列表(不能为 null 以及 empty)
Map<String, Object>: 表字段 map 对象
IPage:分页查询条件(可以为 RowBounds.DEFAULT)

2. 插入操作:

插入一条记录: int insert(T entity);
插入类型T:实体对象

主键生成策略:

数据库插入的id为全局默认的id(ID_WORKER),我们需要配置主键自增,在实体类字段上添加注解: @TableId(type =IdType.AUTO),数据库字段一定要是自增的。

雪花算法:

SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。

3. 更新操作

// 根据 whereEntity 条件,更新记录

	int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper updateWrapper);

// 根据 ID 修改

	int updateById(@Param(Constants.ENTITY) T entity);


// #参数说明
类型 参数名 描述
T entity 实体对象 (set 条件值,可为 null)
Wrapper updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
乐观锁:顾名思义十分乐观,它总是被认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再次更新测试。加上版本号version字段,更新数据次版本号就变,版本号不一致操作会不成功
悲观锁:顾名思义十分悲观,它总是出现问题,无论干什么都会上锁!再去操作!就是两个人同时操作一个数据,其中一个被锁死不能动在阻塞中,等到另外一个完成操作后,才可以操作

乐观锁实现方式:

取出记录时,获取当前version

更新时,带上这个version

执行更新时,set version=newVersion where version =oldVersion

如果version不对,就更新失败

image

4. 删除操作

物理删除 :从数据库中直接移出

逻辑删除:方便数据恢复和保护数据本身价值的一种方案,在数据库中没有被移出,而是通过一个变量来让他失效!deleted=0 ==>deleted =1(失效)

// 根据 entity 条件,删除记录:

	int delete(@Param(Constants.WRAPPER) Wrapper wrapper);

// 删除(根据ID 批量删除):

	int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

// 根据 ID 删除:

	int deleteById(Serializable id);

// 根据 columnMap 条件,删除记录:

	int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);


// 参数类型说明:
Wrapper:实体对象封装操作类(可以为 null)
Collection<? extends Serializable>: 主键ID列表(不能为 null 以及 empty)
Serializable:主键ID
Map<String, Object>: 表字段 map 对象

四、mybatisX插件

image

  • 代码生成

image

  • mybatisX,alt+enter自动补全

image

五、代码自动生成器【待验证,未亲身实践过是否能正常生成代码】

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、 Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

基本使用:

新建一个springboot工程:
image

在pom.xml中添加相关依赖【以下依赖需要以正确格式加入】:

com.baomidou

mybatis-plus-generator

3.3.1

org.apache.velocity

velocity-engine-core

2.3

编写yml文件,直接使用之前的即可:

spring:

// #配置数据源
datasource:
  driver-class-name: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
  username: root
  password: 123456

// #设置开发环境
profiles:
  active: dev

// #配置日志,我们所用的sql现在是不可见的,我们希望知道他是怎么执行的,所以我们必须要查看日志!【在控制台打印出运行的SQL语句】
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:

db-config:
  // #全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
  logic-delete-field: flag
  // #逻辑已删除值(默认为 1)
  logic-delete-value: 1
  // #逻辑未删除值(默认为 0)
  logic-not-delete-value: 0

server:
  port: 8010

编写代码生成器:

编写代码生成器【点击查看代码】
/**

@Author: xxx

@Date: yyyy-MM-DD HH:MM:SS

*/

import com.baomidou.mybatisplus.annotation.DbType;

import com.baomidou.mybatisplus.annotation.FieldFill;

import com.baomidou.mybatisplus.annotation.IdType;

import com.baomidou.mybatisplus.generator.AutoGenerator;

import com.baomidou.mybatisplus.generator.config.DataSourceConfig;

import com.baomidou.mybatisplus.generator.config.GlobalConfig;

import com.baomidou.mybatisplus.generator.config.PackageConfig;

import com.baomidou.mybatisplus.generator.config.StrategyConfig;

import com.baomidou.mybatisplus.generator.config.po.TableFill;

import com.baomidou.mybatisplus.generator.config.rules.DateType;

import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

// 代码自动生成器

public class MyBatisPlusGenerator {

public static void main(String[] args) {

// 需要构建一个 代码自动生成器 对象

AutoGenerator mpg = new AutoGenerator();

// 配置策略

// 1、全局配置

GlobalConfig gc = new GlobalConfig();

//获取当前项目路径

String projectPath = System.getProperty(“user.dir”);

gc.setOutputDir(projectPath+"/src/main/java");

gc.setAuthor(“龙源lll”);

gc.setOpen(false);

gc.setFileOverride(false); // 是否覆盖

gc.setServiceName("%sService"); // 去Service的I前缀

gc.setIdType(IdType.AUTO);

gc.setDateType(DateType.ONLY_DATE);

gc.setSwagger2(true);

mpg.setGlobalConfig(gc);

//2、设置数据源

DataSourceConfig dsc = new DataSourceConfig();

dsc.setUrl(“jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8”);

dsc.setDriverName(“com.mysql.cj.jdbc.Driver”);

dsc.setUsername(“root”);

dsc.setPassword(“520992”);

dsc.setDbType(DbType.MYSQL);

mpg.setDataSource(dsc);