SpringBoot+Mybatis-plus快速入门

Mybatis-plus快速入门

  • 官方链接
    • 环境搭建
    • 实际操作
    • 多数据源配置
    • 写在最后

官方链接

首先贴上官方链接
mybatis-plus
学习一门技术,最好的方式是阅读官方的文档。
鉴于官方文档写的不尽详细,因此写下这篇快速入门系列。旨在最快速度搭建一个springBoot+mybatis-plus项目,并进行常规的CRUD操作。

环境搭建

本文全程在IDEA环境下进行开发

  1. SpringBoot初始项目搭建
    IDEA的File菜单中选择New ----> Project
    SpringBoot+Mybatis-plus快速入门_第1张图片SpringBoot+Mybatis-plus快速入门_第2张图片SpringBoot+Mybatis-plus快速入门_第3张图片

按上图,选择自己需要的依赖,创建即可。
对于最基础的web项目,只需要选择web与mysql起步依赖就足够进行接下来的演示了。

  1. 完整pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.doraemon</groupId>
    <artifactId>trainboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>trainboot</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>
        <!--模版生成-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>
        <!--模版-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>
        <dependency>
            <groupId>com.ibeetl</groupId>
            <artifactId>beetl</artifactId>
            <version>3.1.3.RELEASE</version>
        </dependency>
        <!--连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.21</version>
        </dependency>
        <!--多数据源-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

        <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  1. yml配置
# 单数据源配置
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf-8
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource

注意
如果mysql版本较新,driver选择的是:
com.mysql.cj.jdbc.Driver
那么相应的url需要同步修改:
jdbc:mysql://localhost:3306/db_name?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
增加了参数:serverTimezone=Asia/Shanghai

  1. 代码生成器

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
     

    public static final String AUTHOR = "doraemon";
    public static final String URL = "jdbc:mysql://localhost:3306/db_name?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8";
    public static final String DRIVERNAME = "com.mysql.cj.jdbc.Driver";
    public static final String USERNAME = "root";
    public static final String PASSWORD = "root";
    // 创建的代码父路径
    public static final String PARENTPACKAGE = "com.doraemon.trainboot";

    /**
     * 

* 读取控制台内容 *

*/
public static String scanner(String tip) { Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append("请输入" + tip + ":"); System.out.println(help.toString()); if (scanner.hasNext()) { String ipt = scanner.next(); if (StringUtils.isNotEmpty(ipt)) { return ipt; } } throw new MybatisPlusException("请输入正确的" + tip + "!"); } public static void main(String[] args) { // 代码生成器 AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); gc.setAuthor(AUTHOR); gc.setOpen(false); // gc.setSwagger2(true); 实体属性 Swagger2 注解 mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl(URL); // dsc.setSchemaName("public"); dsc.setDriverName(DRIVERNAME); dsc.setUsername(USERNAME); dsc.setPassword(PASSWORD); mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setModuleName(scanner("模块名")); pc.setParent(PARENTPACKAGE); mpg.setPackageInfo(pc); // 自定义配置 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { // to do nothing } }; // 如果模板引擎是 freemarker String templatePath = "/templates/mapper.xml.ftl"; // 如果模板引擎是 velocity // String templatePath = "/templates/mapper.xml.vm"; // 自定义输出配置 List<FileOutConfig> focList = new ArrayList<>(); // 自定义配置会被优先输出 focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }); /* cfg.setFileCreate(new IFileCreate() { @Override public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { // 判断自定义文件夹是否需要创建 checkDir("调用默认方法创建的目录"); return false; } }); */ cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); // 配置模板 TemplateConfig templateConfig = new TemplateConfig(); // 配置自定义输出模板 //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别 // templateConfig.setEntity("templates/entity2.java"); // templateConfig.setService(); // templateConfig.setController(); templateConfig.setXml(null); mpg.setTemplate(templateConfig); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.no_change); strategy.setColumnNaming(NamingStrategy.underline_to_camel); // strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!"); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true); // 公共父类 // strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!"); // 写于父类中的公共字段 // strategy.setSuperEntityColumns("id"); strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(pc.getModuleName() + "_"); mpg.setStrategy(strategy); mpg.setTemplateEngine(new FreemarkerTemplateEngine()); mpg.execute(); } }

以上代码来源官方:代码生成器
使用方式可以去官方查阅。
基于官方代码做了以下修改:
1. 表名不做任何处理(官方默认表名无下划线)
2. 所有需要修改的数据项提取成了常量值,仅需修改常量部分即可正常使用

  1. 分页配置类

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {
     

    @Bean
    public PaginationInterceptor paginationInterceptor() {
     
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}

该类的主要作用在于将mybatis自身所支持的逻辑分页转变成物理分页,从而避免很多不必要的问题。

逻辑分页: 一次性读取所有sql数据,在内存中进行分页,展现部分数据。数据量大时会引发严重的性能问题

物理分页: 采用mysql的limit关键字进行查询

实际操作

常规操作与mybatis无异,通过xml文件编写sql语句执行,在此不再赘述。
感兴趣的朋友可以看我另一篇博文mybatis与java传参方式简述

以一个条件分页查询功能的语句编写来实现mybatis-plus的使用。

	import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
	import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
		
 		// 分页页码数:从1开始
        int num = 1;
        // 每页展示数据量
        int size = 3;
        Page<User> page = new Page<>(num , size);
        QueryWrapper wrapper = new QueryWrapper();
        wrapper.eq("name","张三");
        Page<User> data = userMapper.selectPage(page, wrapper);
        System.out.println(data);

page具体内容可在debug模式下进行查看。返回的是sql内容,总数量等信息。
QueryWrapper与Page的具体用法可参阅官方文档

额外mybatis-plus配置项

mybatis-plus:
  # 批量设置别名
  type-aliases-package: com.doraemon.trainboot.*
  global-config:
    db-config:
      # 逻辑删除字段
      logic-delete-field: isdelete
      logic-delete-value: 1
      logic-not-delete-value: 0

别名的全局设置与逻辑删除字段的设置

多数据源配置

  1. yml配置项
# 多数据源配置
spring:
  autoconfigure:
    # 移除Druid,否则多数据源不生效
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      datasource:
        master:
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://localhost:3306/datatest
        slave_1:
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://localhost:3306/datatest2
        slave_2:
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://localhost:3306/datatest3

依次配置多个数据源即可,primary为默认数据源。

exclude配置项较为重要,没有该配置项会导致多数据源失效
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure

  1. 使用方式

在类或方法上使用@DS注解即可

@DS("master")
public interface UserMapper extends BaseMapper<User> {
     

}

写在最后

本文旨在帮助大家能够迅速搭建起SpringBoot+Mybatis-plus的项目,并能够第一时间进行CRUD操作,快速熟悉该技术。对于其中的技术细节并未有过多介绍,大家可以仔细阅读官方文档。
其中关于代码生成器与多数据源配置直接采用官方代码会有些许问题,有感而发写下此文,希望能帮助大家减少开发路上的麻烦,有不足之处还望见谅

你可能感兴趣的:(Mybatis-plus,SpringBoot,spring,boot,mybatis,java,mysql,spring)