Mybatis-Plus简单使用,轻松上手

1.介绍

MyBatis-Plus是一个 MyBatis 的增强工具。

特性:

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

 

框架结构

    

官方文档详细介绍:https://baomidou.com/

 

2.使用步骤

2.1使用的maven工程,在pom文件引入MyBatis-Plus坐标。

<!-- lombok 代码简化 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
            <scope>provided</scope>
        </dependency>
<!-- mybatis-plus 所需依赖  -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
 
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
 
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>
 
        <!-- 开发热启动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
 
        <!-- MySQL连接 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

tips:

  mybatis-plus-boot-starter:核心的应用包
  mybatis-plus-generator、freemarker:逆向生成的工具类,生成mapper, service,controller。

 

2.2 编写 MybatisPlusGenerator工具类


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import java.util.Collections;

/**
 * @className: MybatisPlusGenerator
 * @description:
 * @author: 沙漏倒装回忆1024
 * @date: 2022-10-23 10:19
 */
public class MybatisPlusGenerator {
    public static void main(String[] args) {
        //数据库链接配置
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/springboot_learning?useUnicode=true&useSSL=false&characterEncoding=utf8", "root", "root")
                .globalConfig(builder -> {
                    builder.author("沙漏倒装回忆1024") // 设置作者
                            //.enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(System.getProperty("user.dir")+"/src/main/java"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.lsqingfeng") // 设置父包名
                            .moduleName("springboot") // 设置父包模块名
                            // .service()  // 设置自定义service路径,不设置就是默认路径
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") +"/src/main/resources/mapper/")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("table_name") // 设置需要生成的表名
                            .addTablePrefix("t_", "c_")
                            // 设置自动填充的时间字段
                            .entityBuilder().addTableFills(
                                    new Column("create_time", FieldFill.INSERT),new Column("update_time", FieldFill.INSERT_UPDATE))
                    ; // 设置过滤表前缀
 
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }
}

 

2.3添加配置

a.启动类上添加一个Mapper扫描的注解MapperScan,用来配置需要扫描的mapper包所在的位置。

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @className: SpringBootApplication
 * @description: springboot启动类
 * @author: 沙漏倒装回忆1024
 * @date: 2022-10-23 14:36
 */
@SpringBootApplication
@MapperScan("com.项目路径.mapper")
public class SpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootApplication.class, args);
    }
}

b.添加Mybatis-Plus中的分页功能,加入分页拦截器的配置。

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
 * @className: MybatisPlusConfig
 * @description:
 * @author: 沙漏倒装回忆1024
 * @date: 2022-10-23 14:55
 */
@Configuration
public class MybatisPlusConfig {
    /**
     * 老版本,目前已失效
     * @return
     */
    /**@Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }*/
 
 
    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

c.自动填充create_time和update_time的配置类,配合实体类使用。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
 
import java.time.LocalDateTime;
 
/**
 * @className: MyMetaObjectHandler
 * @description:
 * @author: 沙漏倒装回忆1024
 * @date: 2022-10-23 14:57
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill...");
        this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
 
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill...");
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
}
/**
 * 创建时间
 */
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
 
/**
 * 更新时间
 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

 

4.常用Maybatis-Plus lambdaQuery和mapper中EQ、NE、GT、LT、GE、LE的用法及详解

1.等于当前时间
//EQ 就是 EQUAL等于
xxService.lambdaQuery().eq(xx实体类::getUpdateTime,DateUtil.now())

2.不等于当前时间
//NE就是 NOT EQUAL不等于
xxService.lambdaQuery().ne(xx实体类::getUpdateTime,DateUtil.now());

3.大于当前时间
//GT 就是 GREATER THAN大于
xxService.lambdaQuery().gt(xx实体类::getUpdateTime,DateUtil.now());

4.小于当前时间
//LT 就是 LESS THAN小于
xxService.lambdaQuery().lt(xx实体类::getUpdateTime,DateUtil.now());

5.大于等于当前时间
//GE 就是 GREATER THAN OR EQUAL 大于等于
xxService.lambdaQuery().ge(xx实体类::getUpdateTime,DateUtil.now());

6.小于等于当前时间
//LE 就是 LESS THAN OR EQUAL 小于等于
xxService.lambdaQuery().le(xx实体类::getUpdateTime,DateUtil.now());

7.2个时间段是否相交
if ((!startTime.after(endDate)) && (!endTime.before(startDate))) {
System.out.println("时间重叠");
}

8.限制条数limit 10
xxService.lambdaQuery().last("limit 10");

9.字段 IN ( sql语句 )
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue);

10.字段 NOT IN ( sql语句 )
notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)


11.拼接 EXISTS ( sql语句 )
exists(String existsSql)
exists(boolean condition, String existsSql)


12.拼接 NOT EXISTS ( sql语句 )
notExists(String notExistsSql)
notExists(boolean condition, String notExistsSql)


13.HAVING ( sql语句 )
having(String sqlHaving, Object... params)
having(boolean condition, String sqlHaving, Object... params)


14.拼接 sql
apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)

 

15.desc倒序

xxService.lambdaQuery().orderByDesc("id")

 

tips:请注意本文中代码没有指定package,因为每个项目的路径都不一样!

 

 

笔者: 沙漏倒装回忆1024

出处https://www.cnblogs.com/lpan1024/

版权所有,欢迎保留原文链接进行转载!

请点赞关注留言,如果有任何建议也可以留言,因为我会回复每一条评论,感谢阅读。

 

posted @ 2022-10-23 11:01  沙漏倒装回忆1024  阅读(202)  评论(0编辑  收藏  举报