当前位置:   article > 正文

Mybatis-Plus(version:3.0.5)——b站狂神版本学习笔记_mybatisplus generator 3.0.5

mybatisplus generator 3.0.5

Mybatis-Plus(version:3.0.5)

简介

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

特性
  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作,BaseMapper
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求,简单的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 操作智能分析阻断,也可自定义拦截规则,预防误操作

快速开始

  1. 导入对应的依赖
  2. 研究依赖如何配置
  3. 代码如何编写
  4. 扩展提高

步骤

  1. 新建一个数据库mybatis_plus

    CREATE DATABASE `itbiancheng` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    
    • 1
  2. 创建一个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)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    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');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  3. 添加依赖

    pom.xml中添加:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  4. 配置yaml文件和@MapperScan

    application.yaml配置数据源:

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimeZone=GMT%2B8
        username: root
        password: 123456 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Application.java中配置@MapperScan

    @SpringBootApplication
    @MapperScan("com.lichaoyang.mapper")
    public class MybatisPlusApplication {
        public static void main(String[] args) {
            SpringApplication.run(MybatisPlusApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  5. 编写是实体类和接口

    User.java中编写实体类:

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {
        @TableId(type = IdType.ID_WORKER)
        private Long id;
        private String name;
        private String age;
        private String email;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    编写Mapper类 UserMapper.java

    Tips:使用@Mapper可以简化@MapperScan

    @Mapper // 使用@Mapper可以简化@MapperScan
    //@Repository // 表示该层是持久化
    // 继承父类BaseMapper<T> T:是传入实体类
    public interface UserMapper extends BaseMapper<User> {
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  6. 传统方式pojo-dao(连接mybatis,配置mapper.xml文件)-service-controller

  7. 使用mybatis-plus

    @SpringBootTest
    class MybatisPlusApplicationTests {
        @Autowired
        private UserMapper userMapper;
        @Test
        void contextLoads() {
            // 参数一个 wapper,条件构造器,默认值为null
            // 查询全部用户
            List<User> users = userMapper.selectList(null);
            users.forEach(System.out::println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

CRUD 接口 | MyBatis-Plus

配置日志

# 配置日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  • 1
  • 2
  • 3
  • 4

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9LWkIeuu-1663317694952)(en-resource://database/573:1)]

CRUD

insert插入

@Test
public void TestInsert() {
    User user = new User();
    user.setName("test");
    user.setAge("1");
    user.setEmail("test@test.com");

    int result = userMapper.insert(user); // 自动生成id
    System.out.println(result); // 受影响的行数
    System.out.println(user); // 打印的id自动回填
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1k0oy29y-1663317694954)(en-resource://database/575:1)]

数据库插入的id默认值唯一

主键生成策略

分布式唯一id生成:唯一ID生成算法剖析,看看这篇就够了 - 腾讯云开发者社区-腾讯云 (tencent.com)

默认 ID_WORKER 全局唯一id

雪花算法(snowflake)最早是twitter内部使用分布式环境下的唯一ID生成算法。

主键自增

  1. 在实体类字段上配置Table(type=Idtype.Auto)
  2. 数据库字段一定是自增

其余的属性

/**
 * 数据库ID自增
 */
AUTO(0),
/**
 * 该类型为未设置主键类型
 */
NONE(1),
/**
 * 用户输入ID
 * 该类型可以通过自己注册自动填充插件进行填充
 */
INPUT(2),

/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
 * 全局唯一ID (idWorker)
 */
ID_WORKER(3),
/**
 * 全局唯一ID (UUID)
 */
UUID(4),
/**
 * 字符串全局唯一ID (idWorker 的字符串表示)
 */
ID_WORKER_STR(5);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Update更新

MP会自动将更新操作设置为动态SQL

@Test
public void TestUpdate() {
    
    User user = new User();
    // 通过条件自动拼接动态SQL
    user.setId(7L);
    user.setName("test");

    int updateById = userMapper.updateById(user);
    System.out.println(updateById);
    System.out.println(user);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
自动填充功能

创建、修改时间都可以自动更新。

阿里开发手册:所有的数据库表 => gmt_create、gmt_modified都需要配置,而且需要自动化填充

方式1:数据库级别修改(工作不能动库)

  1. 在数据库表中新增字段create_time、update_time

  2. 再测一下insert方法,记得同步实体类

    private LocalTime createTime;
    private LocalTime updateTime;
    
    • 1
    • 2

方式2:代码级别修改

  1. 实体类字段添加注解

    // 插入时候填充时间
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    // 插入更新填充时间
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime  updateTime;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  2. 编辑一个处理器

    @Slf4j
    @Component // 注册为spring组件 切记
    public class MyMetaObjectHandler implements MetaObjectHandler {
        private final static LocalDateTime DATE_TIME = LocalDateTime.now();
        @Override
        public void insertFill(MetaObject metaObject) {
          log.info("start insert fill...");
            this.setFieldValByName("createTime",DATE_TIME , metaObject);
            this.setFieldValByName("updateTime", DATE_TIME, metaObject);
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            log.info("start update fill...");
            this.setFieldValByName("updateTime", DATE_TIME, metaObject);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  3. 测试插入观察时间

乐观锁

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

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败
  1. 数据库新增version字段默认值为1

  2. 同步实体类增加注解@version

    // 乐观锁
    @Version 
    private Integer version;
    
    • 1
    • 2
    • 3
  3. 配置config

    // 管理事务
    @EnableTransactionManagement
    @Configuration
    public class MybatisConfig {
    
        // 乐观锁插件
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  4. 测试

    成功:

    // 测试乐观锁成功
    @Test
    public void TestOptimisticLocker() {
        // 1. 查询用户信息
        User user = userMapper.selectById(1L);
        // 2. 修改用户信息
        user.setName("test");
        user.setEmail("78@qq.com");
        // 3. 执行更新操作
        userMapper.updateById(user);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/201455
推荐阅读
相关标签
  

闽ICP备14008679号