MyBatis-Plus

目录

一、简介

二、配置

1、依赖

2、配置文件

3、创建Mapper接口

4、启动类上添加@MapperScan

三、简单的CURD操作

1、插入操作

2、更新操作

3、查询操作

4、删除操作

四、拓展

1、主键生成策略

2、自动填充创建、修改时间

2.1、数据库级别

2.2、代码级别

3、乐观锁的处理

4、MyBatis-Plus自带的分页插件

5、逻辑删除插件

6、性能分析插件

7、条件构造器

8、代码自动生成器

五、参考资料


一、简介

MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。引入它不会对现有工程产生影响;引入后只需简单配置,即可快速进行单表CRUD操作,节省大量时间;适用于任何能使用MyBatis进行CRUD并且支持标准SQL的数据库。 

二、配置

1、依赖

		<!-- 数据库驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<!-- mybatis-plus(Spring Boot) -->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>最新版本</version>
		</dependency>

		<!-- mybatis-plus(Spring) -->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus</artifactId>
			<version>最新版本</version>
		</dependency>

2、配置文件

# 数据库连接配置
spring:
  datasource:
    username: root
    password: liboran
    # useSSL是否使用安全连接;useUnicode指定字符的编码解码格式;characterEncoding设置字符编码集;serverTimezone设置时区
    url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    # 高版本驱动兼容低版本驱动
    driver-class-name: com.mysql.cj.jdbc.Driver

# 配置日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3、创建Mapper接口

Mapper接口继承BaseMapper<T>,T是对应的实体类

@Repository
public interface UserMapper extends BaseMapper<User> {
}

4、启动类上添加@MapperScan

使用@MapperScan("mapper包的路径")注解,扫描Mapper包

三、简单的CURD操作

1、插入操作

插入一条数据,参数放入一个对象

2、更新操作

根据Id进行更新,参数放入一个对象

3、查询操作

 4、删除操作

同查询操作

四、拓展

1、主键生成策略

上面在测试插入操作的过程中,并没有设置id属性,但自动生成了一串id,这个id就是根据主键生成策略生成的。可以对id添加注解@TableId,通过type属性设置主键生成策略。

IdType源码如下:

public enum IdType {
    AUTO(0),          //自增,数据库中的字段必须设置自增
    NONE(1),          //数据库中未设置主键,当id为空时,采用的是ID_WORKER生成id
    INPUT(2),         //手动输入,未输入id的话报错
    ID_WORKER(3),     //默认的,全局唯一id,雪花算法
    UUID(4),          //全局唯一id,UUID
    ID_WORKER_STR(5); //ID_WORKER的字符串表示

    private int key;

    private IdType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}

2、自动填充创建、修改时间

添加两个字段(实体类中同步添加属性):创建时间create_time、修改时间update_time,类型为timestamp,数据库版本低的话设置不了两个timestamp,可以考虑更新数据库至8的版本。

2.1、数据库级别

将create_time、update_time的默认值设置为CURRENT_TIMESTAMP,update_time需要勾选根据当前时间戳更新。

2.2、代码级别

① 对createTime和updateTime属性添加@TableField注解,设置fill的属性填充策略

 FieldFill的源码如下:

public enum FieldFill {
    DEFAULT,       //默认的,不填充
    INSERT,        //插入时填充
    UPDATE,        //更新时填充
    INSERT_UPDATE; //插入和更新时填充

    private FieldFill() {
    }
}

 ② 编写处理器MyMetaObjectHandler处理注解

@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill");
        //第一个参数:填充实体类中的哪个属性;第二个参数:填充内容
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

3、乐观锁的处理

使用MyBatis-Plus提供的乐观锁插件

① 添加version字段(实体类中同步添加属性),类型为int

② 对实体类中的version属性添加注解@Version

③ 自定义配置类注册插件

@Configuration //声明这是一个配置类
@EnableTransactionManagement //自动管理事务
@MapperScan("mapper包路径")
public class MyBatisConfig {
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

4、MyBatis-Plus自带的分页插件

① 在MyBatis配置类注册分页插件

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

② 使用

③ 自定义方法使用分页插件

public interface TClassAttendanceMapper extends BaseMapper<TClassAttendance> {
    //方法传入一个page对象,并返回一个page对象
    Page<TClassAttendance> getAll(Page<TClassAttendance> page);
}


public class TClassAttendanceServiceImpl extends ServiceImpl<TClassAttendanceMapper, TClassAttendance> implements TClassAttendanceService {
    @Autowired
    TClassAttendanceMapper mapper;

    @Override
    public Page<TClassAttendance> getAll(Integer current, Integer size) {
        Page<TClassAttendance> page = new Page<>(current,size);
        page = mapper.getAll(page);
        return page;
    }
}

5、逻辑删除插件

添加字段deleted,类型为int,0表示未删除,1表示逻辑删除。删除时并不直接删除数据库中的数据,而是将deleted由0修改为1,在查询时查询条件会带上deleted = 0,不返回逻辑删除的数据。

① 对实体类中的deleted属性添加@TableLogic注解

② 在MyBatis配置类中注册逻辑删除插件

    //逻辑删除插件
    @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }

③ 在application配置文件中配置

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

6、性能分析插件

用于分析每条sql的执行时间

① 配置类中注册性能分析插件

    //性能分析插件
    @Bean
    @Profile({"dev","test"}) //设置开发环境和测试环境开启
    public PerformanceInterceptor performanceInterceptor(){
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(100); //设置sql的最大执行时间,单位ms,超时则报错
        performanceInterceptor.setFormat(true); //设置sql语句格式化,便于查看
        return performanceInterceptor;
    }

 ② application中设置环境为测试环境或开发环境

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

sql超时的报错

7、条件构造器

复杂的查询、删除、更新比如说条件查询、范围查询、模糊查询等,可以通过条件构造器Wrapper来实现。比如说:

 ① 查询部分字段

② 查询名字为Jack的用户

③ 查询年龄为15岁的用户姓名

④ 查询名字以j为开头的用户

更多用法参考官方文档

8、代码自动生成器

创建一个类用于自动生成代码

package com.li;

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 CodeGenerator {
    public static void main(String[] args) {
        // 1.实例化一个自动代码生成器对象
        AutoGenerator generator = new AutoGenerator();

        // 2 全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        //获取当前项目路径
        String path = System.getProperty("user.dir");
        //设置代码生成目标目录,当前路径
        globalConfig.setOutputDir(path+"/mybatis-plus/src/main/java");
        // 设置作者
        globalConfig.setAuthor("张三");
        // 设置生成后是否弹出文件夹
        globalConfig.setOpen(false);
        // 设置是否覆盖已有文件
        globalConfig.setFileOverride(false);
        // 设置服务名字,去生成的service的I前缀
        globalConfig.setServiceName("%sService");
        // 设置ID生成策略,自增
        globalConfig.setIdType(IdType.AUTO);
        // 设置日期类型,仅时间
        globalConfig.setDateType(DateType.ONLY_DATE);
        // 是否生成swagger接口文档
        globalConfig.setSwagger2(true);
        // 将全局配置加入代码生成器中
        generator.setGlobalConfig(globalConfig);

        // 3 数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis-plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("root");
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setDbType(DbType.MYSQL);
        // 将数据源配置加入代码生成器中
        generator.setDataSource(dataSourceConfig);

        // 4 包配置
        PackageConfig packageConfig = new PackageConfig();
        // 设置模块名
        packageConfig.setModuleName("hello");
        // 设置包路径
        packageConfig.setParent("com.test");
        // 设置实体类包名
        packageConfig.setEntity("entity");
        // 设置mapper层包名
        packageConfig.setMapper("mapper");
        // 设置service层包名
        packageConfig.setService("service");
        // 设置controller层包名
        packageConfig.setController("controller");
        // 将包配置加入代码生成器中
        generator.setPackageInfo(packageConfig);

        // 5 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 设置读取哪些表生成代码,可以写多个,逗号隔开
        strategy.setInclude("user");
        // 表名 → 类名的过程将命名规则由_转为驼峰
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 字段名 → 属性名的过程将命名规则由_转为驼峰
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 是否生成Lombok注解
        strategy.setEntityLombokModel(true);
        // 设置逻辑删除的字段名
        strategy.setLogicDeleteFieldName("deletetd");
        // 自动填充策略配置
        TableFill tableFill = new TableFill("create_time", FieldFill.INSERT);
        TableFill tableFill2 = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(tableFill);
        tableFills.add(tableFill2);
        strategy.setTableFillList(tableFills);
        // 乐观锁配置
        strategy.setVersionFieldName("version");
        // 设置controller层为@RestController
        strategy.setRestControllerStyle(true);
        // 将策略配置加入代码生成器中
        generator.setStrategy(strategy);

        //执行代码生成器
        generator.execute();
    }
}

五、参考资料

【狂神说Java】MyBatisPlus最新完整教程通俗易懂_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV17E411N7KN/?spm_id_from=333.999.0.0&vd_source=18add245858bb01410866b08c994e66bMyBatis-Plus 官方文档https://baomidou.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值