MyBatis Plus详细教程

2024-02-26 1099阅读

温馨提示:这篇文章已超过414天没有更新,请注意相关的内容是否还可用!

目录

一、什么是MybatisPlus

二、快速入门

2.1、创建数据库mybatis_plus

2.2、创建user表

2.3、插入数据

2.4、初始化项目

2.5、添加依赖

2.6、配置(连接数据库)

2.7、编码

2.8、开始使用

2.9、小结

三、配置日志

四、CRUD

4.1、插入测试

4.2、自定义ID生成器

4.2.1、UUID

4.2.2、SnowFlake(雪花算法)

4.3、更新操作

五、自动填充

5.1、什么是自动填充

5.2、自动填充方式

六、乐观锁和悲观锁

6.1、什么是乐观锁

6.2、什么是悲观锁

6.3、配置乐观锁

6.3.1、数据库中添加version字段

6.3.2、同步实体类

6.3.3、配置插件

6.3.4、测试乐观锁

七、增删改查

7.1、查询操作

7.2、分页查询

7.3、删除操作

7.4、逻辑删除

八、执行SQL分析打印

8.1、p6spy依赖引入

8.2、application.yml配置

8.3、spy.properties配置

8.4、测试

九、条件构造器

9.1、代码演示

十、代码自动生成器

10.1、EasyCode

10.2、功能

10.3、操作


一、什么是MybatisPlus

为什么要学MybatisPlus?

MybatisPlus可以节省大量时间,所有的CRUD代码都可以自动化完成

MyBatis-Plus是一个MyBatis的增强工具,在 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

    二、快速入门

    2.1、创建数据库mybatis_plus

    2.2、创建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)
    );

    2.3、插入数据

    DELETE FROM user;
    ​
    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');

    2.4、初始化项目

    快速初始化一个空的spring boot 项目

    2.5、添加依赖

    引用spring boot starter 父工程

        org.springframework.boot
        spring-boot-starter-parent
        2.6.5
        
    

    引入spring-boot-starter、spring-boot-starter-test、mybatis-plus-boot-starter、h2依赖:

        
            org.springframework.boot
            spring-boot-starter
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.5.1
        
        
            mysql
            mysql-connector-java
        
    

    注意:尽量不要同时导入mybatis和mybatis_plus,版本差异

    2.6、配置(连接数据库)

    在application.yml配置文件中添加MySQL数据库的相关配置:

    # DataSource Config
    spring:
      datasource:
        username: root
        password: 123456
        url: jdbc:mysql:///mybatis_plus?userUnicode=true&characterEncoding=utf-8
        driver-class-name: com.mysql.cj.jdbc.Driver

    在spring boot启动类中添加@MapperScan注解,扫描Mapper文件夹:

    @SpringBootApplication
    @MapperScan("com.wen.mybatis_plus.mapper")  //扫描mapper
    public class MybatisPlusApplication {
    ​
        public static void main(String[] args) {
            SpringApplication.run(MybatisPlusApplication.class, args);
        }
    ​
    }

    2.7、编码

    编写实体类User.java(此处使用Lombok简化代码)

    import lombok.Data;
    ​
    @Data
    public class User {
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }

    编写Mapper包下的UserMapper接口

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.wen.mybatis_plus.pojo.User;
    import org.apache.ibatis.annotations.Mapper;
    ​
    //再对应的mapper上面实现基本的接口 BaseMapper
    @Mapper
    public interface UserMapper extends BaseMapper {
        //所有的CRUD都已经完成
        //不需要像以前一样配置一大堆文件:pojo-dao(连接mybatis,配置mapper.xml文件)==>service-controller
    }

    注意:

    要在主启动类上去扫描mapper包下的所有接口:@MapperScan("com.wen.mybatis_plus.mapper")

    2.8、开始使用

    添加测试类,进行功能测试:

    @SpringBootTest
    class MybatisPlusApplicationTests {
    ​
        //继承了BaseMapper所有的方法,可以编写自己的扩展方法
        @Autowired
        private UserMapper userMapper;
    ​
        @Test
        public void testSelect(){
            System.out.println("--------selectAll method test-------");
            //查询全部用户,参数是一个Wrapper,条件构造器,先不使用为null
            List userList = userMapper.selectList(null);
            userList.forEach(System.out::println);
        }

    提示:

    UserMapper中的selectList()方法的参数为MP内置的条件封装器Wrapper,所以不填写就是无任何条件。

    控制台输出:

    User(id=1, name=Jone, age=18, email=test1@baomidou.com) User(id=2, name=Jack, age=20, email=test2@baomidou.com) User(id=3, name=Tom, age=28, email=test3@baomidou.com) User(id=4, name=Sandy, age=21, email=test4@baomidou.com) User(id=5, name=Billie, age=24, email=test5@baomidou.com)

    2.9、小结

    以上几个步骤就已经实现User表的CRUD功能,甚至连XML文件都不用编写,以上步骤可以看出集成MyBatis-Plus非常的简单,只需要引入starter工程,并配置mapper扫描路径即可。方法都是MyBatis-Plus写好的,直接引用即可。

    三、配置日志

    所有的SQL都是不可见的,所以在后台是希望看到SQL是怎么执行的,就必须要配置日志。

    在.yml配置文件中配置日志:

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

    MyBatis Plus详细教程

    四、CRUD

    4.1、插入测试

    //测试插入
    @Test
    public void testInsert(){
        User user = new User();
        user.setName("小文");
        user.setAge(21);
        user.setEmail("2312103645@qq.com");
    ​
        int insert = userMapper.insert(user);//如果没有设置id,那么会自动生成id
        System.out.println(insert);//受影响行数
        System.out.println(user);//id会自动回填
    }

     MyBatis Plus详细教程

    数据库插入ID默认值为全局唯一ID

    4.2、自定义ID生成器

    在复杂分布式系统中,往往需要大量的数据和消息进行唯一标识。比如支付宝每一个账号在数据库分表后都需要有一个唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。

    所以,生成的ID需要具备一下特点:

    1. 全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。

    2. 趋势递增:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B-tree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能。

    3. 单调递增:保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求。

    4. 信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道我们一天的单量。所以在一些应用场景下,会需要ID无规则、不规则。

    上述123对应三类不同的场景,3和4需求还是互斥的,无法使用同一个方案满足。

    在这里只讲两种自动生成ID的方案UUID和SnowFlake

    可以查看有哪些方法,查看源码:

    在用户ID上添加@TableId注解,里面的值便是使用主键自动生成的方法

    自 3.3.0 开始,默认使用雪花算法+UUID(不含中划线)

    @Data
    public class User {
        //对应数据库中的主键(UUID、自增id、雪花算法、redis、zookeeper)
        @TableId(type = IdType.ASSIGN_ID)
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }

    点击 IdType查看源码看有哪些自动生成方法

    /**
     * 生成ID类型枚举类
     *
     * @author hubin
     * @since 2015-11-10
     */
    @Getter
    public enum IdType {
        /**
         * 数据库ID自增
         * 

    该类型请确保数据库设置了 ID自增 否则无效

        */    AUTO(0),    /**     * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)     */    NONE(1),    /**     * 用户输入ID     *

    该类型可以通过自己注册自动填充插件进行填充

        */    INPUT(2), ​    /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */    /**     * 分配ID (主键类型为number或string),     * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)     *     * @since 3.3.0     */    ASSIGN_ID(3),    /**     * 分配UUID (主键类型为 string)     * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))     */    ASSIGN_UUID(4); ​    private final int key; ​    IdType(int key) {        this.key = key;   } }

    4.2.1、UUID

    UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前为止业界一共有5种方式生成UUID,详情见IETF发布的UUID规范 A Universally Unique IDentifier (UUID) URN Namespace。

    优点:

    • 性能非常高:本地生成,没有网络消耗。

      缺点:

      • 没有排序,无法保证趋势递增。

      • UUID往往使用字符串存储,查询的效率比较低。

      • 不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用。

      • 信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。

      • ID作为主键时在特定的环境会存在一些问题,比如做DB主键的场景下,UUID就非常不适用:

        • MySQL官方有明确的建议主键要尽量越短越好[4],36个字符长度的UUID不符合要求。

        • 对MySQL索引不利:如果作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。

        4.2.2、SnowFlake(雪花算法)

        这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等,比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示:

        MyBatis Plus详细教程

        41-bit的时间可以表示(1L

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]