mybatisplus自动生成实体类,mapper,controller

文章介绍了如何在SpringBoot项目中配置MybatisPlus性能插件和分页插件,以及如何使用MyGenerator自动生成Java代码,包括数据库连接配置和表结构映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.ixinnuo.common.db.MyGenerator;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan(value = {"com.core.mapper"})
public class MybatisPlusConfig {

    /**
     * mybatis-plus SQL执行效率插件【生产环境可以关闭】
     */
    @Bean
    //	@Profile(value = {"default", "test"})
    public PerformanceInterceptor performanceInterceptor() {
        return new PerformanceInterceptor();
    }

    /**
     * mybatis-plus分页插件<br>
     * 文档:http://mp.baomidou.com<br>
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }

	public static void main(String[] args) {
		//		System.out.println(MyGenerator.getDir());
		MyGenerator.generator(MyGenerator.getDir(), "com.core", "ecp_", "ecp_subsidiary_table");
	}
}
package com.ixinnuo.common.db;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
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.AbstractTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.ixinnuo.common.utils.YamlUtils;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyGenerator extends AutoGenerator {
	private static final String propertiesName = "application.yml";
	public static String domain_name = "ecp-entity";
	public static String srcdir = ".";
	public static boolean onlyEntity = false;
	public static String driverName = "com.mysql.cj.jdbc.Driver";
	public static String url =
			"jdbc:mysql://127.0.0.1:3306/zx_dev?useUnicode=true&characterEncoding=UTF" + "-8" +
					"&zeroDateTimeBehavior=convertToNull&useSSL=false";
	public static String username = "root";
	public static String password = "1234";

	static {
		initDatasource();
	}

	private static void initDatasource() {
		driverName = YamlUtils.getStr("spring.datasource.driverClassName", "com.mysql.cj.jdbc.Driver", propertiesName);
		username = YamlUtils.getStr("spring.datasource.username", username, propertiesName);
		password = YamlUtils.getStr("spring.datasource.password", password, propertiesName);
		url = YamlUtils.getStr("spring.datasource.url", url, propertiesName);
		System.out.println("init");
	}

	// static String propertiesName = "application-prod.yml";
	public static void main(String[] args) {
		MyGenerator.url = "123456";
		String srcdir = getDir(Thread.currentThread().getClass());
		System.out.println(srcdir);
		System.out.println(getDir(MyGenerator.class));
		//		generator(srcdir, "com.ixinnuo.mobile", "", "invoice_valid");
		System.out.println(url);
	}


	public static void generator(String srcdir, String packageName, String tablePrefix, String... tableNames) {
		MyGenerator.srcdir = srcdir;
		final String dir = srcdir + File.separator + "src" + File.separator + "main";
		String srcdir1 = getDir(MyGenerator.class);
		File domainFile = FileUtil.file(srcdir1);
		final String entityPath =
				domainFile.getParentFile().getParent() + File.separator + domain_name + File.separator + "src" + File.separator + "main";
		System.out.println(entityPath);
		//		 String dir = "D:/javagen";
		String moduleName = "system";// js和html模块名称
		String htmlDir =
				dir + File.separator + "resources" + File.separator + "templates" + File.separator + moduleName + File.separator;
		String jsDir =
				dir + File.separator + "resources" + File.separator + "static" + File.separator + "common" + File.separator + moduleName + File.separator;

		MyGenerator mpg = new MyGenerator();

		// 全局配置
		GlobalConfig gc = new GlobalConfig();
		gc.setOpen(false);
		gc.setOutputDir(dir + File.separator + "java");
		gc.setFileOverride(false);// 覆盖原有文件,项目运行一段时间后最好不要覆盖
		gc.setEnableCache(false);
		gc.setBaseResultMap(true);// XML ResultMap
		gc.setBaseColumnList(true);// XML columList
		gc.setActiveRecord(true);
		gc.setDateType(DateType.ONLY_DATE);
		gc.setAuthor("Cary");
		mpg.setGlobalConfig(gc);

		// 数据源配置
		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.setCapitalMode(true);// 全局大写命名 ORACLE 注意
		strategy.setTablePrefix(tablePrefix);// 此处可以修改为您的表前缀
		strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
		strategy.setEntityLombokModel(true);
		strategy.setRestControllerStyle(true);
		strategy.setInclude(tableNames); // 需要生成的表
		// String excludeTables[] = getExcludeTables();
		// strategy.setExclude(excludeTables); // 排除生成的表
		// 自定义 mapper 父类
		// strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
		// 自定义 controller 父类
		strategy.setSuperControllerClass("com.ixinnuo.common.core.BaseController");
		// 【实体】是否为构建者模型(默认 false)
		mpg.setStrategy(strategy);

		// 包配置
		PackageConfig pc = new PackageConfig();
		pc.setParent(packageName);// 包名
		//		pc.setParent("com.ixinnuo.nm");// 包名
		// pc.setModuleName("");//模块名
		pc.setController("controller");
		pc.setXml(null);
		mpg.setPackageInfo(pc);

		// 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】
		InjectionConfig cfg = new InjectionConfig() {
			@Override
			public void initMap() {
				Map<String, Object> map = new HashMap<>();
				map.put("moduleName", moduleName);
				this.setMap(map);
			}
		};

		// 自定义 xxList.jsp 生成
		List<FileOutConfig> focList = new ArrayList<>();
		List<String> vms = new ArrayList<String>();

		//		vms.add("list");
		//		vms.add("add");
		//		vms.add("edit");
		for (final String tem : vms) {
			focList.add(new FileOutConfig("/templates/velocity/html/" + tem + ".html.vm") {
				@Override
				public String outputFile(TableInfo tableInfo) {
					// 自定义输入文件名称
					String fileDir = htmlDir + tableInfo.getEntityPath() + File.separator;
					FileUtil.mkdir(fileDir);
					return fileDir + tem + ".html";
				}
			});
			focList.add(new FileOutConfig("/templates/velocity/js/" + tem + ".js.vm") {
				@Override
				public String outputFile(TableInfo tableInfo) {
					String fileDir = jsDir + tableInfo.getEntityPath() + File.separator;
					FileUtil.mkdir(fileDir);
					return fileDir + tem + ".js";
				}
			});
		}

		// 调整 xml 生成目录演示
		focList.add(new FileOutConfig(ConstVal.TEMPLATE_XML + ".vm") {
			@Override
			public String outputFile(TableInfo tableInfo) {
				String path =
						entityPath + File.separator + "resources" + File.separator + "mapper" + File.separator + tableInfo.getEntityName() + "Mapper.xml";
				if (exists(path)) {
					path = System.getProperty("java.io.tmpdir") + File.separator + "NopMapper.xml";
				}
				return path;
			}
		});
		// 调整 entity生成目录演示
		focList.add(new FileOutConfig(ConstVal.TEMPLATE_ENTITY_JAVA + ".vm") {
			@Override
			public String outputFile(TableInfo tableInfo) {
				String path = entityPath + File.separator + "java" + File.separator + StrUtil.replace(packageName, "."
						, File.separator) + File.separator + "entity" + File.separator + tableInfo.getEntityName() +
						".java";
				if (exists(path)) {
					path = System.getProperty("java.io.tmpdir") + File.separator + "NopEntity.java";
				}
				return path;
			}
		});
		// 调整 Mapper生成目录演示
		focList.add(new FileOutConfig(ConstVal.TEMPLATE_MAPPER + ".vm") {
			@Override
			public String outputFile(TableInfo tableInfo) {
				String path = entityPath + File.separator + "java" + File.separator + StrUtil.replace(packageName, "."
						, File.separator) + File.separator + "mapper" + File.separator + tableInfo.getEntityName() + ConstVal.MAPPER + ".java";
				if (exists(path)) {
					path = System.getProperty("java.io.tmpdir") + File.separator + "NopMapper.java";
				}
				return path;
			}
		});
		cfg.setFileOutConfigList(focList);
		mpg.setCfg(cfg);

		// 关闭默认 xml 生成,调整生成 至 根目录
		TemplateConfig tc = new TemplateConfig();
		// 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改,
		// 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称
		tc.setEntity(null);
		tc.setMapper(null);
		tc.setXml(null);
		if (onlyEntity) {
			tc.setController(null);
			tc.setService(null);
			tc.setServiceImpl(null);
		}
		mpg.setTemplate(tc);
		// 执行生成
		mpg.execute();

		// 打印注入设置【可无】
		// System.err.println(mpg.getCfg().getMap().get("abc"));

		System.out.println(getDir());
	}

	@Override
	public void execute() {
		// 初始化配置
		if (null == config) {
			config = new ConfigBuilder(getPackageInfo(), getDataSource(), getStrategy(), getTemplate(),
					getGlobalConfig());
			if (null != injectionConfig) {
				injectionConfig.setConfig(config);
			}
		}
		AbstractTemplateEngine templateEngine = null;
		if (null == templateEngine) {
			// 为了兼容之前逻辑,采用 Velocity 引擎 【 默认 】
			templateEngine = new MyVelocityTemplateEngine();
		}
		// 模板引擎初始化执行文件输出
		templateEngine.init(this.pretreatmentConfigBuilder(config)).mkdirs().batchOutput().open();
	}

	@SuppressWarnings("unused")
	private static String[] getExcludeTables() {

		List<String> excludeTablesList = new ArrayList<>();
		excludeTablesList.add("t_test");
		excludeTablesList.add("t_*");

		String[] excludeTables = new String[excludeTablesList.size()];
		return excludeTablesList.toArray(excludeTables);
	}

	public static String getDir() {
		return getDir(Thread.currentThread().getClass());
	}

	/**
	 * 获取src目录
	 *
	 * @return
	 * @author cary
	 * @date 2017年8月25日星期五中国标准时间上午11:17:28
	 */
	public static String getDir(Class clazz) {
		String url = clazz.getResource("/").getFile();
		try {
			url = URLDecoder.decode(url, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		File file = new File(url);
		url = file.getParentFile().getParent();
		return url;
	}

	private static boolean exists(String filePath) {
		File file = new File(filePath);
		return file.exists();
	}

	class MyVelocityTemplateEngine extends VelocityTemplateEngine {
		@Override
		public Map<String, Object> getObjectMap(TableInfo tableInfo) {
			Map<String, Object> objectMap = super.getObjectMap(tableInfo);
			if (null != this.getConfigBuilder().getInjectionConfig()) {
				Map<String, Object> initMap = this.getConfigBuilder().getInjectionConfig().getMap();
				if (initMap != null) {
					objectMap.putAll(initMap);
				}
			}
			return objectMap;
		}
	}
}

### 使用 MyBatis-Plus 自动生成实体类 MyBatis-Plus 是一个强大的工具,用于简化基于 MyBatis 的开发工作。其内置的代码生成器可以根据数据库表结构自动生成相应的 Java 实体类Mapper 接口及其对应的 XML 文件等。 #### 配置依赖项 为了使用 MyBatis-Plus 的代码生成功能,项目中需引入必要的 Maven 或 Gradle 依赖: 对于 Maven 用户来说,在 `pom.xml` 中添加如下依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>最新版本号</version> </dependency> <!-- Velocity模板引擎 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.3</version> </dependency> ``` #### 初始化全局配置对象 通过构建 GlobalConfig 对象设置一些通用选项,比如是否覆盖已有文件以及指定作者名称等信息[^1]。 ```java GlobalConfig globalConfig = new GlobalConfig.Builder() .outputDir(System.getProperty("user.dir") + "/src/main/java") // 设置输出路径 .author("Your Name Here") // 设置作者名字 .fileOverride() // 是否覆盖已存在的文件,默认false .build(); ``` #### 数据库连接配置 定义 DataSourceConfig 来提供访问数据库所需的信息,如 URL、用户名和密码等参数。 ```java DataSourceConfig dsc = new DataSourceConfig.Builder( "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8", "root", "password").build(); ``` #### 包名策略设定 PackageConfig 可帮助开发者更好地管理生成后的代码放置位置,通常会按照模块划分不同的包结构。 ```java new PackageConfig.Builder().parent("com.example.demo").moduleName(null).pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") + "/src/main/resources/mapper")).build(); ``` #### 表配置与策略定制 TableConfig 和 StrategyConfigBuilder 能够让用户更灵活地控制哪些表格参与生成过程,并可以调整命名转换规则、逻辑删除字段处理方式等内容。 ```java // 定义要生成的表 List<String> includeTables = Arrays.asList("tb_user"); StrategyConfig strategyConfig = new StrategyConfig.Builder() .addInclude(includeTables.toArray(new String[]{})) // 设置需要逆向生成的表 .entityLombokModel(true) // 开启 Lombok 模型 @Accessors(chain = true) .logicDeleteFieldName("deleted") // 逻辑删除字段名 .controllerMappingHyphenStyle(true) // RestController 风格控制器 .RestControllerStyle(true) // 控制层采用 RESTful API 设计风格 .build(); AutoGenerator mpg = new AutoGenerator(dsc); mpg.setGlobalConfig(globalConfig); mpg.setPackageInfo(pc); // pc为前面创建好的package config实例化对象 mpg.setTemplateEngine(new FreemarkerTemplateEngine()); // 如果不传入此参数,则默认使用 velocity 引擎 mpg.setStrategy(strategyConfig); // 执行生成操作 mpg.execute(); ``` 上述代码展示了如何利用 MyBatis-Plus 提供的功能来自动生成所需的实体类和其他组件。只需修改相应部分即可适应具体需求场景下的应用开发流程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值