MyBatisPlus快速上手教程视频配套笔记

配套视频地址: https://www.bilibili.com/video/BV1P24y1675x/

一、 概述

1. MyBatis-Plus是什么

MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

官方愿景

我们的愿景是成为 MyBatis 最好的搭档,就像 [魂斗罗] 中的 1P、2P,基友搭配,效率翻倍。
在这里插入图片描述

2. 特性

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

3. 支持数据库

任何能使用 MyBatis 进行 CRUD, 并且支持标准 SQL 的数据库

  • MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb,informix,TDengine,redshift
  • 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库

4. 框架结构

在这里插入图片描述



二、Hello World

1. 前置要求

  • 熟悉SSM
  • 熟悉SpringBoot
  • 熟悉Maven

2. 准备库和表

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, '张三', 18, '[email protected]'),
(2, '李四', 20, '[email protected]'),
(3, '王五', 28, '[email protected]'),
(4, '赵六', 21, '[email protected]'),
(5, '赵二狗', 24, '[email protected]');

3. SpringBoot项目

  1. pom

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.2</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    
  2. yml

    spring:
      datasource:
        username: root
        password: 123456
        url: jdbc:mysql:///mpdb
    
  3. entity

    @Data
    public class User implements Serializable {
          
          
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    
  4. mapper

    @Mapper  // 这里如果不加该注解,则可以在启动类上加@MapperScan("cn.lantu")
    public interface UserMapper extends BaseMapper<User> {
          
          
    }
    
  5. test

    @SpringBootTest
    class HelloMpApplicationTests {
          
          
    
        @Resource
        private UserMapper userMapper;
    
        @Test
        void getUsers() {
          
          
            List<User> users = userMapper.selectList(null);
            users.forEach(System.out::println);
        }
        
        // ID值默认为雪花算法
        // 若要使用表自增,则再实体类id字段加@TableId(type = IdType.AUTO)
        @Test
        void addUser() {
          
          
            User user = new User(null,"刘大葱",28,"[email protected]");
            userMapper.insert(user);
            
        }
        
        @Test
        void updateUser() {
          
          
            User user = new User(1L,"张三疯了",28,"[email protected]");
            userMapper.updateById(user);
        }
        
        @Test
        void deleteUser() {
          
          
            userMapper.deleteById(7L);
        }
    
    }
    


三、注解

@TableName

表名注解,标识实体类对应的表

@TableId

主键注解

其中,IdType主键类型说明

描述
AUTO 数据库 ID 自增
NONE 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUT insert 前自行 set 主键值
ASSIGN_ID 分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID 分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)

@TableField

字段注解

属性 默认值 描述
value “” 数据库字段名
exist true 是否为数据库表字段
select true 是否进行 select 查询

@TableLogic

表字段逻辑处理注解(逻辑删除)

属性 类型 描述
value String 逻辑未删除值
delval String 逻辑删除值

使用步骤:

  1. yml

    mybatis-plus:
      global-config:
        db-config:
          logic-delete-field: deleted       # 全局逻辑删除的实体字段名,配置后可不用@TableLogic注解
          logic-delete-value: 1             # 逻辑已删除
          logic-not-delete-value: 0         # 逻辑未删除
    
  2. entity

    @TableLogic
    private String deleted;
    

@Version

乐观锁注解,当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:

  • 取出记录时,获取当前 version
  • 更新时,带上这个 version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果 version 不对,就更新失败

使用步骤:

  1. 为表新增字段:version,balance

  2. config

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
          
          
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
    
  3. entity

    @Version
    private Integer version;
    private Integer balance;
    
  4. 断点调试

    @SpringBootTest
    public class LockTest {
          
          
        @Resource
        private UserMapper userMapper;
    
        @Test
        public void  lockA(){
          
          
            User user = userMapper.selectById(6);
            user.setBalance(user.getBalance()-10);
            userMapper.updateById(user);
        }
    
        @Test
        public void  lockB(){
          
          
            User user = userMapper.selectById(6);
            user.setBalance(user.getBalance()-20);
            userMapper.updateById(user);
        }
    }
    


四、查询

1. 分页查询

  1. 配置分页拦截器

    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    
  2. 查询前设置分页参数

    IPage page = new Page<>(2, 3);
    userMapper.selectPage(page, null);
    List records = page.getRecords();
    records.forEach(System.out::println);
    

2. 条件构造器

  1. 常规使用

    // 查询年龄>20,姓赵,降序
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper
        .lt("age",25)
        .likeRight("name","赵")
        .orderByDesc("id");
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
    
  2. 推荐使用

    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper
        .lt(User::getAge,25)
        .likeRight(User::getName,"赵")
        .orderByDesc(User::getId);
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
    


五、代码生成器

  1. pom

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.5.2</version>
    </dependency>
    
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
    </dependency>
    
  2. java

    FastAutoGenerator.create("jdbc:mysql:///mpdb", "root", "123456")
                    .globalConfig(builder -> {
          
          
                        builder.author("lantu") // 设置作者
                                //.enableSwagger() // 开启 swagger 模式
                                //.fileOverride() // 覆盖已生成文件
                                .outputDir("D:\\tmp\\spring\\hello-mybatisplus\\src\\main\\java"); // 指定输出目录
                    })
                    .packageConfig(builder -> {
          
          
                        builder.parent("com.lantu") // 设置父包名
                                .moduleName("user") // 设置父包模块名
                                .pathInfo(Collections.singletonMap(OutputFile.xml, "D:\\tmp\\spring\\hello-mybatisplus\\src\\main\\resources\\user" )); // 设置mapperXml生成路径
                    })
                    .strategyConfig(builder -> {
          
          
                        builder.addInclude("xxx_user_info,xxx_dept_info") // 设置需要生成的表名
                                .addTablePrefix("xxx_"); // 设置过滤表前缀
                    })
                    .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                    .execute();
    

猜你喜欢

转载自blog.csdn.net/m0_37613503/article/details/128895820