下面我会详细介绍一下如何使用 MyBatis-Plus 自动生成器,以及在使用过程中可能会遇到哪些坑。
一、MyBatis-Plus 自动生成器概述
MyBatis-Plus 自动生成器是一种通过模板自动生成代码的快速开发工具。它可以根据定义的实体类和模板,自动生成增删改查的 Dao 文件、实体类文件、服务接口文件以及部分控制器文件等。
二、如何使用 Mybatis-Plus 自动生成器
- 配置自动生成器
在 pom.xml 文件中引入 MyBatis-Plus 自动生成器的依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.0.6</version>
</dependency>
在 resources 文件夹下创建generator.properties配置文件,指定生成配置。具体配置项可以参考官方文档:MyBatis-Plus 自动生成器配置项
- 编写 Entity
在项目中编写对应的Entity:java文件即可。Entity类中应当包含对应表的字段以及getter、setter方法。同时在 Entity 类中添加 @TableName 注解,指定对应数据库表名。
@Data
@TableName("user")
public class User {
@TableId(value = "id",type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
}
- 编写模板
在项目中创建对应的模板文件,例如 Mapper.xml.ftl 文件用于生成 Mapper 类文件。模板里面可以包含对应增删改查的 sql 语句。
模板文件示例 mapper.xml.ftl:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${mapperPackage}.${entityName}Mapper">
\t<resultMap id="BaseResultMap" type="${entityPackage}.${entityName}">
\t\t<id column="id" property="id" />
\t\t<result column="name" property="name" />
\t\t<result column="age" property="age" />
\t</resultMap>
\t<sql id="Base_Column_List">
\t\tid, name, age
\t</sql>
\t<select id="selectById" resultMap="BaseResultMap" parameterType="java.lang.Long">
\t\tselect * from user where id = #{id}
\t</select>
</mapper>
- 运行 MyBatis-Plus 自动生成器
在项目中运行 MyBatis-Plus 自动生成器指令即可快速生成对应的代码文件:
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
//全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(outputDir);
gc.setAuthor(author);
gc.setOpen(false);
gc.setSwagger2(true);
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
mpg.setGlobalConfig(gc);
mpg.setDataSource(dataSourceConfig);
mpg.setPackageInfo(pkgConfig);
// 配置自动生成器
mpg.setCfg(injectionConfig);
// 配置模板
TemplateConfig tc = new TemplateConfig();
tc.setXml(null);
mpg.setTemplate(tc);
// 配置策略
StrategyConfig strategy = new StrategyConfig();
// 表名下划线转驼峰命名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 公共父实体
strategy.setSuperEntityColumns("id");
strategy.setSuperControllerClass("com.example.demo.controller.base.BaseController");//父类controller
strategy.setSuperEntityClass("com.example.demo.entity.base.BaseEntity");//父类entity
strategy.setInclude("user");//需要生成的表名
mpg.setStrategy(strategy);
mpg.execute();
}
这样就可以快速生成对应的 Dao、Service、Controller、Entity 等基础代码文件。
三、可能遇到的坑
1. 数据库表名与实体类名不匹配
如果数据表名和实体类名不一致,需要在 Entity 类上通过 @TableName 注解指定对应的数据表名。若不指定,则会按照默认的驼峰命名规则自动匹配。
2. 数据库字段名与实体类属性名不匹配
如果数据库表字段名与实体类属性名不一致,需要在 Entity 类上通过 @TableField 注解 指定对应的数据库字段名,若不指定,则会按照默认的驼峰命名规则自动匹配。
3. 复杂查询的sql语句自动生成会存在问题
Mybatis-plus 自动生成器只能生成简单的增删改查的 sql 语句,一些复杂的查询语句需要手写。
四、示例
示例一
例如以下代码可以生成对应的user表的增删改查操作代码:
public class AutoGeneratorApplication {
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
//全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir("/Users/baiyyang/Documents/pri/daily-practice/mybatis-plus-example/src/main/java");
gc.setAuthor("byYang");
gc.setOpen(false);
gc.setSwagger2(true);
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
mpg.setGlobalConfig(gc);
//数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/mybatis-plus-example?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
mpg.setDataSource(dsc);
//包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.yangbai");
mpg.setPackageInfo(pc);
// 配置自动生成器
mpg.setCfg(getInjectionConfig());
// 配置模板
TemplateConfig tc = new TemplateConfig();
tc.setXml(null);
mpg.setTemplate(tc);
// 配置策略
StrategyConfig strategy = new StrategyConfig();
// 表名下划线转驼峰命名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 公共父实体
strategy.setSuperEntityColumns("id");
strategy.setSuperControllerClass("com.yangbai.controller.base.BaseController");//父类controller
strategy.setSuperEntityClass("com.yangbai.entity.base.BaseEntity");//父类entity
strategy.setInclude("user");//需要生成的表名
mpg.setStrategy(strategy);
mpg.execute();
System.out.println("finish");
}
/**
* 自定义配置
* @return
*/
private static InjectionConfig getInjectionConfig(){
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
Map<String, Object> map = new HashMap<>();
this.setMap(map);
}
};
String templatePath = "/templates/mapper.xml.ftl";
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名, 如果Entity设置了前后缀、此处注意xml的名称会跟着发生变化
System.out.println(tableInfo.getEntityName());
return "/Users/baiyyang/Documents/pri/daily-practice/mybatis-plus-example/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
}
});
cfg.setFileOutConfigList(focList);
return cfg;
}
}
示例二
下面是generator.properties的配置示例:
# 全局配置
config.author=byy表示作者
config.outputDir=/Users/baiyyang/Documents/pri/daily-practice/mybatis-plus-example/src/main/java
config.fileOverride=false
# 数据源配置
dataSource.dbName=mybatis-plus-example
dataSource.type=com.alibaba.druid.pool.DruidDataSource
dataSource.driverName=com.mysql.cj.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/mybatis-plus-example?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
dataSource.username=root
dataSource.password=root
# 包配置
package.basePackage=com.yangbai
package.entityName=entity
package.mapperName=mapper
package.serviceName=service
package.controllerName=controller
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis plus自动生成器解析(及遇到的坑) - Python技术站