# MyBatisPlus 简介

# 概念

MyBatisPlus 是基于 MyBatis 框架基础上开发的增强工具,简化开发,提高效率

  1. 无侵入:只做增强不做改变,不会对现有工程产生影响
  2. 强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现表单 CRUD 操作
  3. 支持 Lambda:编写查询条件无需担心写错字段
  4. 支持主键自动生成
  5. 内置分页插件

# 标准数据层开发

# 标准数据层 CRUD 功能

功能 自定义接口 MP 接口
新增 boolean save(T t) int insert(T t)
删除 boolean delete(int id) int deleteById(Serializable id)
修改 boolean update(T t) int updateById(T t)
根据 id 查询 T getById(int id) T selectById(Serializable id)
查询全部 List<T> getAll() List<T> selectList()
分页查询 PageInfo<T> getAll(int page, int size) IPage<T> selectPage(IPage<T> page)
按条件查询 List<T> getAll(Condition condition) IPage<T> selectPage(Wrapper<T> queryWrapper)

# DQL 编程控制

# 条件查询 —— 设置查询条件

# 格式一:常规格式

QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lt("age",65);
qw.ge("age",20);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);

# 格式二:链式编程

QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lt("age",65).ge("age",18);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);

# Lambda 格式

QueryWrapper<User> qw = new QueryWrapper<User>();
qw.lambda().lt(User::getAge,65).ge(User::getAge,18);
List<User> list = userDao.selectList(qw);
System.out.println(userList);

# Lambda 格式

LambdaQueryWarpper<User> lqw = LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 65).ge(User::getAge,18);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);

# 条件查询 ——null 值处理

LambdaQueryWrapper lqw = new LambdaQueryWrapper<User>();
lqw.lt(user.getAge != null, User::getAge);
List<User> list = userDao.selectList(lqw);

# 查询条件设置

LambdaQueryWrapper lqw = new LambdaQueryWrapper<User>();
lqw.eq(User.getName, user.getName());
List<User> list = userDao.selectList(lqw);

# 字段映射与表名映射

# 字段映射

  1. 名称: @TableField
  2. 类型:属性注解
  3. 位置:模型类属性定义上方
  4. 作用:设置当前属性对应的数据库表中的字段关系
  5. 相关属性:
    1. value(默认),设置数据库表字段名称
    2. exist:true 表示表中有对应字段,false 表示没有字段
    3. select:设置属性是否参与查询,此属性与 select () 映射配置不冲突
public class User {
    @TableField(value = "pwd",select = false)
    private String password;
    @TableField(existt = false)
    private Integer online;
}

# 表名映射

  1. 名称: TableName
  2. 类型:类注解
  3. 位置:模型类定义上方
  4. 作用:设置当前类对应与数据库表关系
  5. 相关属性:
    1. value:设置数据库表名称
@TableName("tbl_user")
public class User {
    private Long id;
}

# id 生成策略控制

# 不同 id 生成策略

  1. AUTO (0):使用数据库 id 自增策略控制 id 生成
  2. NONE (1):不设置 id 生成策略
  3. INPUT (2):用户手工输入 id
  4. ASSIGN (3):雪花算法生成 id(可兼容数值型与字符串型)
  5. ASSIGN_UUID (4):以 UUID 生成算法作为 id 生成策略

# id 生成策略注解

  1. 名称: TableId
  2. 类型:类注解
  3. 位置:字段上方
  4. 作用:设置当前 Id 值得生成策略
  5. 相关属性:
    1. type:生成策略类型
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
}

# 全局配置 id 生成策略

mybatis-plus:
	golbal-config:
    	db-config:
    		id-Type: aoto
    		table-prefix: tbl_

# 逻辑删除

# 概述

  1. 删除操作业务问题:业务数据从数据库中丢弃
  2. 逻辑删除:为了数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中

# 实现步骤

# 数据库添加逻辑删除标记字段

image-20230402152718982

# 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

public class User {
    private Long id;
    private Integer deleted;
}

# 配置逻辑删除字面值

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

# 乐观锁

# 数据库表中添加锁标记字段

image-20230402153821828

# 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

public class User {
    private Long id;
    @Version
    private Integer version;
}

# 配置乐观锁拦截器实现锁机制对应得动态 sql 语句拼接

@Configuration
public class MpConfig {
    @Bean
    public MyBatisPlusInterceptor mpInterceptor() {
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mpInterceptor;
    }
}

# 代码生成器

# 导入坐标

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>
<!--druid-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
</dependency>
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<!-- 代码生成器 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.1</version>
</dependency>
<!--velocity 模板引擎 -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>

# 实现代码生成器

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;
public class CodeGenerator {
    public static void main(String[] args) {
        //1. 获取代码生成器的对象
        AutoGenerator autoGenerator = new AutoGenerator();
        // 设置数据库相关配置
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/reggie?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);
        // 设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");    // 设置代码生成位置
        globalConfig.setOpen(false);    // 设置生成完毕后是否打开生成代码所在的目录
        globalConfig.setAuthor("baozi");    // 设置作者
        globalConfig.setFileOverride(true);     // 设置是否覆盖原始生成的文件
        globalConfig.setMapperName("%sDao");    // 设置数据层接口名,% s 为占位符,指代模块名称
        globalConfig.setIdType(IdType.AUTO);   // 设置 Id 生成策略
        autoGenerator.setGlobalConfig(globalConfig);
        // 设置包名相关配置
        PackageConfig packageInfo = new PackageConfig();
        packageInfo.setParent("com.baozi");   // 设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
        packageInfo.setEntity("entity");    // 设置实体类包名
        packageInfo.setMapper("dao");   // 设置数据层包名
        autoGenerator.setPackageInfo(packageInfo);
        // 策略设置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("user");  // 设置当前参与生成的表名,参数为可变参数
        //strategyConfig.setTablePrefix ("tbl_");  // 设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名  例如: User = tbl_user - tbl_
        strategyConfig.setRestControllerStyle(true);    // 设置是否启用 Rest 风格
        //strategyConfig.setVersionFieldName ("version");  // 设置乐观锁字段名
        //strategyConfig.setLogicDeleteFieldName ("deleted");  // 设置逻辑删除字段名
        strategyConfig.setEntityLombokModel(true);  // 设置是否启用 lombok
        autoGenerator.setStrategy(strategyConfig);
        //2. 执行生成操作
        autoGenerator.execute();
    }
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Baozi 微信支付

微信支付

Baozi 支付宝

支付宝

Baozi 微信

微信