MyBatis-plus MyBatis 自动生成代码
MyBatis-Plus版
导入依赖
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!-- mybatisPlus 整合启动包 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<!-- 生成代码包 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.0</version>
</dependency>
<!-- 模版引擎,这里不是用的官方默认的🉑️查看官方文档 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
第一种不定义生成策略(运行main方法即可)
package com.initialize.pub.mybatis.plus;
import com.baomidou.mybatisplus.annotation.DbType;
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.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
* @program: initialize-project
* @description: MybatisPlus生成类
* @author: Mr.Lu
* @create: 2020-06-09 17:45
**/
public class MybatisPlus {
//作者
private static final String author = "MyLu";
//数据库驱动
private static final String driverName = "com.mysql.cj.jdbc.Driver";
//数据库用户名
private static final String userName = "用户名";
//数据库用户密码
private static final String password = "密码";
//数据库连接
private static final String url = "jdbc:mysql://localhost:3306/数据库?useUnicode=true&characterEncoding=utf8";
//代码生成位置
private static final String codePath = "/initialize-pub/initialize-pub-mybatis-plus/src/main/java";
//模块名
private static final String moduleName = "com.initialize.pub.mybatis.plus";
/**
* codePath+moduleName 拼接成的路径是代码生成的具体路径,根据自己项目改动
*/
public static void main(String[] args) {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir") + codePath);
globalConfig.setFileOverride(false);//是否覆盖之前的文件
globalConfig.setSwagger2(true);
globalConfig.setAuthor(author);
globalConfig.setOpen(false);
AutoGenerator mpg = new AutoGenerator();
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.setGlobalConfig(globalConfig);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setDriverName(driverName);
dsc.setUsername(userName);
dsc.setPassword(password);
dsc.setUrl(url);
mpg.setDataSource(dsc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setEntityLombokModel(true);
// strategy.setEntityBuilderModel(true);
strategy.setEntityTableFieldAnnotationEnable(true);
strategy.setCapitalMode(true);
strategy.setTablePrefix("P");
strategy.setControllerMappingHyphenStyle(false);
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
strategy.setInclude("sys_user"/*用户表*/, "sys_user_role"/*用户角色中间表*/, "sys_role"/*角色表*/, "sys_role_menu"/*角色权限中间表*/, "sys_menu"/*权限表*/); // 需要生成的表
mpg.setStrategy(strategy);
// 包配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent(moduleName);
mpg.setPackageInfo(packageConfig);
// 执行生成
mpg.execute();
}
}
第二种自定义生成策略
⚠️ 自定义生成策略 比如我们不需要自动生成controller层 可进行调整
package com.initialize.pub.mybatis.plus;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.io.File;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
/**
* @program: initialize-project
* @description: MybatisPlus生成类
* @author: Mr.Lu
* @create: 2020-06-09 17:45
**/
public class MybatisStartGenerator {
//作者
private static final String author = "MyLu";
//数据库驱动
private static final String driverName = "com.mysql.cj.jdbc.Driver";
//数据库用户名
private static final String userName = "用户名";
//数据库用户密码
private static final String password = "密码";
//数据库连接
private static final String url = "jdbc:mysql://localhost:3306/数据库?useUnicode=true&characterEncoding=utf8";
//代码生成位置
private static final String codePath = "/initialize-pub/initialize-pub-mybatis-plus/src/main/java/";
//模块名
private static final String moduleName = "com.initialize.pub.mybatis.plus";
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setFileOverride(false);// ***###是否覆盖之前的文件###***
gc.setOpen(true);
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
gc.setAuthor(author);
gc.setOpen(false);
gc.setSwagger2(true); //实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
/*DataSourceConfig dsc =
new DataSourceConfig().setDbQuery(new MySqlQuery() {
*/
/**
* 重写父类预留查询自定义字段<br>
* 这里查询的 SQL 对应父类 tableFieldsSql 的查询字段,默认不能满足你的需求请重写它<br>
* 模板中调用: table.fields 获取所有字段信息,
* 然后循环字段获取 field.customMap 从 MAP 中获取注入字段如下 NULL 或者 PRIVILEGES
*/
/*
@Override
public String[] fieldCustom() {
return new String[]{"NULL", "PRIVILEGES"};
}
});*/
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
// dsc.setSchemaName("public");
dsc.setDbType(DbType.MYSQL);
dsc.setDriverName(driverName);
dsc.setUsername(userName);
dsc.setPassword(password);
dsc.setUrl(url);
mpg.setDataSource(dsc);
// 包配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setModuleName(moduleName); //模块名
// pc.setParent("com.study.mybatisplus");
mpg.setPackageInfo(packageConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// strategy.setSuperEntityClass("com.mybatisplus.movie.common.BaseEntity");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(packageConfig.getModuleName() + "_");
strategy.setEntityColumnConstant(true);
strategy.setEntityBuilderModel(true);
strategy.setEntityTableFieldAnnotationEnable(true);
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
// 公共父类
// strategy.setSuperEntityClass("abc");
// strategy.setSuperControllerClass("com.initialize.pub.mybatis.plus.BaseController");
// 写于父类中的公共字段
// strategy.setSuperEntityColumns("id");
strategy.setInclude("sys_user"/*用户表*/, "sys_user_role"/*用户角色中间表*/, "sys_role"/*角色表*/, "sys_role_menu"/*角色权限中间表*/, "sys_menu"/*权限表*/); // 需要生成的表
//自定义文件生成路径,包路径
//这里调用customPackagePath方法,使用可以自己在内部灵活配置路径
//如果不调用该方法、就会使用MyBatis-Plus默认的文件生成路径和包路径生成文件、但可以使用上面的PackageConfig做一些简单的配置
customPackagePath(packageConfig, mpg);
mpg.execute();
}
/**
* 自定义包路径,文件生成路径,这边配置更灵活
* 虽然也可以使用InjectionConfig设置FileOutConfig的方式设置路径
* 这里直接使用Map方式注入ConfigBuilder配置对象更加直观
*
* @param packageConfig
* @param mpg
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
private static void customPackagePath(PackageConfig packageConfig, AutoGenerator mpg) throws NoSuchFieldException, IllegalAccessException {
String projectPath = System.getProperty("user.dir");
String mavenPath = codePath;
String srcPath = projectPath + mavenPath;
String moduleName = packageConfig.getModuleName();
/**
* packageInfo配置controller、service、serviceImpl、entity、mapper等文件的包路径
* 这里包路径可以根据实际情况灵活配置
*/
Map<String, String> packageInfo = new HashMap<>();
packageInfo.put(ConstVal.CONTROLLER, moduleName + ".controller");
packageInfo.put(ConstVal.SERVICE, moduleName + ".service");
packageInfo.put(ConstVal.SERVICE_IMPL, moduleName + ".service.impl");
packageInfo.put(ConstVal.ENTITY, moduleName + ".entity");
packageInfo.put(ConstVal.MAPPER, moduleName + ".mapper");
packageInfo.put(ConstVal.XML, moduleName + ".mapper.xml");
/**
* pathInfo配置controller、service、serviceImpl、entity、mapper、mapper.xml等文件的生成路径
* srcPath也可以更具实际情况灵活配置
* 后面部分的路径是和上面packageInfo包路径对应的源码文件夹路径
* 这里你可以选择注释其中某些路径,可忽略生成该类型的文件,例如:注释掉下面pathInfo中Controller的路径,就不会生成Controller文件
*/
Map pathInfo = new HashMap<>();
// pathInfo.put(ConstVal.CONTROLLER_PATH, apiUrl + packageInfo.get(ConstVal.CONTROLLER).replaceAll("\\.", StringPool.BACK_SLASH + File.separator));
pathInfo.put(ConstVal.SERVICE_PATH, srcPath + packageInfo.get(ConstVal.SERVICE).replaceAll("\\.", StringPool.BACK_SLASH + File.separator));
pathInfo.put(ConstVal.SERVICE_IMPL_PATH, srcPath + packageInfo.get(ConstVal.SERVICE_IMPL).replaceAll("\\.", StringPool.BACK_SLASH + File.separator));
pathInfo.put(ConstVal.ENTITY_PATH, srcPath + packageInfo.get(ConstVal.ENTITY).replaceAll("\\.", StringPool.BACK_SLASH + File.separator));
pathInfo.put(ConstVal.MAPPER_PATH, srcPath + packageInfo.get(ConstVal.MAPPER).replaceAll("\\.", StringPool.BACK_SLASH + File.separator));
pathInfo.put(ConstVal.XML_PATH, srcPath + packageInfo.get(ConstVal.XML).replaceAll("\\.", StringPool.BACK_SLASH + File.separator));
// pathInfo.put(ConstVal.XML_PATH, projectPath + "/initialize-pub/initialize-pub-mybatis-plus/src/main/resources/mapper");
packageConfig.setPathInfo(pathInfo);
/**
* 创建configBuilder对象,传入必要的参数
* 将以上的定义的包路径packageInfo配置到赋值到configBuilder对象的packageInfo属性上
* 因为packageInfo是私有成员变量,也没有提交提供公共的方法,所以使用反射注入
* 为啥要这么干,看源码去吧
*/
ConfigBuilder configBuilder = new ConfigBuilder(mpg.getPackageInfo(), mpg.getDataSource(), mpg.getStrategy(), mpg.getTemplate(), mpg.getGlobalConfig());
Field packageInfoField = configBuilder.getClass().getDeclaredField("packageInfo");
packageInfoField.setAccessible(true);
packageInfoField.set(configBuilder, packageInfo);
/**
* 设置配置对象
*/
mpg.setConfig(configBuilder);
}
}
MyBatis版本
导入依赖
<!-- Mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Mybatis包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<!-- Mybatis于SpringBoot整合包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
插件导入
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<!--mybatis反向生成-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>deploy</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<!--允许移动生成的文件 -->
<verbose>true</verbose>
<!-- 是否覆盖 -->
<overwrite>true</overwrite>
<!-- 自动生成的配置 -->
<configurationFile>
src/main/resources/generatorConfig.xml
</configurationFile>
</configuration>
</plugin>
</plugins>
</build>
⚠️ 重点,在配置插件的时候,配置了自动生成代码的 .xml 目录 在这个目录新建 generatorConfig.xml
配置自动生成代码的xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : true:否 -->
<property name="suppressAllComments" value="false"/>
</commentGenerator>
<!--数据库链接地址账号密码-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/qq?characterEncoding=utf8"
userId="账号" password="密码">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="true"/>
</javaTypeResolver>
<!--生成Model类存放位置-->
<javaModelGenerator targetPackage="com.initialize.pub.generate.pojo" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成映射文件存放位置-->
<sqlMapGenerator targetPackage="com.initialize.pub.generate.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.initialize.pub.generate.dao"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 数据库的表 -->
<table tableName="user" domainObjectName="User" enableCountByExample="true" enableUpdateByExample="true"
enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true"/>
</context>
</generatorConfiguration>