天天看点

mybatis-generator 自定义生成代码工具(maven方式)

1.在maven配置文件pom.xml中添加插件

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>csv_import</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>csv_import</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    

        <!-- https://mvnrepository.com/artifact/javax.persistence/persistence-api -->
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0.2</version>
        </dependency>


        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>


        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>

    </dependencies>

    <build>
       <!-- <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
-->

       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>

            <plugin>
                <!--&lt;!&ndash;Mybatis-generator插件,用于自动生成Mapper和POJO&ndash;&gt;-->
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                   <!-- &lt;!&ndash;配置文件的位置&ndash;&gt;-->
                    <configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.2</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

</project>
           

2.自定义comment生成器

package com.example.csv.Utils;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.MergeConstants;
import org.mybatis.generator.config.PropertyRegistry;
import org.mybatis.generator.internal.DefaultCommentGenerator;

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

import static org.mybatis.generator.internal.util.StringUtility.isTrue;

/**
 * mybatis generator 自定义comment生成器.
 * 
 * @author sjq
 *
 */
public class MyCommentGenerator extends DefaultCommentGenerator {// implements
																	// CommentGenerator
																	// {
	/**
     * properties配置文件
     */
	private Properties 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")).format(new Date());
	}
	 /**
     * 给Java文件加注释,这个注释是在文件的顶部,也就是package上面。
     */
	@Override
	public void addJavaFileComment(CompilationUnit compilationUnit) {
		// add no file level comments by default
		return;
	}
 
    /**
     * Mybatis的Mapper.xml文件里面的注释
     */
	@Override
	public void addComment(XmlElement xmlElement) {
		return;
	}
    /**
     * 为调用此方法作为根元素的第一个子节点添加注释。
     */
	@Override
	public void addRootComment(XmlElement rootElement) {
		// add no document level comments by default
		return;
	}
 
	@Override
	public void addConfigurationProperties(Properties properties) {
		this.properties.putAll(properties);
 
		suppressDate = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));
 
		suppressAllComments = isTrue(properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));
	}
 
	/**
    *
    *@Title addJavadocTag
    *@Description: 此方法为其添加了自定义javadoc标签。
    *@Author fendo
    *@Date 2019年1月8日 下午3:49:05
    *@param javaElement
    *@param markAsDoNotDelete
    *@throws
    */
	@Override
	protected void addJavadocTag(JavaElement javaElement, boolean markAsDoNotDelete) {
		javaElement.addJavaDocLine(" *");
		StringBuilder sb = new StringBuilder();
		sb.append(" * ");
		sb.append(MergeConstants.NEW_ELEMENT_TAG);
		if (markAsDoNotDelete) {
			sb.append(" do_not_delete_during_merge");
		}
		String s = getDateString();
		if (s != null) {
			sb.append(' ');
			sb.append(s);
		}
		javaElement.addJavaDocLine(sb.toString());
	}
 
	/**
	 * This method returns a formated date string to include in the Javadoc tag
	 * and XML comments. You may return null if you do not want the date in
	 * these documentation elements.
	 * 
	 * @return a string representing the current timestamp, or null
	 */
	@Override
	protected String getDateString() {
		String result = null;
		if (!suppressDate) {
			result = currentDateStr;
		}
		return result;
	}
 
    /**
     * Java类的类注释
     */
	@Override
	public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
		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);

		innerClass.addJavaDocLine(" */");
		innerClass.addAnnotation("@Entity(name = \"" + introspectedTable.getFullyQualifiedTable() + "\")");
	}
    /**
     * 为枚举添加注释
     */
	@Override
	public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
		if (suppressAllComments) {
			return;
		}
 
		StringBuilder sb = new StringBuilder();
 
		innerEnum.addJavaDocLine("/**");
		// addJavadocTag(innerEnum, false);
		sb.append(" * ");
		sb.append(introspectedTable.getFullyQualifiedTable());
		innerEnum.addJavaDocLine(sb.toString());
		innerEnum.addJavaDocLine(" */");
	}
    /**
     * 为字段添加注释
     */
	@Override
	public void addFieldComment(Field field, IntrospectedTable introspectedTable,
								IntrospectedColumn introspectedColumn) {
		if (suppressAllComments) {
			return;
		}
 
		StringBuilder sb = new StringBuilder();
 
		field.addJavaDocLine("/**");
		sb.append(" * ");
		sb.append(introspectedColumn.getRemarks());
		field.addJavaDocLine(sb.toString());
 
		// addJavadocTag(field, false);
 
		field.addJavaDocLine(" */");
 
		// field.addAnnotation("@Size(min = 0, max = " +
		// introspectedColumn.getLength() + " , message =
		// \"长度必须在{min}和{max}之间\")");
		// field.addAnnotation("@NotNull"); if
		// (introspectedColumn.isStringColumn()) {
		// topLevelClass.addImportedType("javax.validation.constraints.Size");
		// field.addAnnotation("@Size(min = 0, max = " +
		// introspectedColumn.getLength() + " , message =
		// \"长度必须在{min}和{max}之间\")"); }
		List<IntrospectedColumn> primaryKeyColumns = introspectedTable.getPrimaryKeyColumns();
		for (IntrospectedColumn col : primaryKeyColumns) {
			if (col.getActualColumnName().equals(introspectedColumn.getActualColumnName())) {
				field.addAnnotation("@Id");
			}
		}
		field.addAnnotation("@Column(name = \"" + introspectedColumn.getActualColumnName() + "\")");
	}
    /**
     * Java属性注释
     */
	@Override
	public void addFieldComment(Field field, IntrospectedTable introspectedTable) {
		if (suppressAllComments) {
			return;
		}
 
		StringBuilder sb = new StringBuilder();
 
		field.addJavaDocLine("/**");
		sb.append(" * ");
		sb.append(introspectedTable.getFullyQualifiedTable());
		field.addJavaDocLine(sb.toString());
		field.addJavaDocLine(" */");
	}
    /**
     * 普通方法的注释,这里主要是XXXMapper.java里面的接口方法的注释
     */
	@Override
	public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
		if (suppressAllComments) {
			return;
		}
		 method.addJavaDocLine("/**");
		 addJavadocTag(method, false);
		 method.addJavaDocLine(" */");
	}
	 /**
     * 给getter方法加注释
     */
	@Override
	public void addGetterComment(Method method, IntrospectedTable introspectedTable,
								 IntrospectedColumn introspectedColumn) {
		if (suppressAllComments) {
			return;
		}
 
		method.addJavaDocLine("/**");
 
		StringBuilder sb = new StringBuilder();
		sb.append(" * ");
		sb.append(introspectedColumn.getRemarks());
		method.addJavaDocLine(sb.toString());
 
		sb.setLength(0);
		sb.append(" * @return ");
		sb.append(introspectedColumn.getActualColumnName());
		sb.append(" ");
		sb.append(introspectedColumn.getRemarks());
		method.addJavaDocLine(sb.toString());
 
		// addJavadocTag(method, false);
 
		method.addJavaDocLine(" */");
	}
    /**
     * 给setter方法加注释
     */
	@Override
	public void addSetterComment(Method method, IntrospectedTable introspectedTable,
								 IntrospectedColumn introspectedColumn) {
		if (suppressAllComments) {
			return;
		}
 
		method.addJavaDocLine("/**");
		StringBuilder sb = new StringBuilder();
		sb.append(" * ");
		sb.append(introspectedColumn.getRemarks());
		method.addJavaDocLine(sb.toString());
 
		Parameter parm = method.getParameters().get(0);
		sb.setLength(0);
		sb.append(" * @param ");
		sb.append(parm.getName());
		sb.append(" ");
		sb.append(introspectedColumn.getRemarks());
		method.addJavaDocLine(sb.toString());
 
		// addJavadocTag(method, false);
 
		method.addJavaDocLine(" */");
	}
    /**
     * 为类添加注释
     */
	@Override
	@Deprecated
	public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean markAsDoNotDelete) {


	}
    /**
     * 为模型类添加注释
     */
	public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
		topLevelClass.addImportedType("javax.persistence.Column");
		topLevelClass.addImportedType("javax.persistence.Id");
		topLevelClass.addImportedType("javax.persistence.Entity");
		//topLevelClass.addImportedType("org.apache.ibatis.type.Alias");
 
		if (suppressAllComments) {
			return;
		}
 
		StringBuilder sb = new StringBuilder();
 
		topLevelClass.addJavaDocLine("/**");
		sb.append(" * ");
		sb.append(introspectedTable.getFullyQualifiedTable());
		topLevelClass.addJavaDocLine(sb.toString());
 
		sb.setLength(0);
		sb.append(" * @author ");
		sb.append(systemPro.getProperty("user.name"));
		sb.append(" ");
		sb.append(currentDateStr);
 
		// addJavadocTag(innerClass, markAsDoNotDelete);
 
		topLevelClass.addJavaDocLine(" */");
		topLevelClass.addAnnotation("@Entity(name = \"" + introspectedTable.getFullyQualifiedTable() + "\")");
/*		topLevelClass.addAnnotation("@Alias(\""
				+ toLowerCaseFirstOne(introspectedTable.getTableConfiguration().getDomainObjectName()) + "\")");*/
	}
 
	// 首字母转小写
	public static String toLowerCaseFirstOne(String s) {
		if (Character.isLowerCase(s.charAt(0))) {
			return s;
		} else {
			return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
		}
	}
 
}
           

3.新建mybatis-generator-config.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>

    <!-- 本地数据库驱动程序jar包的全路径 -->
    <classPathEntry location="D:\software\mvn-repo\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar"/>

    <context id="context" targetRuntime="MyBatis3">
        
        <commentGenerator  type="com.example.csv.Utils.MyCommentGenerator">

        </commentGenerator>




        <!-- 数据库的相关配置 -->
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://123.59.198.87:3307/fin_meta" userId="root"
                        password="tdcredit2019">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 实体类生成的位置 -->
        <javaModelGenerator targetPackage="com.example.csv.entity.test" targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

      <!-- *Mapper.xml 文件的位置 -->
      <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

       <!--Mapper 接口文件的位置 -->
        <javaClientGenerator targetPackage="com.example.csv.dao" targetProject="src/main/java" type="XMLMAPPER">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!-- 相关表的配置 -->
        <table tableName="index_data" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
               enableUpdateByExample="false"/>


    </context>
</generatorConfiguration>
           

4.使用方式

(1)插件使用

mybatis-generator 自定义生成代码工具(maven方式)

(2)使用 java调用

package com.example.csv.Utils;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.springframework.core.io.ClassPathResource;

import java.io.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class Test {

	public static void uploadCaseList(String path) {
		 String [] fileNames=null;
		 File file = new File(path);
			File [] fileNames1 = file.listFiles();
			fileNames=new String [fileNames1.length];
			for(int i=0;i<fileNames1.length;i++){
				fileNames[i]=fileNames1[i].getAbsolutePath();
				System.out.println(fileNames[i]);
			}
		File file1 = null;
		BufferedReader br;
		for (int i = 0; i < fileNames.length; i++) {
			file1 = new File(fileNames[i]);
			try {
				br = new BufferedReader(new InputStreamReader(new FileInputStream(file1), "UTF-8"));
				String line = "";
				int temp = 0;
				for (int j = 0; (line = br.readLine()) != null; j++) {
					String[] info =line.split("\\[@#@\\]",-1);
					System.out.println(info[0]);
					System.out.println(info[1]);
					System.out.println(info[2]);
					System.out.println();
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			
		}
	}


	public static void main(String[] args)
	{
		// 执行中的异常信息会保存在warnings中
		List<String> warnings = new ArrayList<String>();
		try {
			// true:生成的文件覆盖之前的
			boolean overwrite = true;
			// 读取配置,构造 Configuration 对象.
			// 如果不想使用配置文件的话,也可以直接来 new Configuration(),然后给相应属性赋值.
			ClassPathResource classPathResource = new ClassPathResource("mybatis-generator-config.xml");
			File configFile = classPathResource.getFile();
			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);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (InvalidConfigurationException e) {
			e.printStackTrace();
		} catch (XMLParserException e) {
			e.printStackTrace();
		}

		for (String warning : warnings){
			System.out.println(warning);
		}

	}

}