MP1️⃣简介 & 环境搭建

1、MyBatis Plus

MyBatis-Plus(简称 MP)是一个基于 MyBatis 的增强工具,为简化开发、提高效率而生。

image-20220521223417237

1.1、特点

  • 无侵入:在 MyBatis 基础上只做增强不做改变,不影响现有工程。
  • 损耗小:自动注入基本 CRUD,性能基本无损耗,直接面向对象操作。
  • 支持多种数据库:MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等。

1.2、强大的 CRUD 操作

  • 内置通用 Mapper、通用 Service。
  • 通过少量配置实现单表基本 CRUD 操作,强大的条件构造器(Wrapper)满足各类使用需求。
  • 支持 Lambda:通过方法引用,简化查询条件的书写,避免硬编码。

1.3、强大功能支持

  • 主键自动生成:支持 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置。
  • ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作。
  • 自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。

1.4、内置插件

  • 代码生成器:采用代码或 Maven 插件可快速生成 Mapper、Model、Service、Controller 层代码,支持模板引擎,自定义配置。
  • 分页插件:基于物理分页LIMIT),仅需配置分页拦截器并调用相应方法。
  • 性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速定位慢查询。
  • 全局拦截插件:提供全表 delete、update 操作智能分析阻断,也可自定义拦截规则,预防误操作。

2、环境搭建(❗)

基于 Spring Boot 开发

示例:User(id, name, password, age)

  1. 创建数据库表
  2. 搭建 Spring Boot 项目
  3. 配置
  4. 创建实体类
  5. 编写 DAO

2.1、数据库表

为便于学习,没有考虑设计规范(如:区分业务/逻辑主键,create_time,update_time)

主键、用户名、密码、年龄

CREATE TABLE `mp_user` (
  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` VARCHAR(16) NOT NULL COMMENT '用户名',
  `password` VARCHAR(32) NOT NULL COMMENT '密码',
  `age` INT(3) NOT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
);

2.2、Spring Boot 项目

  1. 创建项目:若创建失败,修改此处的 service URL 为

    https://start.springboot.io
    

    image-20220521231508768

  2. 选择项目存放路径,Finish

  3. 导入依赖: MySQL、MyBatis Plus、Druid 数据源、Lombok

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.1</version>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.8</version>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    

Hint:MP 依赖会自动导入MyBatisMyBatis整合Spring

不要手动导入这 2 个依赖,避免(版本)冲突

image-20220522002253481

2.3、配置

application.yml

  • 数据源配置:驱动名,URL,账号密码,连接池类型

  • MP 配置

    • configuration(在 mybatismybatis-plus 下配置都可)

      • 命名风格映射:将数据库表的下划线命名风格,映射为 Java 的小驼峰命名风格。
      • 日志:便于调试。
    • global-config:数据库配置 - 表前缀(见 3.3 说明)。

      spring:
        datasource:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/数据库名?参数
          username: 账号
          password: 密码
          type: com.alibaba.druid.pool.DruidDataSource
      mybatis-plus:
        configuration:
          map-underscore-to-camel-case: true
          log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        global-config:
          db-config:
            table-prefix: t_
      

2.4、实体类

indi/jaywee/entity

ORM 原则:实体类与数据库表的属性(字段)名、类型对应。

@Data
// @tableName("mp_user")
public class User {
    private Long id;
    private String name;
    private String password;
    private int age;
}

2.5、DAO

2.5.1、DAO 接口

Hint:继承 BaseMapper<E>,泛型表示要操作的实体。

public interface UserDao extends BaseMapper<User>{
}

不需要编写 Mapper.xml 和 SQL,此时 UserDao 已获得 CRUD 功能。

2.5.2、注册

两种方式

  1. Dao 接口上添加 @Mapper 注解,前提是 Dao 接口位于 Spring Boot 启动类的同级包或子包下。

    @Mapper
    public interface UserDao extends BaseMapper<User>{
    }
    
  2. Spring Boot 启动类上添加 @MapperScan 注解,指定 Dao 接口所在包(建议)。

    @SpringBootApplication
    @MapperScan("indi.jaywee.dao")
    public class MpApplication {
        public static void main(String[] args) {
            SpringApplication.run(MpApplication.class, args);
        }
    }
    

此时 UserDao 已被 Spring 容器托管。

3、说明

3.1、Spring Boot

  • 创建失败:修改 service URL。

    https://start.springboot.io
    
  • 版本兼容:版本过高可能导致驱动报错,降低版本。

  • 依赖冲突:引入 MP 依赖后不要手动导入 MyBatis 和 mybatis-spring 依赖,避免版本冲突。

3.2、MySQL

  • MySQL 8 + 时区问题:追加 URL 属性(serverTimeZone),或修改 MySQL 配置文件(my.ini)

  • 驱动名

    // MySQL 8-
    com.mysql.jdbc.Driver
    // MySQL 8+
    com.mysql.cj.jdbc.Driver
    

3.3、映射问题(❗)

3.3.1、表名

MP 默认将实体类名的首字母小写作为表名。

实际业务中,数据库表名通常带有自定义前缀(如 t_sys_ 等)

两种配置方式:

  • 全局配置:核心配置类中添加 table-prefix 属性,在首字母小写的基础上添加前缀

    mybatis-plus:
      global-config:
        db-config:
          table-prefix: t_
    
  • 个别配置:实体类上添加 @TableName 注解,指定具体表名

    @tableName("t_user")
    public class User {
    }
    

3.3.2、字段

entity 和 数据库表的字段命名风格

  • entity:小驼峰命名
  • 数据库表:下划线分隔

两种配置方式

  • 自动映射application.yml 配置,自动映射字段命名风格。

    mybatis-plus:
      configuration:
        map-underscore-to-camel-case: true
    
  • 手动配置:属性上添加 @TableField 注解,指定具体字段名。

    @TableField("xxx")
    

3.3.3、@TableField

常用属性

  • value:字段名

  • exist:是否为数据库字段

    • 由于业务需要,entity 中可能定义了数据库表不存在的字段。
    • 为了避免 MP 查询时找不到该字段而导致报错,需要添加该注解。
  • select:是否被查询

    • MP 默认会查询所有字段(SELECT *

    • 处于安全/权限考虑,部分字段(如密码)不应被查询。

      @TableField(select = false)
      private String password;
      
posted @ 2022-05-22 12:08  Jaywee  阅读(405)  评论(0编辑  收藏  举报

👇