乐趣区

关于springboot:spring-boot整合mybatisplus

1 MyBatis-plus 介绍

MyBatis- plus 是 MyBatis 的一个功能强大的加强工具包,用于简化开发。该工具包为 MyBatis 提供了一些高效、有用、开箱即用的个性,应用它能够无效地节俭开发工夫。

1.1 劣势

  1. MyBatis-plus 提供根底增删改查、分页查问等接口,可能无效简化开发,晋升开发效率。尤其是后盾管理系统、经营零碎等场景,特地适宜应用 MyBatis-plus 进行开发。
  2. 自带的代码生成器也很好用,能够生成器能够疾速生成 Mapper.java、Mapper.xml、dao、service、controller 层代码。
  3. 反对多种数据库:反对 mysql,oracle,db2,h2,hsql,sqlite,postgresql,sqlserver,Phoenix,Gauss,clickhouse,Sybase,OceanBase,Firebird,cubrid,goldilocks,csiidb 等多种数据库

2 spring-boot 整合 MyBatis-plus

2.1 导入 pom 依赖

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.2.0</version>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.17</version>
</dependency>

PS:能够自行批改版本。

2.2 配置数据库 yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    type: com.alibaba.druid.pool.DruidDataSource

# Logger Config
logging:
  level:
    com.baomidou.mybatisplus.samples: debug

2.3 减少 config 文件

@Configuration
@MapperScan("com.prepared.mapper")
public class MybatisPlusConfig {}

PS: 如果须要分页,须要减少分页配置

    // 旧版
//    @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;
//    }
    
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
}

2.4 集成代码生成器

导入 pom 包

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-generator</artifactId>
  <version>3.4.1</version>
</dependency>
<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.28</version>
</dependency>

代码生成类

package com.prepared;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
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 java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

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

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    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.isNotBlank(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");
        String projectPath = "/Users/shibo_zhong/Documents/workspace-prepared/spring-boot-learning/spring-boot-mybatis-plus";
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("prepared");
        gc.setOpen(true);
        // gc.setSwagger2(true); 实体属性 Swagger2 注解
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(scanner("模块名"));
        pc.setParent("com");
        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("调用默认办法创立的目录,自定义目录用");
                if (fileType == FileType.MAPPER) {
                    // 曾经生成 mapper 文件判断存在,不想从新生成返回 false
                    return !new File(filePath).exists();}
                // 容许生成模板文件
                return true;
            }
        });
        */
        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.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//        strategy.setSuperEntityClass("你本人的父类实体, 没有就不必设置!");
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        // 公共父类
//        strategy.setSuperControllerClass("你本人的父类控制器, 没有就不必设置!");
        // 写于父类中的公共字段
        strategy.setSuperEntityColumns("id");
        strategy.setInclude(scanner("tuser").split(","));
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();}

}

执行 main 办法,依照提醒输出即可生成代码

 请输出模块名:prepared
请输出 tuser:tuser

生成代码如下所示:

3 验证

编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisPlusApplicationTests {

    @Resource
    private TuserMapper tuserMapper;

    @Test
    public void testAddUser() {Tuser tuser = new Tuser();
        tuser.setAge(1);
        tuser.setIdCard("123415413");
        tuser.setIsmale(Boolean.TRUE);
        tuser.setName("prepared");
        tuserMapper.insert(tuser);
    }
}

整合实现!

github 开源地址

api 文档

本文波及代码地址

退出移动版