1.1 概述
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,是国人在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。为什么要学习它呢?MyBatisPlus可以节省我们大量工作时间,所有的CRUD代码它都可以自动化完成!说白了就是为了程序员可以快捷开发,偷懒用的。
1.2 特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
1.3 整合Mybatis-plus
正如官方所说,mybatis-plus在mybatis的基础上只做增强不做改变,因此其与spring的整合亦非常简单。只需把mybatis的依赖换成mybatis-plus的依赖,再把sqlSessionFactory换成mybatis-plus的即可,然后代码生成器还需要添加生成依赖和模板依赖。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
<!-- 代码生成器依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.0</version>
</dependency>
<!-- 模板引擎 依赖,MyBatis-Plus 支持 Velocity-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>
1.4 编写yml配置,连接数据库
编写yml配置,同时连接数据库,这一步和 mybatis 基本相同,根据自己所需的配置即可。
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/jxgl?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
username: root
password: 8888
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath:mybatis/mapper/*Mapper.xml
typeAliasesPackage: com.free.fs.model
global-config:
db-config:
id-type: auto
field-strategy: NOT_NULL
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
mapUnderscoreToCamelCase: true # 开启驼峰命名转换法
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 配置日志
spring:
application:
name: mybatis-plus
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
username: root
password: 8888
url: jdbc:p6spy:mysql://127.0.0.1:3306/jxgl?characterEncoding=utf-8&useSSL=false
logging:
level:
root: warn
com.kaven.mybatisplus.dao: trace
pattern:
console: '%p%m%n'
1.5 代码生成器代码
package com.free.fs;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
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.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.ArrayList;
import java.util.Scanner;
// 代码自动生成器
public class KuangCode {
/**
* 读取控制台内容
*/
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();
// 配置策略
// 1、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("小灰灰");//设置作者
gc.setOpen(false);
gc.setFileOverride(false); // 是否覆盖
gc.setServiceName("%sService"); // 去Service的I前缀
gc.setIdType(IdType.ID_WORKER);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
//2、设置数据源
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/jxgl?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");//账号
dsc.setPassword("");//密码
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
//3、包的配置 生成的代码存放在项目的位置
PackageConfig pc = new PackageConfig();
// pc.setModuleName("jiaxiao");//模块名称
pc.setParent("com.free.fs");
pc.setEntity("model");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
mpg.setPackageInfo(pc);
//4、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); // 设置要映射的表名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
// 自动lombok,是否使用lombok完成Entity实体标注Getting Setting ToString 方法;
strategy.setLogicDeleteFieldName("deleted");
// 自动填充配置
TableFill gmtCreate = new TableFill("create_time", FieldFill.INSERT);//创建时间
TableFill gmtModified = new TableFill("update_time",
FieldFill.INSERT_UPDATE);//修改时间
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(gmtCreate);
tableFills.add(gmtModified);
strategy.setTableFillList(tableFills);
// 乐观锁
strategy.setVersionFieldName("version");
strategy.setRestControllerStyle(true);//驼峰命名
strategy.setControllerMappingHyphenStyle(true); //localhost:8080/hello_id_2
mpg.setStrategy(strategy);
mpg.execute(); //执行
}
}
全局配置(GlobalConfig)
方法 | 说明 | 示例 |
---|---|---|
fileOverride | 覆盖已生成文件 | 默认值:false |
disableOpenDir | 禁止打开输出目录 | 默认值:true |
outputDir(String) | 指定输出目录 | /opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp |
author(String) | 作者名 | baomidou 默认值:作者 |
enableKotlin | 开启 kotlin 模式 | 默认值:false |
enableSwagger | 开启 swagger 模式 | 默认值:false |
dateType(DateType) | 时间策略 | DateType.ONLY_DATE 默认值: DateType.TIME_PACK |
commentDate(String) | 注释日期 | 默认值: yyyy-MM-dd |
包配置(PackageConfig)
方法 | 说明 | 示例 |
---|---|---|
parent(String) | 父包名 | 默认值:com.baomidou |
moduleName(String) | 父包模块名 | 默认值:无 |
entity(String) | Entity 包名 | 默认值:entity |
service(String) | Service 包名 | 默认值:service |
serviceImpl(String) | Service Impl 包名 | 默认值:service.impl |
mapper(String) | Mapper 包名 | 默认值:mapper |
mapperXml(String) | Mapper XML 包名 | 默认值:mapper.xml |
controller(String) | Controller 包名 | 默认值:controller |
other(String) | 自定义文件包名 | 输出自定义文件时所用到的包名 |
pathInfo(Map<OutputFile, String>) | 路径配置信息 | Collections.singletonMap(OutputFile.mapperXml, "D://") |
策略配置(StrategyConfig)
方法 | 说明 | 示例 |
---|---|---|
enableCapitalMode | 开启大写命名 | 默认值:false |
enableSkipView | 开启跳过视图 | 默认值:false |
disableSqlFilter | 禁用 sql 过滤 | 默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关 |
enableSchema | 启用 schema | 默认值:false,多 schema 场景的时候打开 |
likeTable(LikeTable) | 模糊表匹配(sql 过滤) | likeTable 与 notLikeTable 只能配置一项 |
notLikeTable(LikeTable) | 模糊表排除(sql 过滤) | likeTable 与 notLikeTable 只能配置一项 |
addInclude(String...) | 增加表匹配(内存过滤) | include 与 exclude 只能配置一项 |
addExclude(String...) | 增加表排除匹配(内存过滤) | include 与 exclude 只能配置一项 |
更多配置查看Mybatis-plus官方文档代码生成器(3.5.1+版本) | MyBatis-Plus (baomidou)
1.6 代码生成演示
简单演示一个数据库表生成,下面是数据库表的大体结构
启动代码生成器,控制台输入需要生成的数据库表名称
生成的代码结构如下
1.7 总结
通过 AutoGenerator 可以快速生成 Entity、 Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。同时不影响我们原来mybatis项目,只需要简单改变一下依赖和配置,我们就可以使用mybatisplus偷懒了,同时mybatisplus还有很多方便的功能,例如简单的CRUD 操作,直接调用封装的方法,无需编写xml文件,有兴趣的小伙伴去了解,相信你会爱上这个偷懒神器的。
更多推荐
mybatis-plus代码自动生成器
发布评论