乐趣区

关于后端:赶紧收藏吧MyBatisPlus万字长文图解笔记错过了这个村可就没这个店了

简介

MyBatis-Plus(简称 MP)是一个 MyBatis 的加强工具,在 MyBatis 的根底上只做加强不做扭转,为简化开发、提高效率而生

愿景

咱们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

个性

  • 无侵入:只做加强不做扭转,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会主动注入根本 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 操作智能剖析阻断,也可自定义拦挡规定,预防误操作

框架结构

疾速入门

  • 创立数据库表(mybatis——plus)
  • 创立 user 表 **
DROP TABLE IF EXISTS user;
CREATE TABLE user
(id BIGINT(20) NOT NULL COMMENT '主键 ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');  
  • 编写我的项目,初始化我的项目!应用 SpringBoot 初始化!
  • 导入依赖
<!-- 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<!-- mybatis-plus -->
<!-- 只用 mybatis-plus 即可,不必再导入 mybatis -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
  • yml 文件中配置数据库 **
spring:
  datasource:
    password: 123456
    username: root
    url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    driver-class-name: com.mysql.jdbc.Driver
  • 编写 pojo 类,mapper 接口 **
  • pojo
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
  • mapper 接口,继承 BaseMapper

    @Repository // 代表是长久层
    public interface UserMapper extends BaseMapper<User> {// 外面不须要写货色}
    
  • 启动类增加 mapper 扫描

    @MapperScan("com.alan.mybatis.plus.mapper")
    
  • 在测试类中测试

    @SpringBootTest
    class MybatisPlusApplicationTests {
        @Autowired
        private UserMapper userMapper;
    
        @Test
        void contextLoads() {
            // 查问
            List<User> users = userMapper.selectList(null);
            users.forEach(System.out::println);
        }
    
    }
    
  • 后果

  • 增加日志
  • 配置 yml

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

CRUD 扩大

插入操作

Insert 插入

@Test
public void testInsert(){User user = new User();
    user.setName("图灵");
    user.setAge(20);
    user.setEmail("123345567@qq.com");
    //result 是影响行数
    int result = userMapper.insert(user);
    System.out.println(result);
    // 会主动 id 回填,默认雪花算法
    System.out.println(user);
}

数据库插入的 id 的默认值为:全局的惟一的 id

主键生成策略

1、雪花算法:

snowflake 是 Twitter 开源的分布式 ID 生成算法,后果是一个 long 型的 ID。其核心思想是:应用 41bit 作为
毫秒数,10bit 作为机器的 ID(5 个 bit 是数据中心,5 个 bit 的机器 ID),12bit 作为毫秒内的流水号(象征
着每个节点在每毫秒能够产生 4096 个 ID),最初还有一个符号位,永远是 0。能够保障简直寰球唯
一!

2、主键自增

2.1 须要在实体类字段上增加@TableId(type = IdType.AUTO)

2.2 数据库对应的字段肯定要是自增的

2.3 后果

其余的源码解释

public enum IdType {AUTO(0),// 数据库 id 自增
    NONE(1),// 未设置主键
    INPUT(2),// 手动输出
    ID_WORKER(3),// 默认的全局惟一 id
    UUID(4),// 全局惟一 id uuid
    ID_WORKER_STR(5);//ID_WORKER 字符串表示法 
}

更新操作


@Test
public void testUpdate(){User user = new User();
    user.setId(1334744418774695938L);
    // 这里只改年龄
    user.setAge(19);
    int i = userMapper.updateById(user);
    System.out.println(i);
}

更新操作是动静 SQL

主动填充


创立工夫、批改工夫!这些个操作一遍都是自动化实现的,咱们不心愿手动更新!
阿里巴巴开发手册:所有的数据库表:gmt_create、gmt_modified 简直所有的表都要配置上!而且须要自动化!

代码级别

  • 批改数据库

  • 批改实体类,在工夫属性上增加注解
Data
@AllArgsConstructor
@NoArgsConstructor
public class User {@TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date UpdateTime;
}

@TableField(fill = FieldFill.INSERT) 在创立新这条数据时,更新工夫。

@TableField(fill = FieldFill.INSERT_UPDATE),在创立和更新这条数据时,更新工夫。

  • 编写配置类

    @Slf4j
    @Component // 该注解时把该类增加到 IOC 容器中
    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);
        }
    }
    

别离运行增加和批改,后果:

分页查问

1、编写配置类,拦截器

package com.alan.mybatis.plus.config;

import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

/**
 * @Author Alan Ture
 * @Description
 */
@Configuration
public class MyBatisPlusConfig {
    /**
     * 分页插件
      */
    @Bean
    public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();
    }

}

2、间接应用 Page 对象即可。

// 分页测试查问
@Test
public void testPage(){
    // 参数一:当前页
    // 参数二:页面大小
    Page<User> page = new Page<>(1,5);
    userMapper.selectPage(page,null);
    page.getRecords().forEach(System.out::println);
    System.out.println(page.getTotal());
}

删除操作

1、依据 id 删除记录

// 测试删除
@Test
public void testDeleteById(){userMapper.deleteById(1334744418774695938L);
}

// 通过 id 批量删除
@Test
public void testDeleteBatchId(){userMapper.deleteBatchIds(Arrays.asList(1334745985150111745L,1334745985150111746L));
}
// 通过 map 删除
@Test
public void testDeleteMap() {HashMap<String, Object> map = new HashMap<>();
    map.put("name", "图灵");
    userMapper.deleteByMap(map);
}

逻辑删除

物理删除:从数据库中间接移除
逻辑删除:再数据库中没有被移除,而是通过一个变量来让他生效!deleted = 0 => deleted = 1

1、数据库增加字段

2、实体类增加字段,并增加注解

@TableLogic// 逻辑删除
private Integer deleted;

3、配置类配置

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

4、yml 配置(删除为 0,没有删除为 1)

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      logic-delete-value: 0
      logic-not-delete-value: 1

5、测试删除

// 测试删除
@Test
public void testDeleteById(){userMapper.deleteById(1L);
}

理论走的是更新操作

后果

性能剖析插件

咱们在平时的开发中,会遇到一些慢 sql。测试!druid,
作用:性能剖析拦截器,用于输入每条 SQL 语句及其执行工夫
MP 也提供性能剖析插件,如果超过这个工夫就进行运行!

1、导入插件(记住,要在 SpringBoot 中配置环境为 dev 或者 test 环境!)

properties.yml 设置开发环境

spring:
  profiles:
    active: dev
/**
  * SQL 执行效率插件
  * 设置 dev test 环境开启,保障咱们的效率
  */
@Bean
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor() {
    PerformanceInterceptor performanceInterceptor = new
        PerformanceInterceptor();
    // ms 设置 sql 执行的最大工夫,如果超过了则不执行
    performanceInterceptor.setMaxTime(10);
    // 是否格式化代码
    performanceInterceptor.setFormat(true);
    return performanceInterceptor;
}

2、测试应用(超过规定工夫会报异样)

条件结构器 Wrapper

咱们写一些简单的 sql 就能够应用它来代替!

1、测试一,isNotNull 不为空,ge 大于等于

@Test
public void contextLoads() {
// 查问 name 不为空的用户,并且邮箱不为空的用户,年龄大于等于 12
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper
            .isNotNull("name")
            .isNotNull("email")
            .ge("age",20);
    userMapper.selectList(wrapper).forEach(System.out::println);
    // 和咱们方才学习的 map 比照一下

}

2、测试二,eq 查问相等数据

@Test
public void test2(){
    // 查问名字 Jone
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("name","Jone");
    User user = userMapper.selectOne(wrapper);
    // 查问一个数据,呈现多个后果应用 List 或者 Map
    System.out.println(user);
}

代码主动生成器

package com.alan.mybatis.plus;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
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 GenCode {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("Alan Ture");
        gc.setOpen(false);
        gc.setFileOverride(false); // 是否笼罩
        gc.setServiceName("%sService"); // 去 Service 的 I 前缀
        gc.setIdType(IdType.ID_WORKER);
        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&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);
//3、包的配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("blog");
        pc.setParent("com.alan");
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);
//4、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("user"); // 设置要映射的表名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true); // 主动 lombok;strategy.setLogicDeleteFieldName("deleted");
// 主动填充配置
        TableFill gmtCreate = new TableFill("create_time", FieldFill.INSERT);
        TableFill gmtModified = new TableFill("update_time",
                FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreate);
        tableFills.add(gmtModified);
        strategy.setTableFillList(tableFills);
// 乐观锁
//        strategy.setVersionFieldName("version");
//        strategy.setRestControllerStyle(true);
//        strategy.setControllerMappingHyphenStyle(true); //localhost:8080/hello_id_2
        mpg.setStrategy(strategy);
        mpg.execute(); // 执行}
}

最初

最初提供收费的 Java 架构学习材料,学习技术内容蕴含有:Spring,Dubbo,MyBatis, RPC, 源码剖析,高并发、高性能、分布式, 性能优化,微服务 高级架构开发等等。欢送关注我的公众号:前程有光获取!

退出移动版