Mybatis Plus 系列1 —— 起步


首先说明在这里我们不讨论mybatisjpa孰优孰劣的问题,毕竟这个问题已经争论很多年了,每个人都有自己的喜好和习惯,不做过多评价。在国内,使用mybatis的还是比jpa多,mybatis更加轻量级,上手快!从自己使用体验来讲,使用mybatis,在表上添加字段确实是一个痛点,相当麻烦,要修改实体类,xml等。虽然可以使用一些生成器来自动生成,但是还是有点麻烦。这里我们就体验一下mybatis plus,看看是否能提高我们编码的效率!

一. 简介

MyBatis-Plus(简称 MP)是一个 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

二. 快速开始

这里我使用spring boot来集成mybatis plus,使用Spring Initializer或者idea初始化应用。

目录结构:

.
├── HELP.md
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── generated
    │   ├── java
    │   │   └── cn
    │   │       └── justmr
    │   │           └── mybatisplus
    │   │               └── demo
    │   │                   ├── DemoApplication.java
    │   │                   ├── entity
    │   │                   │   ├── BaseEntity.java
    │   │                   │   └── User.java
    │   │                   └── mapper
    │   │                       └── UserMapper.java
    │   └── resources
    │       ├── application.yml
    │       ├── db
    │       │   ├── data-h2.sql
    │       │   └── schema-h2.sql
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── cn
                └── justmr
                    └── mybatisplus
                        └── demo
                            └── demo
                                ├── DemoApplicationTests.java
                                └── UserTests.java
1. build.gradle
plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

group = 'cn.justmr.mybatis-plus.demo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    // 为了加快速度,配置阿里镜像仓库
    maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
    mavenCentral()
}

ext {
    set('mybaitsPlusVersion', "3.4.2")
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    testCompileOnly 'org.projectlombok:lombok'
    // 这里采用内存数据库
    runtimeOnly 'com.h2database:h2'
    // 引入mybatis plus
    compile "com.baomidou:mybatis-plus-boot-starter:${mybaitsPlusVersion}"
    annotationProcessor 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}


test {
    useJUnitPlatform()
}
2. application.yml
spring:
  datasource:
    driver-class-name: org.h2.Driver
    # 启动应用后会自动执行该sql
    schema: classpath:db/schema-h2.sql
    # 启动应用后会自动执行该sql
    data: classpath:db/data-h2.sql
    url: jdbc:h2:mem:test
    username: test
    password: 123456
  h2:
    console:
      # 开启h2控制台
      enabled: true

# 这里根据需要配置
mybatis-plus:
  configuration:
  	# 打印日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 开启自动驼峰命名规则(camel case)映射,默认就是true
    map-underscore-to-camel-case: true
  global-config:
    db-config:
      # 插入策略 忽略 null
      insert-strategy: not_null
      # 更新策略 忽略 null
      update-strategy: not_null
  # 处理枚举    
  type-enums-package: cn.**.enums
3. 初始化表和数据

schema-h2.sql

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id          BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    name        VARCHAR(30) NOT NULL DEFAULT '' COMMENT '姓名',
    age         INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email       VARCHAR(50) NOT NULL DEFAULT '' COMMENT '邮箱',
    sex         varchar(10) NOT NULL DEFAULT '' COMMENT '性别',
    is_delete   TINYINT              default 0 not null comment '是否删除',
    create_time timestamp            default CURRENT_TIMESTAMP not null comment '创建时间',
    update_time timestamp            default CURRENT_TIMESTAMP not null comment '更新时间',
    PRIMARY KEY (id)
);

data-h2.sql

DELETE FROM user;

INSERT INTO user (name, age, email, sex) VALUES
('Jone', 18, 'test1@baomidou.com', 'MAIL'),
('Jack', 20, 'test2@baomidou.com', 'MAIL'),
('Tom', 28, 'test3@baomidou.com', 'MAIL'),
('Sandy', 21, 'test4@baomidou.com', 'FEMALE'),
('Billie', 24, 'test5@baomidou.com', 'FEMALE');
4. 编码
package cn.justmr.mybatisplus.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan("cn.justmr.mybatisplus.demo.mapper")
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}
package cn.justmr.mybatisplus.demo.mapper;

import cn.justmr.mybatisplus.demo.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserMapper extends BaseMapper<User> {
}
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class User extends BaseEntity {
    private String name;

    private Integer age;

    private String email;

    private String sex;
}

@Data
public class BaseEntity {
    /**
     * 数据库设置了 ID自增
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 逻辑删除字段
     */
    private Boolean isDelete;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

}
5. 测试
@Slf4j
@SpringBootTest
class UserTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        log.info("------ selectAll method test ------");
        // 查询全量数据
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }

}

运行结果:

...
2021-02-12 14:11:57.669  INFO [,,,] 24178 --- [           main] c.j.mybatisplus.demo.demo.UserTests      : ------ selectAll method test ------
2021-02-12 14:11:57.736 DEBUG [,,,] 24178 --- [           main] c.j.m.demo.mapper.UserMapper.selectList  : ==>  Preparing: SELECT id,name,age,email,sex,is_delete,create_time,update_time FROM user
2021-02-12 14:11:57.770 DEBUG [,,,] 24178 --- [           main] c.j.m.demo.mapper.UserMapper.selectList  : ==> Parameters: 
2021-02-12 14:11:57.804 DEBUG [,,,] 24178 --- [           main] c.j.m.demo.mapper.UserMapper.selectList  : <==      Total: 5
User(super=BaseEntity(id=1, isDelete=false, createTime=2021-02-12T14:11:54.279, updateTime=2021-02-12T14:11:54.279), name=Jone, age=18, email=test1@baomidou.com, sex=MAIL)
User(super=BaseEntity(id=2, isDelete=false, createTime=2021-02-12T14:11:54.279, updateTime=2021-02-12T14:11:54.279), name=Jack, age=20, email=test2@baomidou.com, sex=MAIL)
User(super=BaseEntity(id=3, isDelete=false, createTime=2021-02-12T14:11:54.279, updateTime=2021-02-12T14:11:54.279), name=Tom, age=28, email=test3@baomidou.com, sex=MAIL)
User(super=BaseEntity(id=4, isDelete=false, createTime=2021-02-12T14:11:54.279, updateTime=2021-02-12T14:11:54.279), name=Sandy, age=21, email=test4@baomidou.com, sex=FEMALE)
User(super=BaseEntity(id=5, isDelete=false, createTime=2021-02-12T14:11:54.279, updateTime=2021-02-12T14:11:54.279), name=Billie, age=24, email=test5@baomidou.com, sex=FEMALE)
...

三. 总结

看到这里,相对于mybatis来说,有改变的是配置项需要根据mybatis-plus的配置来定义,这里我们也没有写对应的SQL语句,只是简单的继承了接口BaseMapper,如下是该接口的结构:

BaseMapper

我们可以直接使用该接口里面的方法而不需要编写对应的sql!是不是很爽!

四. 参考


文章作者: shiv
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 shiv !
评论
  目录