Mybatis-plus

一、简介

MyBatis-Plus(简称MP)是一个MyBatis的增强工具,它在MyBatis的基础上只做增强而不做改变,目的是简化开发、提高效率。MyBatis-Plus提供了许多便捷的功能,如强大的CRUD操作、支持多种主键策略、内置代码生成器、分页插件、性能分析插件等。

二、MyBatis-Plus与MyBatis的区别

  1. 实现方式不同‌:
    • MyBatis是基于XML或注解方式进行数据库操作的持久化框架,它提供了简单的CRUD操作及动态SQL生成等功能。而MyBatis-Plus是在MyBatis框架上的封装,通过对于增强简化后的API更加方便地进行开发,并且在性能、效率和易用性上都有优化。
    • MyBatis-Plus封装了一些简单的SQL,只需要数据模型类继承Model类,便可以直接使用数据模型对象直接调用单表的增删改查的方法。
  2. 功能差异‌:
    • MyBatis相对较为原始,需要手写大量的SQL以完成各种功能的实现。而MyBatis-Plus提供了很多额外的功能,例如条件构造器、代码生成器、分页插件、性能分析拦截器等实用的组件,使得开发者可以轻松快速完成业务逻辑的开发。
    • MyBatis-Plus支持所有MyBatis的原生特性,并提供了ActiveRecord等核心特性,实现了数据库表和数据模型类的映射、数据模型对象和数据库记录的映射,以及数据模型对象属性和数据库记录的字段的映射。
  3. 编程风格‌:
    • MyBatis的编程风格更加传统,需要定义mapper.xml文件并根据传入的参数使用相应的SQL查询语句,需要实现MyBatis提供的各种方法。
    • MyBatis-Plus具有许多针对CRUD进行的简化方法,通过继承BaseMapper以及使用Lambda表达式,可以让我们像SpringDataJPA类似地使用接口编程方式进行数据库操作。

三、MyBatis与Hibernate‌区别

  1. 自动化程度:
    • MyBatis‌:它是一个半自动化的ORM框架。虽然它也支持对象与数据库表之间的映射,但开发者需要手动编写SQL语句,这使得MyBatis在SQL的灵活性和优化上具有更大的空间。
    • Hibernate‌:它是一个全自动化的对象关系映射(ORM)框架。开发者只需定义好POJO(Plain Old Java Objects,普通老式Java对象)与数据库表之间的映射关系,Hibernate便能自动生成SQL语句并执行,大大减轻了编写SQL的工作量。
  2. 灵活性与优化:
    • ‌MyBatis‌:MyBatis允许开发者直接编写SQL,这使得SQL的优化和定制变得非常灵活。开发者可以根据实际需求对SQL进行精细调整,以达到最佳性能。
    • Hibernate‌:由于Hibernate自动生成SQL,开发者对SQL的控制力相对较弱。在某些复杂查询或性能优化场景中,Hibernate可能不是最优选择。
  3. 缓存机制:
    • MyBatis‌:MyBatis也支持一级缓存和二级缓存,但其二级缓存的配置相对更为灵活,开发者可以根据实际需求为不同的表配置不同的缓存策略。
    • Hibernate‌:Hibernate内置了一级缓存(Session级别的缓存)和可选的二级缓存(SessionFactory级别的缓存),这些缓存机制有助于提高数据访问性能。
  4. 数据库移植性:
    • MyBatis‌:虽然MyBatis也支持多种数据库系统,但由于其需要手动编写SQL语句,因此在移植到不同数据库时可能需要修改部分SQL语句以适应新的数据库特性。
    • ‌Hibernate‌:Hibernate支持多种数据库系统,并通过数据库方言的支持来生成适应不同数据库的SQL语句,这使得应用程序具备更好的数据库移植性。

四、Mybatis-plus整合Spring Boot项目

1、添加依赖

在Spring Boot项目的pom.xml文件中,添加Mybatis-plus以及数据库连接驱动的依赖。

bash 复制代码
<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- MyBatis-Plus Starter -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>最新版本号</version>
    </dependency>
    <!-- MySQL Driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>
2、配置数据源

在Spring Boot项目的application.yml或application.properties文件中配置数据库连接信息。例如,使用application.yml文件:

bash 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: your_username
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver
3、配置MyBatis-Plus

MyBatis-Plus的配置相对简单,Spring Boot会自动进行大部分配置。可以通过@MapperScan注解来扫描Mapper接口,或者直接在每个Mapper接口上使用@Mapper注解。例如,在启动类上使用@MapperScan注解:

bash 复制代码
@SpringBootApplication
@MapperScan("com.example.demo.mapper") // 扫描Mapper接口的路径
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
4、创建实体类

创建一个Java实体类,用于映射数据库表。例如,创建一个User实体类:

bash 复制代码
package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("user")
public class User {
    private Long id;
    private String username;
    private String password;
    // 其他字段...
}
5、创建Mapper接口

创建一个Mapper接口,继承BaseMapper接口。BaseMapper是MyBatis-Plus提供的基础接口,包含了常用的CRUD方法。例如,创建一个UserMapper接口:

bash 复制代码
package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 可以在这里定义自定义的SQL方法
}
6、注入Mapper接口‌

在Service层中,通过@Autowired注解将Mapper接口注入到Service类中。再使用注入的Mapper接口去调用MyBatis-Plus提供的常用CRUD方法以及创建Mapper接口时自定义的方法。

bash 复制代码
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public User getUserById(Long id) {
        return userMapper.selectById(id); // 调用BaseMapper提供的查询方法
    }

    // 其他业务方法...
}

五、Mybatis-plus代码生成器的使用

MyBatis-Plus的代码生成器是一个非常实用的工具,它能够根据数据库表结构自动生成对应的实体类、Mapper接口、Service层以及Controller层代码,极大地提高了开发效率。以下是一个详细的配置指南:

1、添加依赖

在项目的pom.xml文件中添加MyBatis-Plus代码生成器的依赖。这通常包括MyBatis-Plus代码生成器的核心依赖以及模板引擎的依赖(如Freemarker或Velocity)。

bash 复制代码
<dependencies>
    <!-- MyBatis-Plus代码生成器 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>最新版本号</version>
    </dependency>
    <!-- Freemarker模板引擎 -->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>最新版本号</version>
    </dependency>
    <!-- 其他依赖,如数据库驱动等 -->
</dependencies>
2、创建配置类

创建一个配置类来配置代码生成器的各种参数。这个配置类通常包含全局配置、数据源配置、包配置和策略配置等部分。

  • 全局配置‌:设置生成代码的基本信息,如作者、输出目录、是否覆盖已有文件等。
  • 数据源配置‌:设置数据库连接信息,以便代码生成器能够读取数据库表结构。
  • ‌包配置‌:设置生成代码的包名结构,如实体类包名、Mapper包名等。
  • 策略配置‌:设置生成代码的策略,如需要生成的表名、实体类命名策略等。
bash 复制代码
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

public class CodeGeneratorConfig {

    // 全局配置
    private GlobalConfig globalConfig() {
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java"); // 设置输出目录
        globalConfig.setAuthor("你的名字"); // 设置作者
        globalConfig.setOpen(false); // 设置生成完毕后是否打开输出目录
        globalConfig.setSwagger2(true); // 实体属性 Swagger2 注解
        return globalConfig;
    }

    // 数据源配置
    private DataSourceConfig dataSourceConfig() {
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/你的数据库名?useUnicode=true&useSSL=false&characterEncoding=utf8"); // 设置数据库URL
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver"); // 设置数据库驱动名
        dataSourceConfig.setUsername("你的数据库用户名"); // 设置数据库用户名
        dataSourceConfig.setPassword("你的数据库密码"); // 设置数据库密码
        dataSourceConfig.setDbType(DbType.MYSQL); // 设置数据库类型
        return dataSourceConfig;
    }

    // 包配置
    private PackageConfig packageConfig() {
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("com.example"); // 设置父包名
        packageConfig.setModuleName("module"); // 设置模块名
        packageConfig.setEntity("entity"); // 设置实体类包名
        packageConfig.setMapper("mapper"); // 设置Mapper包名
        packageConfig.setService("service"); // 设置Service接口包名
        packageConfig.setServiceImpl("service.impl"); // 设置Service实现类包名
        packageConfig.setController("controller"); // 设置Controller包名
        return packageConfig;
    }

    // 策略配置
    private StrategyConfig strategyConfig() {
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setNaming(NamingStrategy.underline_to_camel); // 表名生成策略
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel); // 列名生成策略
        strategyConfig.setEntityLombokModel(true); // 使用Lombok模型
        strategyConfig.setRestControllerStyle(true); // 生成@RestController控制器
        strategyConfig.setInclude("你的表名"); // 需要生成的表名
        // strategyConfig.setControllerMappingHyphenStyle(true); // key的style
        // strategyConfig.setTablePrefix(pc.getModuleName() + "_"); // 表前缀
        return strategyConfig;
    }

    // 获取完整的配置信息(通常这个方法不会被直接调用,而是作为其他方法的一部分)
    public AutoGenerator getAutoGenerator() {
        AutoGenerator autoGenerator = new AutoGenerator();
        autoGenerator.setGlobalConfig(globalConfig());
        autoGenerator.setDataSource(dataSourceConfig());
        autoGenerator.setPackageInfo(packageConfig());
        autoGenerator.setStrategy(strategyConfig());
        // 如果需要自定义模板,可以在这里设置
        // autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());
        // autoGenerator.setTemplate(new TemplateConfig(...));
        return autoGenerator;
    }
}
3、编写代码生成器类

最后编写一个Java类来启动代码生成器。这个类通常会包含一个main方法,并在其中调用代码生成器的相关方法来生成代码。例如:

bash 复制代码
import com.baomidou.mybatisplus.generator.AutoGenerator;

public class CodeGenerator {
    public static void main(String[] args) {
        CodeGeneratorConfig config = new CodeGeneratorConfig();
        AutoGenerator autoGenerator = config.getAutoGenerator();
        // 执行生成
        autoGenerator.execute();
    }
}
相关推荐
ClouGence5 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
曹牧6 天前
Oracle EXPLAIN PLAN
数据库·oracle
贤时间6 天前
codex 助力oracle ebs 开发
数据库·oracle
秉承初心6 天前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
敲个大西瓜6 天前
mybatis拦截器插件实现数据库字段加解密
mybatis
Curvatureflight6 天前
MySQL 深分页越来越慢?从 LIMIT OFFSET 改成游标分页
数据库·oracle
XZ-0700016 天前
MySQL事务
数据库·mysql·oracle
tiancaijiben6 天前
阿里云函数计算FC如何实现网站的定时任务与自动化
数据库·oracle·dba
xfhuangfu6 天前
Oracle 19c 多租户体系架构介绍
数据库·oracle·架构