maven创建generator逆向自定义注解

项目目录结构

在这里插入图片描述

pom.xml插入

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.localhost</groupId>
  <artifactId>generator</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <name>sql-mapper</name>
  <url>http://maven.apache.org</url>

  <dependencies>
      <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.6</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.29</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
</project>

log4j.properties

log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

编写generatorConfig.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>
    <!--导入属性配置 -->
    <!--<properties resource="generator.properties"></properties> -->

    <!--指定特定数据库的jdbc驱动jar包的位置 -->
    <classPathEntry
        location="C://Users//31649//.m2//repository//mysql//mysql-connector-java//5.1.29//mysql-connector-java-5.1.29.jar" />

    <context id="default" targetRuntime="MyBatis3">

        <!-- 配置生成pojo的序列化的插件,mybatis支持很多插件,这些插件都在 org.mybatis.generator.plugins包下 -->
        <plugin
            type="org.mybatis.generator.plugins.SerializablePlugin" />

        <!-- 配置生成pojo的toString()方法的插件,mybatis支持很多插件,这些插件都在 org.mybatis.generator.plugins包下 -->
        <plugin
            type="org.mybatis.generator.plugins.ToStringPlugin" />

        <!-- optional,旨在创建class时,对注释进行控制 -->
        <commentGenerator
            type="cn.localhost.MyCommentGenerator">
            <!-- <property name="suppressDate" value="true" /> <property 
                name="suppressAllComments" value="true" /> -->
        </commentGenerator>

        <!--jdbc的数据库连接 -->
        <jdbcConnection
            driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://127.0.0.1:3306/jxpt_uat"
            userId="root" password="123456">
            <property name="nullCatalogMeansCurrent"
                value="true" />
        </jdbcConnection>


        <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制 -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

       <!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类 targetPackage 
            指定生成的model生成所在的包名 targetProject 指定在该项目下所在的路径 -->
        <javaModelGenerator
            targetPackage="cn.localhost.pojo"
            targetProject="src/main/java">

            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="true" />
            <!-- 是否对model添加 构造函数 -->
            <!--<property name="constructorBased" value="false" /> -->
            <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
            <property name="trimStrings" value="true" />
            <!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
            <!--<property name="immutable" value="false" /> -->
        </javaModelGenerator>

        <!--Mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 -->
        <sqlMapGenerator
            targetPackage="mapper"
            targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码 type="ANNOTATEDMAPPER",生成Java 
            Model 和基于注解的Mapper对象 type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 type="XMLMAPPER",生成SQLMap 
            XML文件和独立的Mapper接口 -->
        <javaClientGenerator
            targetPackage="cn.localhost.dao"
            targetProject="src/main/java" type="XMLMAPPER">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <table tableName="t_XXX"
               domainObjectName="TXXX" enableCountByExample="false"
               enableUpdateByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" selectByExampleQueryId="false">
        </table>
    </context>
</generatorConfiguration>

编写自定义注解类MyCommentGenerator

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.InnerClass;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;

/**
 * @author Yah LI E-mail:XXX@qq.com
 * @version 创建时间:2019年3月29日 下午9:26:57 类说明
 */
public class MyCommentGenerator extends DefaultCommentGenerator {
	private Properties properties;
	private Properties systemPro;
	private boolean suppressDate;
	private boolean suppressAllComments;
	private String currentDateStr;

	public MyCommentGenerator() {
		super();
		properties = new Properties();
		systemPro = System.getProperties();
		suppressDate = false;
		suppressAllComments = false;
		currentDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
	}

	/**
	 *  实体参数自定义注解
	 * 
	 * */
	@Override
	public void addFieldComment(Field field, IntrospectedTable introspectedTable,
			IntrospectedColumn introspectedColumn) {
		if (suppressAllComments) {
			return;
		}
		StringBuilder sb = new StringBuilder();
		field.addJavaDocLine("/**");
		sb.append(" * <pre><b>column</b> : ");
		sb.append(introspectedColumn.getActualColumnName());
		sb.append("\n");
		sb.append("     * <br><b>comment</b> : " + introspectedColumn.getRemarks());
		sb.append("\n");
		sb.append("     * <br><b>type</b> : " + introspectedColumn.getJdbcTypeName() + "( "
				+ introspectedColumn.getLength() + " )");
		sb.append("\n");
		sb.append("         * 允许空: ( " + introspectedColumn.isNullable() + " ) 缺省值: ( "
				+ introspectedColumn.getDefaultValue() + " )");
		sb.append("\n");
		sb.append("     *");
		sb.append("\n");
		sb.append("     * @version " + currentDateStr);
		field.addJavaDocLine(sb.toString());
		field.addJavaDocLine(" */");
	}

	@Override
	public void addFieldComment(Field field, IntrospectedTable introspectedTable) {

	}

	/**
	 * 
	 * mapper接口自定义注解
	 * */
	@Override
	public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
		if (suppressAllComments) {
			return;
		}
		StringBuilder sb = new StringBuilder();
		sb.append("/**");
		sb.append("\n");
		sb.append("	* ");
		sb.append("\n");
		sb.append("	* @author {自己名称}" + "\n");
		if (!suppressDate) {
			sb.append("	* @date " + currentDateStr + "\n");
		}

		List<Parameter> parameters = method.getParameters();

		for (Parameter parameter : parameters) {
			sb.append("	* @param " + parameter.getName() + "\n");
		}
		sb.append("	* @return " + method.getReturnType());
		sb.append("\n" + "	*/");
		method.addJavaDocLine(sb.toString());
	}

	// Get 方法注釋
	@Override
	public void addGetterComment(Method method, IntrospectedTable introspectedTable,
			IntrospectedColumn introspectedColumn) {
		if (suppressAllComments) {
			if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
				method.addJavaDocLine("//获取:" + introspectedColumn.getRemarks());
			}
		} else {
			super.addGetterComment(method, introspectedTable, introspectedColumn);
		}
	}

	// Set 方法注釋
	@Override
	public void addSetterComment(Method method, IntrospectedTable introspectedTable,
			IntrospectedColumn introspectedColumn) {
		if (suppressAllComments) {
			if (StringUtility.stringHasValue(introspectedColumn.getRemarks())) {
				method.addJavaDocLine("//设置:" + introspectedColumn.getRemarks());
			}
		} else {
			super.addSetterComment(method, introspectedTable, introspectedColumn);
		}
	}

    @Override
	public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {
		if (suppressAllComments) {
			return;
		}

		StringBuilder sb = new StringBuilder();

		innerClass.addJavaDocLine("/**");
		sb.append(" * ");
		sb.append(introspectedTable.getFullyQualifiedTable());
		innerClass.addJavaDocLine(sb.toString());

		sb.setLength(0);
		sb.append(" * @author ");
		sb.append(systemPro.getProperty("user.name"));
		sb.append(" ");
		sb.append(currentDateStr);

		addJavadocTag(innerClass, markAsDoNotDelete);

		innerClass.addJavaDocLine(" */");
	}
    
    @Override
	public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
		if (suppressAllComments) {
			return;
		}
		StringBuilder sb = new StringBuilder();
		innerClass.addJavaDocLine("/**");
		sb.append(" * ");
		sb.append(introspectedTable.getFullyQualifiedTable());
		sb.append(" ");
		sb.append(getDateString());
		innerClass.addJavaDocLine(sb.toString());
		innerClass.addJavaDocLine(" */");
	}

	/**
	 * 生成实体类头自定义注释
	 * */
	@Override
	public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
		if (suppressAllComments) {
			return;
		}
		StringBuilder sb = new StringBuilder();
		sb.append("/**");
		sb.append("\n");
		sb.append(" * <p> TableName : " + introspectedTable.getFullyQualifiedTableNameAtRuntime() + " </p >");
		sb.append("\n");
		sb.append(" * @author {公司名称/自己名称}" + "\n");
		sb.append(" * CopyRight Copyright 1999-2019 {公司官网} Inc. All rights reserved. \n");
		if (!suppressDate) {
			sb.append(" * @date " + currentDateStr + "\n");
		}
		sb.append(" */");
		topLevelClass.addJavaDocLine(sb.toString());
	}
}

编写启动类MyBatisGeneratorApp

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

/**
 * @author Yah LI E-mail:XXX@qq.com
 * @version 创建时间:2019年3月29日 下午9:27:16 类说明
 */
public class MyBatisGeneratorApp {
	public void generator() throws Exception {

		List<String> warnings = new ArrayList<String>();
		boolean overwrite = true;
		// 指定 逆向工程配置文件
		// 如果在启动的时候报IO异常,找不到该文件,但是按住ctrl键有可以读取该文件,那么就写入绝对路径
		// 如果报出IOException 那么换成全路径 File configFile = new File("D:\\local_test\\manage\\src\\main\\resources\\generatorConfig.xml");
		File configFile = new File("generatorConfig.xml");
		ConfigurationParser cp = new ConfigurationParser(warnings);
		Configuration config = cp.parseConfiguration(configFile);
		DefaultShellCallback callback = new DefaultShellCallback(overwrite);
		MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
		myBatisGenerator.generate(null);

	}

	public static void main(String[] args) throws Exception {
		try {
			MyBatisGeneratorApp generatorSqlmap = new MyBatisGeneratorApp();
			generatorSqlmap.generator();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

完整代码可在github下载

链接: https://github.com/316493171/generator.git

逆向生成出的模板样式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值