构建Mybatis-Plus代码生成器
版本:mybatis-3.4.0,mysql-8.0.25,springmvc-5.3.23。
这个代码生成器用于快速构建用户所需的类,如下:
-
实体类: 生成与数据库表对应的 Java 实体类,包含字段和 getter/setter 方法。
-
Mapper 接口: 生成与数据库表对应的 Mapper 接口,包含基本的 CRUD 操作。
-
Service 接口: 生成与实体类对应的 Service 接口。
-
Service 实现类: 生成 Service 接口的实现类。
-
Controller 类: 生成 RESTful 风格的 Controller 类,处理 HTTP 请求。
-
XML 映射文件: 生成与 Mapper 接口对应的 XML 文件,包含 SQL 映射。
当用户执行代码生成器
工具类,然后输入数据库的表名时,会自动生成该表所对应的实体类,mapper接口,service接口,service实现类,controller类以及mapper接口对应的mapper.xml文件。
下面是具体的构建过程。
构建spirng项目
使用idea构建项目之后,项目的目录结构如下图所示:
引入相关依赖
在项目的pom.xml
项目文件中引入所需依赖。
pom.xml
<dependencies>
<!-- mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.23</version>
</dependency>
<!--==============引入mybatis-plus代码生成器相关依赖start==================-->
<!-- MyBatis-Plus Core -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.4.0</version> <!-- 确保使用最新稳定版本 -->
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version> <!-- 确保使用兼容版本 -->
</dependency>
<!-- MySQL Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version> <!-- 根据需要选择版本 -->
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<!-- FreeMarker (用于代码生成器模板) -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version> <!-- 根据需要选择版本 -->
</dependency>
<!-- Apache Commons Lang (可选) -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- Log4j 2 (SLF4J 实现) 防止代码生成器的控制台报红!!!-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!--==============引入mybatis-plus代码生成器相关依赖end==================-->
</dependencies>
编写代码生成器
在src/main/java/com/ego/util
的下面编写代码生成的工具类。
CodeGenerator.java
package com.ego.util;
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.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
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.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("");
//打开输出目录
gc.setOpen(false);
//xml开启 BaseResultMap
gc.setBaseResultMap(true);
//xml 开启BaseColumnList
gc.setBaseColumnList(true);
//日期格式,采用Date
gc.setDateType(DateType.ONLY_DATE);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/ego?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root1234!");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.ego")
.setEntity("pojo")
.setMapper("mapper")
.setService("service")
.setServiceImpl("service.impl")
.setController("controller");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
Map<String, Object> map = new HashMap<>();
map.put("date1", "1.0.0");
this.setMap(map);
}
};
// 如果模板引擎是 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/" +
tableInfo.getEntityName() + "Mapper"
+ StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板,注意不要后缀.ftl!!!
TemplateConfig templateConfig = new TemplateConfig()
.setEntity("templates/entity.java")
.setMapper("templates/mapper.java")
.setService("templates/service.java")
.setServiceImpl("templates/serviceImpl.java")
.setController("templates/controller.java");
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
//数据库表映射到实体的命名策略
strategy.setNaming(NamingStrategy.underline_to_camel);
//数据库表字段映射到实体的命名策略
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//lombok模型
//strategy.setEntityLombokModel(true);
//生成 @RestController 控制器
// strategy.setRestControllerStyle(true);
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
//表前缀
strategy.setTablePrefix("t_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
复制模板文件
在spring项目中找到对应的模板文件,并把他们复制到templates下面,并且一定要在CodeGenerator.java
指定他们的位置,注意指定的时候不要后缀.ftl
)。
输入表名测试
运行工具类CodeGenerator.java
,然后输入数据库中对应的表名。
执行完毕之后,在项目的目录结构下面进行查看。
如图所示,构建完成。
我们点击进去查看Order
相关的对象,查看是否构建完成。
pojo对象
Order.java
// ....
/**
* <p>
*
* </p>
*
* @author
* @since 2024-08-26
*/
@TableName("t_order")
public class Order implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 订单id
*/
@TableId(value = "order_id", type = IdType.AUTO)
private Integer orderId;
/**
* 订单编号
*/
private String orderSn;
/**
* 用户id
*/
private Integer userId;
// ....
}
controller对象
OrderController.java
/**
* <p>
* 前端控制器
* </p>
*
* @author
* @since 2024-08-26
*/
@Controller
@RequestMapping("/order")
public class OrderController {
}
service实现类对象
OrderServiceImpl.java
/**
* <p>
* 服务实现类
* </p>
*
* @author
* @since 2024-08-26
*/
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {
}
说明,本人参考的是老版本的构建过程,如果需要新版本的,请移步MyBatis-Plus。