Spring Boot整合Mybatis-Plus

  • A+
所属分类:Java片段

一、MyBatis-Plus简介

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

通过在项目中整合Mybatis-Plus,可以使你的代码更加简介明了,一个简单的CRUD功能完全不用写sql。

相比mybatis与tkmybatis,mybatis-plus有强大的构造器,再与lambda表达式相结合,写代码如行云流水般丝滑,而且很优美。

自从用了MP,让你再也不想用其他的ORM框架,目前官网最新的版本为3.4.1

Spring Boot整合Mybatis-Plus

主要特性:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

二、相关依赖及配置

以下用mysql作为持久层数据库进行整合,其他数据库同理,引入以下依赖

<!--Spring Boot整合Mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>

<!--mybatis-plus逆向生成器-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.1</version>
</dependency>

<!--Spring Boot整合Mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!--整合lombok插件-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

<!-- 模板引擎 -->
<dependency>
     <groupId>org.apache.velocity</groupId>
     <artifactId>velocity-engine-core</artifactId>
    <version>2.0</version>
</dependency>

增加application.yml相关配置

#mysql数据库配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/kjyfx_base_service?useUnicode=true&useSSL=false&autoReconnect=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: root
    password: 123456



#mybatis-plus相关配置
mybatis-plus:
  mapper-locations: classpath:com/kjyfx/mapper/*Mapper.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.kjyfx.entity
  global-config:
    # 数据库相关配置
    db-config:
      id-type: AUTO             #主键类型  AUTO:"数据库ID自增", INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
      field-strategy: not_null  #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
      column-underline: true    #驼峰下划线转换
      #数据库大写下划线转换
      #capital-mode: true
      #逻辑删除配置
      logic-delete-value: 1
      logic-not-delete-value: 0
      db-type: mysql          #若是其他类型数据库,修改此值即可
    #刷新mapper 调试神器
    refresh: true
  # 原生配置
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl       #打印sql查询语句日志,生产环境建议关闭      

此时,Mybatis-plus的相关依赖配置就已完成,可以直接复制以上配置到实际项目中,进行简单修改即可。

配置完成后,需要用MP的逆向工具生成对应的实体类及三层架构(Controller、Service、Dao),在使用墨云的逆向工具之前,记得先在项目中引入lombok插件velocity模板引擎,否则在使用逆向工具时会报错,默认为velocity模板引擎,也可以根据实际情况选择其他

将墨云提供的逆向工具类放到test中,只需修改数据库连接信息和所需要的逆向的表名(可变参数拼接即可),执行单元测试,即可生成对应的Controller、Service、Dao所需要所有文件,完全不需要再去写继承,写注解,方便快捷。

Spring Boot整合Mybatis-Plus

MP逆向工具GeneratorUtils

数据库连接信息一定要配置正确,否则无法正常创建相应实体类

以下附上逆向工具源码,有注释说明,使用时直接复制粘贴即可

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;

/**
 * mybatis-plus逆向生成工具
 * 微信公众号:云说Java、Java栈记
 * @author moyun
 * @date 2020/12/01
 */
public class GeneratorUtils {

    @Test
    public void generateCode() {
        String packageName = "com.kjyfx";//顶级包名
        boolean serviceNameStartWithI = false;//user -> UserService, 设置成true: user -> IUserService
        generateByTables(serviceNameStartWithI, packageName,
                "com_sys_menu","com_sys_user");//需要逆向生成的表
    }

    private void generateByTables(boolean serviceNameStartWithI, String packageName, String... tableNames) {
        GlobalConfig config = new GlobalConfig();
        String dbUrl = "jdbc:mysql://localhost:3306/kjyfx_base_service?useUnicode=true&useSSL=false&autoReconnect=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL)//设置数据库类型
                .setUrl(dbUrl)
                .setUsername("root")
                .setPassword("123456")
                .setDriverName("com.mysql.cj.jdbc.Driver");//设置驱动类
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig
                .setCapitalMode(true)
                .setEntityLombokModel(true)
                .setNaming(NamingStrategy.underline_to_camel).setTablePrefix("com_")//表前缀
                .setInclude(tableNames);//修改替换成你需要的表名,多个表名传数组
        config.setActiveRecord(false)
                .setEnableCache(false)
                .setAuthor("moyun")//设置作者名
                .setOutputDir("E:\\WeiXinDoc\\kjyfx-base-server\\src\\main\\java") //设置逆向代码的生成路径
                .setFileOverride(true);
        if (!serviceNameStartWithI) {
            config.setServiceName("%sService");
        }
        new AutoGenerator().setGlobalConfig(config)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(
                        new PackageConfig()
                                .setParent(packageName)
                                .setController("controller")//设置控制类的包名
                                .setEntity("entity")//设置实体类的存放包名
                                .setService("service")//设置service类的存放包名
                                .setMapper("mapper")//设置mapper接口的存放包名
                                .setXml("mapper")//设置mapper.xml的存放包名
                ).execute();
    }

    private void generateByTables(String packageName, String... tableNames) {
        generateByTables(true, packageName, tableNames);
    }
}

注意!如过实际项目中使用的是非默认引擎,需要在 AutoGenerator() 后设置相应的模板引擎。

// set freemarker engine
generator.setTemplateEngine(new FreemarkerTemplateEngine());

// set beetl engine
generator.setTemplateEngine(new BeetlTemplateEngine());

// set custom engine (reference class is your custom engine class)
generator.setTemplateEngine(new CustomTemplateEngine());

其中实体类的存放包路径需要需要与application.yml中的配置一致typeAliasesPackage: com.kjyfx.entity

个人习惯于将mapper文件与xml文件放在同一个包下,便于查看修改(当然也有插件方便进行跳转),此时,还需要在pom文件中配置一下资源路径,否则打包之后会少xml文件

pom文件配置增加以下配置

<build>
    <resources>
        <!--配置mapper.xml位置-->
        <resource>
            <directory>src/main/java</directory>
            <filtering>false</filtering>
            <includes>
                <include>**/*Mapper.xml</include>
            </includes>
        </resource>
    </resources>
</build>

此时在Application主启动类上加上@MapperScan(basePackages = "com.kjyfx.mapper")注解,即可自动扫描到包下的所有mapper,无需再去单个写@mapper注解

对于分页查询,只需用配置类配置一个MP的分页插件即可

package com.kjyfx.config;

import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * mybatis-plus逆向生成工具
 * 微信公众号:云说Java、Java栈记
 * @author moyun
 * @date 2020/12/01
 */
@EnableTransactionManagement
@Configuration
@MapperScan("com.kjyfx.mapper*")
public class MybatisPlusConfig {

     /**
      * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
      */
     @Bean
     public MybatisPlusInterceptor mybatisPlusInterceptor() {
         MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
         interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
         return interceptor;
     }


     @Bean
     public ConfigurationCustomizer configurationCustomizer() {
         return configuration -> configuration.setUseDeprecatedExecutor(false);
     }
}

切换到Application主启动类,右键运行,此时项目即可正常启动成功!成功整合Mybatis-plus,而对于controller、service、mapper这几个包路径,在实体类中自行配置即可,若无该路径,逆向工具会自动创建。创建好的文件,需自行加入的git仓库中

Spring Boot整合Mybatis-Plus

PDF文档下载
链接:https://pan.baidu.com/s/1evZp3_dMaeNPVVYgR72EtA
提取码:b4bl

  • 云说Java
  • 关注公众号获取更多资源
  • weinxin
  • Java栈记
  • 关注公众号获取更多资源
  • weinxin
墨云

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: