文章目录

  • 简介
  • 特性
  • 框架结构
  • 依赖集成
    • 依赖
    • 配置
    • 编码
    • 开始使用
  • 核心功能
    • 代码生成器
      • 添加依赖
      • 编码
      • 编写配置
      • 自定义模板引擎
      • 自定义代码模板
      • 自定义属性注入
      • 字段其他信息查询注入
      • 实战总结
  • 常用总结
    • 多表联查
    • 开启日志打印
      • 通用
      • Mybatis-Plus
      • Mybatis
    • 更新和删除

类似 TkMybatis

官网地址:

https://baomidou.com/

简介

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

愿景

我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

特性

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

框架结构

依赖集成

全新的 MyBatis-Plus 3.0 版本基于 JDK8,提供了 lambda 形式的调用,所以安装集成 MP3.0 要求 JDK 8+

依赖

Spring Boot 与MP 版本不清楚的,可以看下mybatis-plus-boot-starter中依赖的Boot版本

引入 Spring Boot Starter 父工程:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.3</version><relativePath/>
</parent>

引入 spring-boot-starterspring-boot-starter-testmybatis-plus-boot-starterh2 依赖:

Latest Version: 传送门

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>

配置

application.yml 配置文件中添加 H2 数据库的相关配置:

spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/laker?serverTimezone=GMT%2B8&characterEncoding=utf8&useSSL=falsedriver-class-name: com.mysql.cj.jdbc.Driver

在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:

@SpringBootApplication
@MapperScan("com.laker.demo.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(QuickStartApplication.class, args);}
}

编码

编写实体类 User.java(此处使用了 Lombok简化代码)

@Data
public class User {private Long id;private String name;private Integer age;private String email;
}

编写Mapper类 UserMapper.java

public interface UserMapper extends BaseMapper<User> {}

开始使用

添加测试类,进行功能测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testSelect() {List<User> userList = userMapper.selectList(new QueryWrapper<User>().lambda().ge(User::getAge, 18));// SELECT * FROM user WHERE age >= 18}
}

到这里入门demo就够了,以下皆为扩展高级功能.

核心功能

代码生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

自定义模板有哪些可用参数?GithubAbstractTemplateEngine 类中方法 getObjectMap 返回 objectMap 的所有值都可用。

演示效果图

添加依赖

MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖:

  • 添加 代码生成器 依赖(必选)

    <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.4.2</version>
    </dependency>
    
  • 添加 模板引擎 依赖,MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎。(必选其中的一个)

    Velocity(默认):

    <dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version>
    </dependency>
    

    Freemarker:

    <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version>
    </dependency>
    

    Beetl:

    <dependency><groupId>com.ibeetl</groupId><artifactId>beetl</artifactId><version>3.3.2.RELEASE</version>
    </dependency>
    

    注意!如果您选择了非默认引擎,需要在 AutoGenerator 中 设置模板引擎。

    AutoGenerator generator = new 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());// other config
    ...
    

编码

// 演示例子,执行 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();// 全局配置String projectPath = globalConfig(mpg);// 数据源配置dataSourceConfig(mpg);// 生成代码包配置PackageConfig pc = packageConfig(mpg);diyConfig(mpg, projectPath, pc);// 配置模板TemplateConfig templateConfig = new TemplateConfig();// 配置自定义输出模板//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别// templateConfig.setEntity("templates/entity2.java");// templateConfig.setService();// templateConfig.setController();// 这里默认的xml生成的位置与mapper在一个目录,不实用,改为diyConfig中 自定义到 resources/mapper下templateConfig.setXml(null);mpg.setTemplate(templateConfig);// 策略配置strategyConfig(mpg, pc);mpg.setTemplateEngine(new FreemarkerTemplateEngine());mpg.execute();}private static void diyConfig(AutoGenerator mpg, String projectPath, PackageConfig pc) {// 自定义配置InjectionConfig cfg = new InjectionConfig() {@Overridepublic void initMap() {// to do nothing}};// 如果模板引擎是 freemarkerString templatePath = "/templates/mapper.xml.ftl";// 如果模板引擎是 velocity// String templatePath = "/templates/mapper.xml.vm";// 自定义输出配置List<FileOutConfig> focList = new ArrayList<>();// 自定义配置会被优先输出focList.add(new FileOutConfig(templatePath) {@Overridepublic String outputFile(TableInfo tableInfo) {// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;}});/*cfg.setFileCreate(new IFileCreate() {@Overridepublic boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {// 判断自定义文件夹是否需要创建checkDir("调用默认方法创建的目录,自定义目录用");if (fileType == FileType.MAPPER) {// 已经生成 mapper 文件判断存在,不想重新生成返回 falsereturn !new File(filePath).exists();}// 允许生成模板文件return true;}});*/// 自定义输出文件cfg.setFileOutConfigList(focList);mpg.setCfg(cfg);}private static void strategyConfig(AutoGenerator mpg, PackageConfig pc) {StrategyConfig strategy = new StrategyConfig();strategy.setNaming(NamingStrategy.underline_to_camel);strategy.setColumnNaming(NamingStrategy.underline_to_camel);// "你自己的父类实体,没有就不用设置!"
//        strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");// 【实体】是否为lombok模型(默认 false)strategy.setEntityLombokModel(true);// 生成 @RestController 控制器strategy.setRestControllerStyle(true);// 公共父类 "你自己的父类控制器,没有就不用设置!"
//        strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");// 写于父类中的公共字段
//        strategy.setSuperEntityColumns("id");strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));strategy.setControllerMappingHyphenStyle(true);strategy.setTablePrefix(pc.getModuleName() + "_");mpg.setStrategy(strategy);}private static PackageConfig packageConfig(AutoGenerator mpg) {PackageConfig pc = new PackageConfig();// sys 父包模块名pc.setModuleName(scanner("模块名"));// 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名pc.setParent("com.laker.demo");/*** 上面的代码生成位置及包名称* com.laker.demo.sys*/mpg.setPackageInfo(pc);return pc;}private static void dataSourceConfig(AutoGenerator mpg) {DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/laker?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);}private static String globalConfig(AutoGenerator mpg) {GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");// 生成文件的输出目录gc.setOutputDir(projectPath + "/src/main/java");// 作者姓名gc.setAuthor("laker");// 是否打开输出目录gc.setOpen(true);// 实体属性 Swagger2 注解// gc.setSwagger2(true);// 是否覆盖已有文件gc.setFileOverride(false);// 开启 BaseResultMapgc.setBaseResultMap(true);// 开启 baseColumnListgc.setBaseColumnList(true);mpg.setGlobalConfig(gc);return projectPath;}}

更多详细配置,请参考代码生成器配置一文。

编写配置

MyBatis-Plus 的代码生成器提供了大量的自定义参数供用户选择,能够满足绝大部分人的使用需求。

  • 配置 GlobalConfig

    GlobalConfig globalConfig = new GlobalConfig();
    globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
    globalConfig.setAuthor("jobob");
    globalConfig.setOpen(false);
    
  • 配置 DataSourceConfig

    DataSourceConfig dataSourceConfig = new DataSourceConfig();
    dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/ant?useUnicode=true&useSSL=false&characterEncoding=utf8");
    dataSourceConfig.setDriverName("com.mysql.jdbc.Driver");
    dataSourceConfig.setUsername("root");
    dataSourceConfig.setPassword("password");
    

自定义模板引擎

请继承类 com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine

自定义代码模板

自带内部模板为

//指定自定义模板路径, 位置:/resources/templates/entity2.java.ftl(或者是.vm)
//注意不要带上.ftl(或者是.vm), 会根据使用的模板引擎自动识别
TemplateConfig templateConfig = new TemplateConfig().setEntity("templates/entity2.java");AutoGenerator mpg = new AutoGenerator();
//配置自定义模板
mpg.setTemplate(templateConfig);

自定义属性注入

InjectionConfig injectionConfig = new InjectionConfig() {//自定义属性注入:abc//在.ftl(或者是.vm)模板中,通过${cfg.abc}获取属性@Overridepublic void initMap() {Map<String, Object> map = new HashMap<>();map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");this.setMap(map);}
};
AutoGenerator mpg = new AutoGenerator();
//配置自定义属性注入
mpg.setCfg(injectionConfig);
entity2.java.ftl
自定义属性注入abc=${cfg.abc}entity2.java.vm
自定义属性注入abc=$!{cfg.abc}

字段其他信息查询注入

new DataSourceConfig().setDbQuery(new MySqlQuery() {/*** 重写父类预留查询自定义字段<br>* 这里查询的 SQL 对应父类 tableFieldsSql 的查询字段,默认不能满足你的需求请重写它<br>* 模板中调用:  table.fields 获取所有字段信息,* 然后循环字段获取 field.customMap 从 MAP 中获取注入字段如下  NULL 或者 PRIVILEGES*/@Overridepublic String[] fieldCustom() {return new String[]{"NULL", "PRIVILEGES"};}
})

实战总结

  • mapper.xml :这里默认的xml生成的位置与mapper在一个目录,不实用,改为diyConfig中 自定义到 resources/mapper下

  • GlobalConfig.setBaseResultMap(true)

        <!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="com.laker.demo.sys.entity.User"><id column="id" property="id" /><result column="name" property="name" /><result column="age" property="age" /><result column="email" property="email" /></resultMap>
    
  • GlobalConfig.setBaseColumnList(true)

        <!-- 通用查询结果列 --><sql id="Base_Column_List">id, name, age, email</sql>
    
  • 添加xxxmapper.xml

    mybatis-plus:mapper-locations: classpath*:/mapper/**/*.xml # 默认配置 如果mapper.xml位置是这么放的可以不加
    
  • 自定义controller.java.ftl

    代码

            // 配置模板TemplateConfig templateConfig = new TemplateConfig();// 配置自定义输出模板//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别templateConfig.setController("templates/controller.java");
    

    模板位置在下图,复制过来改一改。

    package ${package.Controller};
    import org.springframework.web.bind.annotation.RequestMapping;
    <#if restControllerStyle>
    import org.springframework.web.bind.annotation.RestController;
    <#else>
    import org.springframework.stereotype.Controller;
    </#if>
    <#if superControllerClassPackage??>
    import ${superControllerClassPackage};
    </#if>/*** <p>* ${table.comment!} 前端控制器* </p>** @author ${author}* @since ${date}*/
    <#if restControllerStyle>
    @RestController
    <#else>
    @Controller
    </#if>
    @RequestMapping("<#if package.ModuleName?? && package.ModuleName != "">/${package.ModuleName}</#if>/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}</#if>")
    <#if kotlin>
    class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()</#if>
    <#else>
    <#if superControllerClass??>
    public class ${table.controllerName} extends ${superControllerClass} {
    <#else>
    public class ${table.controllerName} {
    </#if>}
    </#if>
  • 规范经验

    • 表命名 resource_highway

      请输入模块名:
      resource
      请输入表名,多个英文逗号分割:
      resource_highway
      
    • 生成的包com.laker.demo.resource

      • controller.HighwayController

常用总结

多表联查

  • 复杂的:直接xml编写吧

  • 简单的:注解编程+关联结果VO

    public interface QuestionMapper extends BaseMapper<Question> {// page 翻页对象,可以作为 xml 参数直接使用,传递参数 Page 即自动分页@Select("SELECT t_question.*,t_student.`name` FROM t_question,t_student WHERE t_question.student_id=t_student.id")List<QuestionStudentVO> getQuestionStudent(Pagination page);
    }
    

开启日志打印

通用

logging:level:com.xxx.mapper: debug

Mybatis-Plus

这个只能记录在控制台

mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

PerformanceInterceptor拦截器,虽然高版本(3.1.0 以上版本)删除了,我们还是可以借鉴下的哈哈。

直接把代码复制到你们本地,使用到的就是下面2个类

  • PerformanceInterceptor.java

  • SqlFormatter.java

步骤一:在MP配置类中配置该插件,并且只适用于DEV环境

// MybatisPlus配置类
@Configuration
public class MyBatisPlusConfig {//SQL执行效率插件@Bean@Profile({"dev"}) // 指定环境为dev生效public PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor interceptor = new PerformanceInterceptor();// sql美化打印interceptor.setFormat(true);// 设置SQL超时时间interceptor.setMaxTime(5000L);// 写入日志interceptor.setWriteInLog(true);return interceptor;}
}

步骤二:设置环境为dev。

spring:profiles:active: dev

结果如下:

2021-03-09 19:57:10.925  INFO 20232 --- [nio-8080-exec-1] c.a.h.d.common.PerformanceInterceptor    :  Time:15 ms - ID:com.laker.demo.mapper.StakeMapper.insert
Execute SQL:INSERT INTOresource_stake( road_id, stake_name, state_num, direction, picture_url, lon, lat ) VALUES( 0, 'string', 0, 'string', 'string', 0, 0 )

Mybatis

mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

更新和删除

更新和删除默认皆为处理非null字段


写多了CSDN好卡,而且保存老是审核,再开一篇,在《从零搭建开发脚手架 》专栏查找

《从零搭建开发脚手架 Spring Boot集成Mybatis-plus之二》

公众号也会持续输出高质量文章,和大家共同进步。

从零搭建开发脚手架 Spring Boot集成Mybatis-plus之一相关推荐

  1. Spring Boot 集成 Mybatis 实现双数据源

    转载自   Spring Boot 集成 Mybatis 实现双数据源 这里用到了Spring Boot + Mybatis + DynamicDataSource配置动态双数据源,可以动态切换数据源 ...

  2. spring boot 集成Mybatis时 Invalid bound statement (not found)

    spring boot 集成Mybatis时,运行提示 org.apache.ibatis.binding.BindingException: Invalid bound statement (not ...

  3. Spring Boot 集成MyBatis

    Spring Boot 集成MyBatis Spring Boot 系列 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring ...

  4. Spring Boot系列六 Spring boot集成mybatis、分页插件pagehelper

    1. 概述 本文的内容包括如下内容: Spring Boot集成mybatis Spring Boot集成pagehelper分页插件,定义分页的相关类 实现工具类:model转dto,实现数据层和传 ...

  5. spring boot集成mybatis+事务控制

    一下代码为DEMO演示,采用注解的方式完成Spring boot和Mybatis的集成,并进行事物的控制 数据源的配置: 1 spring.datasource.url=jdbc:mysql://lo ...

  6. Spring Boot 集成 MyBatis 与 c3p0

    *对应的目录结构 一.添加依赖 <!-- 添加对 mybatis 的依赖 --><dependency><groupId>org.mybatis.spring.bo ...

  7. 开发笔记 – Spring Boot集成HBase(Hadoop和Hbase安装)

    最近在重新整理搜书吧(一个做图书比价的平台)的系统架构,目前图书产品数量超过了200万条.各种数据加起来超过40G了,使用Mysql数据库存储服务器吃不消,于是考虑使用HBase存储大部分数据. 一. ...

  8. mybatis映射longtext类型数据_全网首例全栈实践(五)Spring Boot 集成Mybatis

    一.概述 我们的Spring Boot后续项目使用的都是MySQL.Spring Boot连接MySQL的方式包括JDBC,Spring JPA,Hibeirnate,Mybatis等,本文主要带大家 ...

  9. MBG真香 Spring Boot集成Mybatis Generator插件

    Mybatis中文官网对mybatis-generator的介绍:http://www.mybatis.cn/archives/885.html Mybatis官网对mybatis-generator ...

最新文章

  1. mantelhean.test r语言_R语言基础-检验与分析函数
  2. 是知当代之士、驰骛之曹,书读纵横,则思诸侯之变
  3. vue的Virtual Dom实现- snabbdom解密
  4. python的常见矩阵除法_Python numpy矩阵处理运算工具用法汇总
  5. LeetCode两数之和 56 python
  6. java decompiler_Java Decompiler(Java反编译工具)
  7. 运行虚拟机报错:vmware workstations与devicecredential不兼容(终极解决方案)
  8. 不能bostype没有元数据异常_EAS BOS 开发问题集锦
  9. NodeJs中使用jQuery?
  10. 程序员惊魂 12 小时:“���”引发线上事故
  11. odex vdex art区别
  12. [org/springframework/jdbc/support/sql-error-codes.xml]
  13. hdu2147PN图的画法
  14. 手机号码检测开通微信查询方法
  15. Rinne Loves Sequence
  16. java一般自学多久
  17. Recorder教程☀️ Unity官方录屏插件使用介绍
  18. php 个人摄影,展示个人摄影作品的12种方式(ZT)
  19. MarkMan(马克鳗)的下载及安装方法
  20. ant design vue pro 支持多页签模式 页签可以缓存

热门文章

  1. 【麒麟操作系统】命令行下配置网卡及DNS
  2. Unity3D学习日记6
  3. 曾我爱的人《亲爱的,别跨过那条江》:关于爱你,我准备用一生
  4. 做大数据论文时的分析思路
  5. 笔记本电脑网络图标丢失解决流程
  6. 华为---ACL配置
  7. CAD二次开发合并所有能合并的线
  8. 在外文paper写作中,英文杂志以及英文会议缩写名称怎么查找
  9. laravel api生成接口文档
  10. openmv 神经网络 超出内存_星瞳科技OpenMV视频教程22-神经网络cifar_10