SpringBoot集成MyBatis-Plus代码生成器
1.说明
本文详细介绍Spring Boot集成MyBatis-Plus代码生成器的方法。
基于一个创建好的Spring Boot工程,
执行MyBatis-Plus提供的AutoGenerator代码生成器,
根据数据库中已经存在的表,
生成Entity、Mapper、Mapper XML、Service、Controller等各个模块的代码,
可以极大的提升开发效率。
2.数据库TBL_ROLE表
这里使用的是MySQL数据库,
数据库配置如下:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.21.13.14:3306/demodb
username: demo
password: demo123456
在数据库中有TBL_ROLE表,
表定义语句如下:
CREATE TABLE TBL_ROLE
(
id BIGINT (20) NOT NULL COMMENT '主键ID',
role_name VARCHAR(30) NULL DEFAULT NULL COMMENT '角色名',
role_describe VARCHAR(30) NULL DEFAULT NULL COMMENT '角色描述',
PRIMARY KEY (id)
);
下面演示为TBL_ROLE表生成对应各个模块的代码。
3.添加依赖
在pom.xml文件中增加jar包依赖,
包括代码生成器mybatis-plus-generator,
以及模板引擎freemarker:
<!-- MyBatis-Plus代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
注意如果依赖不到freemarker,
需要更新一下工程的Maven依赖,
否则后面执行代码的时候会报错,
找不到freemarker的相关类。
4.编写配置
这里使用创建Java代码的方式进行配置,
创建代码生成器的AutoGenerator类实例,
然后编写AutoGenerator对应的配置参数,
最后执行生成代码的方法即可。
下面演示创建一个CodeGenerator类,
在main方法中实现了AutoGenerator的创建和配置,
最后调用AutoGenerator的execute()方法生成代码。
文末给出了CodeGenerator.java的完整代码。
5.CodeGenerator说明
在CodeGenerator类中,
需要修改下面的常量配置参数,
主要是数据库和表名等参数,
然后执行main方法,
即可生成对应的代码。
如果需要进一步自定义配置,
请详细阅读main方法中1-6这6个配置。
public class CodeGenerator {
// 数据库连接配置
private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mysql://10.21.13.14:3306/demodb?useUnicode=true&useSSL=false&characterEncoding=utf8";
private static final String JDBC_USER_NAME = "demo";
private static final String JDBC_PASSOWRD = "demo123456";
// 包名和模块名
private static final String PACKAGE_NAME = "com.yuwen";
private static final String MODULE_NAME = "demo";
// 表名,多个表使用英文逗号分割
private static final String TBL_NAMES = "tbl_role";
// 表名的前缀,从表生成代码时会去掉前缀
private static final String TABLE_PREFIX = "tbl_";
// 生成代码入口main方法
public static void main(String[] args) {
// 0.代码生成器
AutoGenerator mpg = new AutoGenerator();
// 1.全局配置
GlobalConfig gc = getGlobalConfig();
mpg.setGlobalConfig(gc);
// 2.数据源配置
DataSourceConfig dsc = getDataSourceConfig();
mpg.setDataSource(dsc);
// 3.包配置
PackageConfig pc = getPackageConfig();
mpg.setPackageInfo(pc);
// 4.自定义配置
InjectionConfig cfg = getInjectionConfig();
mpg.setCfg(cfg);
// 5.模板配置
TemplateConfig templateConfig = getTemplateConfig();
mpg.setTemplate(templateConfig);
// 使用Freemarker模板引擎
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
// 6.策略配置
StrategyConfig strategy = getStrategyConfig();
mpg.setStrategy(strategy);
// 7.开始生成代码
mpg.execute();
}
5.1.全局配置
全局策略配置,具体请查看全局策略配置:
/** 1.全局配置 */
private static GlobalConfig getGlobalConfig() {
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("yuwen");
gc.setOpen(false);
// 自定义生成的ServiceName,去掉默认的ServiceName前面的I
gc.setServiceName("%s" + ConstVal.SERVICE);
// gc.setSwagger2(true); 实体属性 Swagger2 注解
return gc;
}
5.2.数据源配置
数据源配置,通过该配置,指定需要生成代码的具体数据库,
具体请查看数据源配置:
/** 2.数据源配置 */
private static DataSourceConfig getDataSourceConfig() {
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDriverName(JDBC_DRIVER);
dsc.setUrl(JDBC_URL);
// dsc.setSchemaName("public");
dsc.setUsername(JDBC_USER_NAME);
dsc.setPassword(JDBC_PASSOWRD);
return dsc;
}
5.3.包配置
包名配置,通过该配置,指定生成代码的包路径,
具体请查看包名配置:
/** 3.包配置 */
private static PackageConfig getPackageConfig() {
PackageConfig pc = new PackageConfig();
// 生成PACKAGE_NAME.MODULE_NAME的包路径
pc.setParent(PACKAGE_NAME);
pc.setModuleName(MODULE_NAME);
return pc;
}
5.4.自定义配置
注入配置,通过该配置,可注入自定义参数等操作以实现个性化操作,
具体请查看注入配置:
/** 4.自定义配置 */
private static InjectionConfig getInjectionConfig() {
// 这里模板引擎使用的是freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
String projectPath = System.getProperty("user.dir");
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化
return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper"
+ StringPool.DOT_XML;
}
});
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
cfg.setFileOutConfigList(focList);
return cfg;
}
5.5.模板配置
模板配置,可自定义代码生成的模板,实现个性化操作,
具体请查看模板配置:
/** 5.模板配置 */
private static TemplateConfig getTemplateConfig() {
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定义输出模板
// 指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
// templateConfig.setEntity("templates/entity2.java");
// templateConfig.setService();
// templateConfig.setController();
templateConfig.setXml(null);
return templateConfig;
}
5.6.策略配置
数据库表配置,通过该配置,可指定需要生成哪些表或者排除哪些表,
具体请查看数据库表配置:
/** 6.策略配置 */
private static StrategyConfig getStrategyConfig() {
StrategyConfig strategy = new StrategyConfig();
// 下划线转驼峰命名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(false);
strategy.setRestControllerStyle(true);
strategy.setInclude(TBL_NAMES.split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(TABLE_PREFIX);
return strategy;
}
6.生成代码
执行代码生成器生成代码后,
控制台输出如下日志:
2020-07-07 10:46:49.906 [main] DEBUG [93] - ==========================准备生成文件...==========================
2020-07-07 10:46:50.150 [main] DEBUG [155] - 创建目录: [D:\Code\Learn\SpringBoot\springboot-mybatis-plus/src/main/java\com\yuwen\demo\entity]
2020-07-07 10:46:50.150 [main] DEBUG [155] - 创建目录: [D:\Code\Learn\SpringBoot\springboot-mybatis-plus/src/main/java\com\yuwen\demo\controller]
2020-07-07 10:46:50.151 [main] DEBUG [155] - 创建目录: [D:\Code\Learn\SpringBoot\springboot-mybatis-plus/src/main/java\com\yuwen\demo\mapper]
2020-07-07 10:46:50.152 [main] DEBUG [155] - 创建目录: [D:\Code\Learn\SpringBoot\springboot-mybatis-plus/src/main/java\com\yuwen\demo\service\impl]
2020-07-07 10:46:50.209 [main] DEBUG [54] - 模板:/templates/mapper.xml.ftl; 文件:D:\Code\Learn\SpringBoot\springboot-mybatis-plus/src/main/resources/mapper/RoleMapper.xml
2020-07-07 10:46:50.292 [main] DEBUG [54] - 模板:/templates/entity.java.ftl; 文件:D:\Code\Learn\SpringBoot\springboot-mybatis-plus/src/main/java\com\yuwen\demo\entity\Role.java
2020-07-07 10:46:50.294 [main] DEBUG [54] - 模板:/templates/mapper.java.ftl; 文件:D:\Code\Learn\SpringBoot\springboot-mybatis-plus/src/main/java\com\yuwen\demo\mapper\RoleMapper.java
2020-07-07 10:46:50.296 [main] DEBUG [54] - 模板:/templates/service.java.ftl; 文件:D:\Code\Learn\SpringBoot\springboot-mybatis-plus/src/main/java\com\yuwen\demo\service\RoleService.java
2020-07-07 10:46:50.297 [main] DEBUG [54] - 模板:/templates/serviceImpl.java.ftl; 文件:D:\Code\Learn\SpringBoot\springboot-mybatis-plus/src/main/java\com\yuwen\demo\service\impl\RoleServiceImpl.java
2020-07-07 10:46:50.299 [main] DEBUG [54] - 模板:/templates/controller.java.ftl; 文件:D:\Code\Learn\SpringBoot\springboot-mybatis-plus/src/main/java\com\yuwen\demo\controller\RoleController.java
2020-07-07 10:46:50.299 [main] DEBUG [107] - ==========================文件生成完成!!!==========================
在工程中看到新生成如下文件:
src/main/resources/mapper/RoleMapper.xml
src/main/java/com/yuwen/demo/entity/Role.java
src/main/java/com/yuwen/demo/mapper/RoleMapper.java
src/main/java/com/yuwen/demo/service/RoleService.java
src/main/java/com/yuwen/demo/service/impl/RoleServiceImpl.java
src/main/java/com/yuwen/demo/controller/RoleController
可以通过这里生成的文件名称,
对比上面的配置的生效情况。
文末给出上面各个文件的完整代码。
7.CodeGenerator.java
package com.example.demo.uitl.generate;
import java.util.ArrayList;
import java.util.List;
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.ConstVal;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
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.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
/**
*
* 代码生成器 ,先修改下面的常量配置参数,然后执行 main方法
*/
public class CodeGenerator {
// 数据库连接配置
private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mysql://10.21.13.14:3306/demodb?useUnicode=true&useSSL=false&characterEncoding=utf8";
private static final String JDBC_USER_NAME = "demo";
private static final String JDBC_PASSOWRD = "demo123456";
// 包名和模块名
private static final String PACKAGE_NAME = "com.yuwen";
private static final String MODULE_NAME = "demo";
// 表名,多个表使用英文逗号分割
private static final String TBL_NAMES = "tbl_role";
// 表名的前缀,从表生成代码时会去掉前缀
private static final String TABLE_PREFIX = "tbl_";
// 生成代码入口main方法
public static void main(String[] args) {
// 0.代码生成器
AutoGenerator mpg = new AutoGenerator();
// 1.全局配置
GlobalConfig gc = getGlobalConfig();
mpg.setGlobalConfig(gc);
// 2.数据源配置
DataSourceConfig dsc = getDataSourceConfig();
mpg.setDataSource(dsc);
// 3.包配置
PackageConfig pc = getPackageConfig();
mpg.setPackageInfo(pc);
// 4.自定义配置
InjectionConfig cfg = getInjectionConfig();
mpg.setCfg(cfg);
// 5.模板配置
TemplateConfig templateConfig = getTemplateConfig();
mpg.setTemplate(templateConfig);
// 使用Freemarker模板引擎
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
// 6.策略配置
StrategyConfig strategy = getStrategyConfig();
mpg.setStrategy(strategy);
// 7.开始生成代码
mpg.execute();
}
/** 1.全局配置 */
private static GlobalConfig getGlobalConfig() {
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("yuwen");
gc.setOpen(false);
// 自定义生成的ServiceName,去掉默认的ServiceName前面的I
gc.setServiceName("%s" + ConstVal.SERVICE);
// gc.setSwagger2(true); 实体属性 Swagger2 注解
return gc;
}
/** 2.数据源配置 */
private static DataSourceConfig getDataSourceConfig() {
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDriverName(JDBC_DRIVER);
dsc.setUrl(JDBC_URL);
// dsc.setSchemaName("public");
dsc.setUsername(JDBC_USER_NAME);
dsc.setPassword(JDBC_PASSOWRD);
return dsc;
}
/** 3.包配置 */
private static PackageConfig getPackageConfig() {
PackageConfig pc = new PackageConfig();
// 生成PACKAGE_NAME.MODULE_NAME的包路径
pc.setParent(PACKAGE_NAME);
pc.setModuleName(MODULE_NAME);
return pc;
}
/** 4.自定义配置 */
private static InjectionConfig getInjectionConfig() {
// 这里模板引擎使用的是freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
String projectPath = System.getProperty("user.dir");
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化
return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper"
+ StringPool.DOT_XML;
}
});
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
cfg.setFileOutConfigList(focList);
return cfg;
}
/** 5.模板配置 */
private static TemplateConfig getTemplateConfig() {
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定义输出模板
// 指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
// templateConfig.setEntity("templates/entity2.java");
// templateConfig.setService();
// templateConfig.setController();
templateConfig.setXml(null);
return templateConfig;
}
/** 6.策略配置 */
private static StrategyConfig getStrategyConfig() {
StrategyConfig strategy = new StrategyConfig();
// 下划线转驼峰命名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(false);
strategy.setRestControllerStyle(true);
strategy.setInclude(TBL_NAMES.split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(TABLE_PREFIX);
return strategy;
}
}
8.RoleMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yuwen.demo.mapper.RoleMapper">
</mapper>
9.Role.java
package com.yuwen.demo.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author yuwen
* @since 2020-07-07
*/
@TableName("TBL_ROLE")
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private Long id;
/**
* 角色名
*/
private String roleName;
/**
* 角色描述
*/
private String roleDescribe;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRoleDescribe() {
return roleDescribe;
}
public void setRoleDescribe(String roleDescribe) {
this.roleDescribe = roleDescribe;
}
@Override
public String toString() {
return "Role{" +
"id=" + id +
", roleName=" + roleName +
", roleDescribe=" + roleDescribe +
"}";
}
}
10.RoleMapper.java
package com.yuwen.demo.mapper;
import com.yuwen.demo.entity.Role;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author yuwen
* @since 2020-07-07
*/
public interface RoleMapper extends BaseMapper<Role> {
}
11.RoleService.java
package com.yuwen.demo.service;
import com.yuwen.demo.entity.Role;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author yuwen
* @since 2020-07-07
*/
public interface RoleService extends IService<Role> {
}
12.RoleServiceImpl.java
13.RoleController
package com.yuwen.demo.service.impl;
import com.yuwen.demo.entity.Role;
import com.yuwen.demo.mapper.RoleMapper;
import com.yuwen.demo.service.RoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author yuwen
* @since 2020-07-07
*/
@Service
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
}
14.参考
SpringBoot集成MyBatis-Plus代码生成器的更多相关文章
- 0120 springboot集成Mybatis和代码生成器
在日常开发中,数据持久技术使用的架子使用频率最高的有3个,即spring-jdbc , spring-jpa, spring-mybatis.详情可以看我之前的一篇文章spring操作数据库的3个架子 ...
- springboot集成mybatis(二)
上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...
- springboot集成mybatis(一)
MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...
- SpringBoot 集成Mybatis 连接Mysql数据库
记录SpringBoot 集成Mybatis 连接数据库 防止后面忘记 1.添加Mybatis和Mysql依赖 <dependency> <groupId>org.mybati ...
- SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)
SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版) ================================ ©Copyright 蕃薯耀 2 ...
- SpringBoot集成Mybatis并具有分页功能PageHelper
SpringBoot集成Mybatis并具有分页功能PageHelper 环境:IDEA编译工具 第一步:生成测试的数据库表和数据 SET FOREIGN_KEY_CHECKS=0; ...
- Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket
https://blog.csdn.net/a123demi/article/details/78234023 : Springboot集成mybatis(mysql),mail,mongodb,c ...
- BindingException: Invalid bound statement (not found)问题排查:SpringBoot集成Mybatis重点分析
重构代码,方法抛出异常:BindingException: Invalid bound statement (not found) 提示信息很明显:mybatis没有提供某方法 先不解释问题原因和排查 ...
- SpringBoot集成Mybatis配置动态数据源
很多人在项目里边都会用到多个数据源,下面记录一次SpringBoot集成Mybatis配置多数据源的过程. pom.xml <?xml version="1.0" encod ...
- SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)
下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式. 首先我们先创建两个数据库表,分别是user用户表和account账户表 ...
随机推荐
- centos7 自动同步时间
rm -rf /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime vim /etc/sysconfig/cloc ...
- 看看线程特有对象ThreadLocal
作用:设计线程安全的一种技术. 在使用多线程的时候,如果多个线程要共享一个非线程安全的对象,常用的手段是借助锁来实现线程的安全.线程安全隐患的前提是多线程共享一个不安全的对象 ,那么有没有办法让线程之 ...
- MySQL记录锁、间隙锁、临键锁小案例演示
生成间隙(gap)锁.临键(next-key)锁的前提条件 是在 RR 隔离级别下. 有关Mysql记录锁.间隙(gap)锁.临键锁(next-key)锁的一些理论知识之前有写过,详细内容可以看这篇文 ...
- last显示出unknown用户
这问题是群里有朋友发了一张照片看到的: 出现问题第一时间当然是百度或者谷歌,结果还是查到了,原来是gdm作怪,也可以认为是bug 该用户由GDM创建(可能是由于错误).并不是真的有"未知&q ...
- presto官网阅读记录: Functions and Operators 部分
官网Functions and Operators部分 版本:0.266 目录 官网Functions and Operators部分 1 Comparison Functions and Opera ...
- 前置任务(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 在[前置任务列]中编辑任务关联,这是个正经的设置. 说他"正经",是因为在[手动模式]下,这个设置也是 ...
- AT1445 乱数生成 题解
Description 有一个机器会等概率从 \(1\) 到 \(n\) 的正整数中选出一个整数.显然地,这个机器运行 \(3\) 次后会得到 \(3\) 个整数.求这 \(3\) 个整数的中位数是 ...
- Python的 垃圾回收机制
垃圾回收 1. 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 257) 这些整 ...
- centos7使用docker安装es(elasticsearch)
1.安装docker依赖(已安装可以不用安装) yum install -y docker 2.搜索镜像 docker search elasticsearch 如果出现以下报错 Cannot con ...
- summernote富文本图片上传,增加视频上传功能、批量上传方法
Summernote 是一个简单灵活的所见即所得的 HTML 在线编辑器,基于 jQuery 和 Bootstrap 构建,支持快捷键操作,提供大量可定制的选项. 但是却只有图片上传功能,没有视频上传 ...