mybatis-generator扩展教程系列 -- 自定义配置参数修改DAO,Mapper文件后缀

简介:          今天主要讲解如何解决我们使用mybatis生成器遇到的最常见问题,如何修改生成的dao,mapper文件后缀,下面我们继续使用上一篇的用例继续改造,如果本篇示例看得不太理解的可以翻看下之前的演示,下面就开始直奔主题了1.

         今天主要讲解如何解决我们使用mybatis生成器遇到的最常见问题,如何修改生成的dao,mapper文件后缀,下面我们继续使用上一篇的用例继续改造,如果本篇示例看得不太理解的可以翻看下之前的演示,下面就开始直奔主题了


1. 先增加一个参数配置看我们的文件生成后缀是什么,我们就新增个mapperExt参数写在JavaParamConfiguration.java配置对象类

package org.mybatis.generator.config;

import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
import static org.mybatis.generator.internal.util.messages.Messages.getString;

import java.util.List;

import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.XmlElement;

/**
 * @author shadow
 */
public class JavaParamConfiguration extends TypedPropertyHolder {

	private String baseDAO; // baseDAO类路径
	private String baseService; // baseService类路径
	private String buildType; // 1.dao层 2.service层 3.control层
	private String mapperExt; // dao文件后缀配置

	public JavaParamConfiguration() {
		super();
	}

	public String getBaseDAO() {
		return baseDAO;
	}

	public void setBaseDAO(String baseDAO) {
		this.baseDAO = baseDAO;
	}

	public String getBaseService() {
		return baseService;
	}

	public void setBaseService(String baseService) {
		this.baseService = baseService;
	}

	public String getBuildType() {
		return buildType;
	}

	public void setBuildType(String buildType) {
		this.buildType = buildType;
	}

	public String getMapperExt() {
		return mapperExt;
	}

	public void setMapperExt(String mapperExt) {
		this.mapperExt = mapperExt;
	}

	public XmlElement toXmlElement() {
		XmlElement answer = new XmlElement("javaParam"); //$NON-NLS-1$

		if (baseDAO != null) {
			answer.addAttribute(new Attribute("baseDAO", baseDAO)); //$NON-NLS-1$
		}

		if (baseService != null) {
			answer.addAttribute(new Attribute("baseService", baseService)); //$NON-NLS-1$
		}

		if (buildType != null) {
			answer.addAttribute(new Attribute("buildType", buildType)); //$NON-NLS-1$
		}
		
		if (mapperExt != null) {
			answer.addAttribute(new Attribute("mapperExt", mapperExt)); //$NON-NLS-1$
		}

		addPropertyXmlElements(answer);

		return answer;
	}

	public void validate(List<String> errors, String contextId) {

		if (!stringHasValue(baseDAO)) {
			errors.add(getString("ValidationError.12", //$NON-NLS-1$
					"JavaParamConfiguration", contextId)); //$NON-NLS-1$
		}

		if (!stringHasValue(baseService)) {
			errors.add(getString("ValidationError.13", //$NON-NLS-1$
					"JavaParamConfiguration", contextId)); //$NON-NLS-1$
		}

		if (!stringHasValue(buildType)) {
			errors.add(getString("ValidationError.14", //$NON-NLS-1$
					"JavaParamConfiguration", contextId)); //$NON-NLS-1$
		}

	}
}


2.修改mybatis-generator-config_1_0.dtd文件,javaParam节点配置里面加入一个参数

<!-- 自定义XML节点 -->
<!ELEMENT javaParam (property*)>
<!ATTLIST javaParam
  baseDAO CDATA #REQUIRED
  baseService CDATA #REQUIRED
  buildType CDATA #REQUIRED
  mapperExt CDATA #REQUIRED>


3.修改generatorConfig.xml文件,在javaParam节点加入我们的参数值

<!--自定义XML参数配置 -->
		<javaParam baseDAO="com.test.BaseDAO" 
		baseService="com.test.BaseService" 
		buildType="1,2" mapperExt="DAO">

		</javaParam>


修改填充数据对象代码MyBatisGeneratorConfigurationParser.java

private void parseJavaParam(Context context, Node node) {
        JavaParamConfiguration javaParamConfiguration = new JavaParamConfiguration();

        context.setJavaParamConfiguration(javaParamConfiguration);

        Properties attributes = parseAttributes(node);
        String baseDAO = attributes.getProperty("baseDAO"); //$NON-NLS-1$
        String baseService = attributes.getProperty("baseService"); //$NON-NLS-1$
        String buildType = attributes.getProperty("buildType"); //$NON-NLS-1$
        String mapperExt = attributes.getProperty("mapperExt"); // 增加自定义参数填充

        javaParamConfiguration.setBaseDAO(baseDAO);
        javaParamConfiguration.setBaseService(baseService);
        javaParamConfiguration.setBuildType(buildType);
        javaParamConfiguration.setMapperExt(mapperExt);

        NodeList nodeList = node.getChildNodes();
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node childNode = nodeList.item(i);

            if (childNode.getNodeType() != Node.ELEMENT_NODE) {
                continue;
            }

            if ("property".equals(childNode.getNodeName())) { //$NON-NLS-1$
                parseProperty(javaParamConfiguration, childNode);
            }
        }
    }



4.我们来看看生成文件的主要实现类IntrospectedTableMyBatis3Impl.java下面这段方法,我们可以看到第729行introspectedTable.initialize();初始化配置文件

/**
     * Generate files.
     *
     * @param callback
     *            the callback
     * @param generatedJavaFiles
     *            the generated java files
     * @param generatedXmlFiles
     *            the generated xml files
     * @param warnings
     *            the warnings
     * @throws InterruptedException
     *             the interrupted exception
     */
    public void generateFiles(ProgressCallback callback,
            List<GeneratedJavaFile> generatedJavaFiles,
            List<GeneratedXmlFile> generatedXmlFiles, List<String> warnings)
            throws InterruptedException {

        pluginAggregator = new PluginAggregator();
        for (PluginConfiguration pluginConfiguration : pluginConfigurations) {
            Plugin plugin = ObjectFactory.createPlugin(this,
                    pluginConfiguration);
            if (plugin.validate(warnings)) {
                pluginAggregator.addPlugin(plugin);
            } else {
                warnings.add(getString("Warning.24", //$NON-NLS-1$
                        pluginConfiguration.getConfigurationType(), id));
            }
        }

        if (introspectedTables != null) {
            for (IntrospectedTable introspectedTable : introspectedTables) {
                callback.checkCancel();

                introspectedTable.initialize();
                introspectedTable.calculateGenerators(warnings, callback);
                generatedJavaFiles.addAll(introspectedTable
                        .getGeneratedJavaFiles());
                generatedXmlFiles.addAll(introspectedTable
                        .getGeneratedXmlFiles());

                generatedJavaFiles.addAll(pluginAggregator
                        .contextGenerateAdditionalJavaFiles(introspectedTable));
                generatedXmlFiles.addAll(pluginAggregator
                        .contextGenerateAdditionalXmlFiles(introspectedTable));
            }
        }

        generatedJavaFiles.addAll(pluginAggregator
                .contextGenerateAdditionalJavaFiles());
        generatedXmlFiles.addAll(pluginAggregator
                .contextGenerateAdditionalXmlFiles());
    }


5.我们继续深入进去看IntrospectedTable.java的initialize()方法实现

public void initialize() {
        calculateJavaClientAttributes();
        calculateModelAttributes();
        calculateXmlAttributes();

        if (tableConfiguration.getModelType() == ModelType.HIERARCHICAL) {
            rules = new HierarchicalModelRules(this);
        } else if (tableConfiguration.getModelType() == ModelType.FLAT) {
            rules = new FlatModelRules(this);
        } else {
            rules = new ConditionalModelRules(this);
        }

        context.getPlugins().initialized(this);
    }

6.可以看到calculateJavaClientAttributes,calculateModelAttributes,calculateXmlAttributes三行代码应该就是初始化实现代码

我们把calculateJavaClientAttributes方法1345行代码,修改成如下

protected void calculateJavaClientAttributes() {
        if (context.getJavaClientGeneratorConfiguration() == null) {
            return;
        }

        StringBuilder sb = new StringBuilder();
        sb.append(calculateJavaClientImplementationPackage());
        sb.append('.');
        sb.append(fullyQualifiedTable.getDomainObjectName());
        sb.append("DAOImpl"); //$NON-NLS-1$
        setDAOImplementationType(sb.toString());

        sb.setLength(0);
        sb.append(calculateJavaClientInterfacePackage());
        sb.append('.');
        sb.append(fullyQualifiedTable.getDomainObjectName());
        sb.append("DAO"); //$NON-NLS-1$
        setDAOInterfaceType(sb.toString());

        sb.setLength(0);
        sb.append(calculateJavaClientInterfacePackage());
        sb.append('.');
        if (stringHasValue(tableConfiguration.getMapperName())) {
            sb.append(tableConfiguration.getMapperName());
        } else {
            sb.append(fullyQualifiedTable.getDomainObjectName());
            // sb.append("Mapper"); //$NON-NLS-1$
            sb.append(context.getJavaParamConfiguration().getMapperExt()); // 修改自定义后缀名称
        }
        setMyBatis3JavaMapperType(sb.toString());

        sb.setLength(0);
        sb.append(calculateJavaClientInterfacePackage());
        sb.append('.');
        if (stringHasValue(tableConfiguration.getSqlProviderName())) {
            sb.append(tableConfiguration.getSqlProviderName());
        } else {
            sb.append(fullyQualifiedTable.getDomainObjectName());
            sb.append("SqlProvider"); //$NON-NLS-1$
        }
        setMyBatis3SqlProviderType(sb.toString());
    }


7.最后看看我们的运行生成结果




最后小结,示例是沿用之前的讲解用例,所以如果有的地方没看明白可以翻看下我之前的讲解教程,谢谢大家的支持

目录
相关文章
|
11月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
7月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
647 13
|
11月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
8月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1404 1
Spring boot 使用mybatis generator 自动生成代码插件
|
11月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
871 0
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
642 2
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
703 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
729 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
3362 2
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
1111 1
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码