MybatisPlus3.3.2代码生成器

本文介绍了如何在Maven项目中使用MybatisPlusGenerator,通过配置pom.xml来管理版本依赖,并展示如何根据数据库表结构自动生成Java模型类、Mapper接口等。
摘要由CSDN通过智能技术生成

pom文件添加:

    <properties>
        <mybatis-plus-boot-starter.version>3.3.2</mybatis-plus-boot-starter.version>
        <mybatis-plus-generator.version>3.3.2</mybatis-plus-generator.version>
        <freemarker.version>2.3.29</freemarker.version>
    </properties>
       
    <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>${mybatis-plus-generator.version}</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>${freemarker.version}</version>
    </dependency>

代码如下:

package com.knodi.common;

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.FileType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * desc:MybatisPlus自动生成器,生成的model最好自己格式化一下
 *
 * @author gy
 * @date 2020/4/21
 */
public class MybatisPlusGenerator {

	public static void main(String[] args) {
		String url = "jdbc:mysql://10.110.152.175:3306/custom?useUnicode=true&useSSL=false&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai";
		String username = "custom";
		String password = "custom";
		// 数据库名
		String database = "custom";
		// 工程里main文件地址,如果是多模块,需要带模块的路径,例如有个叫server的module模块:server/src/main
		String mainPath = "custom/src/main";
		// main路径下的包名,代码会生成到此包下
		String parentPackage = "com.knodi.custom";
		// 要去掉的表名的前缀,没有可以传null
		String tablePrefix = null;
		// 要生成的table表名
		String[] tables = new String[]{"table1", "table2"};
		// 指定数据库表名生成代码
		//generate(url, username, password, mainPath, parentPackage, tablePrefix, tables);
		// 指定数据库生成该库下所有表相关的代码
		generate(url, username, password, database, mainPath, parentPackage, tablePrefix);
	}

	private static final String XML_BEGIN = "<!-- ## 这里的代码不会被生成器覆盖 begin ## -->";

	private static final String XML_END = "<!-- ## 这里的代码不会被生成器覆盖 end ## -->";

	private static final String JAVA_BEGIN = "/* ## 这里的代码不会被生成器覆盖 begin ## */";

	private static final String JAVA_END = "/* ## 这里的代码不会被生成器覆盖 end ## */";

	public static final String XML_SUFFIX = ".xml";

	public static void generate(String url, String username, String password, String database, String mainPath, String parentPackage, String tablePrefix) {
		try (Connection conn = DriverManager.getConnection(url, username, password);
			 Statement stat = conn.createStatement();
		) {
			String tableQuery = "SELECT TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = '" + database + "';";
			List<String> tableList = new ArrayList<>();
			ResultSet tableSet = stat.executeQuery(tableQuery);
			while (tableSet.next()) {
				tableList.add(tableSet.getString(1));
			}
			generate(url, username, password, mainPath, parentPackage, tablePrefix, tableList.toArray(new String[tableList.size()]));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("AlibabaMethodTooLong")
	public static void generate(String url, String username, String password, String mainPath, String parentPackage, String tablePrefix, String[] tables) {
		// 代码生成器
		AutoGenerator mpg = new AutoGenerator();
		// 全局配置
		GlobalConfig gc = new GlobalConfig();
		String projectPath = System.getProperty("user.dir");
		gc.setOutputDir(projectPath + "/" + mainPath + "/java");
		// 设置用户名
		gc.setAuthor("MybatisPlusGenerator");
		gc.setOpen(true);
		// service 命名方式
		gc.setServiceName("%sManager");
		// service impl 命名方式
		gc.setServiceImplName("%sManagerImpl");
		// 自定义文件命名,注意 %s 会自动填充表实体属性!
		gc.setMapperName("%sDao");
		gc.setXmlName("%sMapper");
		gc.setActiveRecord(true);
		// XML 二级缓存
		gc.setEnableCache(false);
		// XML ResultMap
		gc.setBaseResultMap(true);
		// XML columnList
		gc.setBaseColumnList(true);
		mpg.setGlobalConfig(gc);

		// 数据源配置
		DataSourceConfig dsc = new DataSourceConfig();
		dsc.setUrl(url);
		dsc.setDriverName("com.mysql.cj.jdbc.Driver");
		dsc.setUsername(username);
		dsc.setPassword(password);
		mpg.setDataSource(dsc);

		// 包配置
		PackageConfig pc = new PackageConfig();
		pc.setParent(parentPackage);
		pc.setEntity("model");
		pc.setMapper("dao");
		pc.setService("manager");
		pc.setServiceImpl("manager.impl");
		mpg.setPackageInfo(pc);

		// 自定义配置
		InjectionConfig cfg = new InjectionConfig() {
			@Override
			public void initMap() {
				// to do nothing
			}
		};
		List<FileOutConfig> focList = new ArrayList<>();
		focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
			@Override
			public String outputFile(TableInfo tableInfo) {
				// 自定义输入文件名称
				return projectPath + "/" + mainPath + "/resources/mapper/"
						+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
			}
		});
		cfg.setFileOutConfigList(focList);
		Map<String, String> fileMap = new HashMap<>(16);
		cfg.setFileCreate((configBuilder, fileType, filePath) -> {
			//否则先判断文件是否存在
			File file = new File(filePath);
			boolean exist = file.exists();
			if (!exist) {
				file.getParentFile().mkdirs();
			}
			//如果是Entity则直接返回true表示写文件
			if (fileType == FileType.ENTITY || fileType == FileType.OTHER) {
				String custom = "";
				if (exist) {
					try {
						BufferedReader in = new BufferedReader(new FileReader(filePath));
						StringBuilder stringBuilder = new StringBuilder();
						String str;
						while ((str = in.readLine()) != null) {
							stringBuilder.append(str + "\n");
						}

						if (fileType == FileType.ENTITY) {
							if ((stringBuilder.indexOf(JAVA_BEGIN) > -1)) {
								custom = "\n\t" + stringBuilder.substring(stringBuilder.indexOf(JAVA_BEGIN), stringBuilder.indexOf(JAVA_END) + JAVA_END.length());
							}
						} else {
							if ((stringBuilder.indexOf(XML_BEGIN) > -1)) {
								custom = "\n\t" + stringBuilder.substring(stringBuilder.indexOf(XML_BEGIN), stringBuilder.indexOf(XML_END) + XML_END.length());
							}
						}
					} catch (IOException e) {
					}
				}
				if (!exist || "".equals(custom)) {
					if (fileType == FileType.ENTITY) {
						custom = "\n\t" + JAVA_BEGIN + "\n\n\t" + JAVA_END;
					} else {
						custom = "\n\t" + XML_BEGIN + "\n\n\t" + XML_END;
					}
				}
				fileMap.put(filePath, custom);
				return true;
			}
			//文件不存在或者全局配置的fileOverride为true才写文件
			return !exist || configBuilder.getGlobalConfig().isFileOverride();
		});
		mpg.setCfg(cfg);
		TemplateConfig templateConfig = new TemplateConfig();
		//不生成生成controller,需要的话注释掉下面一行代码
		templateConfig.setController("");
		templateConfig.setXml(null);
		mpg.setTemplate(templateConfig);

		// 策略配置
		StrategyConfig strategy = new StrategyConfig();
		strategy.setNaming(NamingStrategy.underline_to_camel);
		strategy.setColumnNaming(NamingStrategy.underline_to_camel);
		strategy.setEntityLombokModel(true);
		strategy.setEntityTableFieldAnnotationEnable(true);

		// 指定生成的bean的数据库表名
		strategy.setInclude(tables);
		//去掉前缀
		if (StringUtils.isNotBlank(tablePrefix)) {
			strategy.setTablePrefix(tablePrefix);
		}
		// 驼峰转连字符
		strategy.setControllerMappingHyphenStyle(true);
		mpg.setStrategy(strategy);
		// 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
		mpg.setTemplateEngine(new FreemarkerTemplateEngine());
		mpg.execute();

		fileMap.forEach((f, s) -> {
			try {
				BufferedReader in = new BufferedReader(new FileReader(f));
				StringBuilder stringBuilder = new StringBuilder();
				String str;
				while ((str = in.readLine()) != null) {
					stringBuilder.append(str + "\n");
				}
				if (f.endsWith(XML_SUFFIX)) {
					stringBuilder.replace(stringBuilder.lastIndexOf("</mapper>"), stringBuilder.length(), s + "\n</mapper>");
				} else {
					stringBuilder.replace(stringBuilder.lastIndexOf("}"), stringBuilder.length(), s + "\n}");
				}
				BufferedWriter writer = new BufferedWriter(new FileWriter(f));
				writer.write(stringBuilder.toString());
				writer.close();
			} catch (IOException e) {
			}
		});
	}

}
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-plus代码生成器是一个快速生成Mybatis-plus代码的工具,它可以根据数据库表自动生成实体类、Mapper接口、Service接口、Controller接口等代码,可以大大提高开发效率。 使用Mybatis-plus代码生成器需要先引入相关依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.2</version> </dependency> ``` 接下来,需要编写一个代码生成器的配置类,示例代码如下: ``` package com.example.demo.generator; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; 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.config.rules.TableFill; import com.baomidou.mybatisplus.generator.config.rules.TableInfo; import com.baomidou.mybatisplus.generator.config.rules.TableInfoHelper; import java.util.ArrayList; import java.util.List; public class CodeGenerator { public static void main(String[] args) { // 数据源配置 DataSourceConfig dsc = new DataSourceConfig.Builder("jdbc:mysql://localhost:3306/demo", "root", "123456") .driverName("com.mysql.jdbc.Driver") .dbType(DbType.MYSQL) .build(); // 全局配置 GlobalConfig gc = new GlobalConfig.Builder() .outputDir("D:\\code\\demo\\src\\main\\java") .author("example") .openDir(false) .fileOverride(true) .serviceName("%sService") .build(); // 包配置 PackageConfig pc = new PackageConfig.Builder() .parent("com.example.demo") .moduleName("") .build(); // 策略配置 StrategyConfig sc = new StrategyConfig.Builder() .addTablePrefix("t_") .addIncludeTables("user") .entityBuilder() .naming(NamingStrategy.underline_to_camel) .columnNaming(NamingStrategy.underline_to_camel) .tableFillList(getTableFills()) .idType(IdType.AUTO) .build(); // 代码生成器 AutoGenerator mpg = new AutoGenerator.Builder() .globalConfig(gc) .dataSource(dsc) .packageConfig(pc) .strategy(sc) .build(); // 执行生成代码 mpg.execute(); } // 自动填充配置 private static List<TableFill> getTableFills() { List<TableFill> tableFills = new ArrayList<>(); tableFills.add(new TableFill("create_time", TableFill.INSERT)); tableFills.add(new TableFill("update_time", TableFill.UPDATE)); return tableFills; } } ``` 在配置类中,需要配置数据源、全局配置、包配置和策略配置等信息。其中,策略配置是比较重要的部分,可以通过这个配置来指定需要生成代码的表、指定表前缀、指定实体类的命名规则等。 配置好之后,执行main方法即可生成代码。生成的代码默认放在指定的包路径下,包括实体类、Mapper接口、Service接口、Controller接口等。其中,实体类会自动添加@TableId和@TableName注解,Mapper接口会继承BaseMapper接口,Service接口和Controller接口需要手动实现。 总之,Mybatis-plus代码生成器是一个非常实用的工具,可以大大提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值