mybatis 根据 数据库表 自动生成 实体 并自动生成中文注释

原文地址:https://www.cnblogs.com/NieXiaoHui/p/6094144.html (将原文copy到此处,怕原作者删除,顺便记录实际操作中我遇到的问题)

原文:

项目里新建表时model,mapper以及mapper.xml基本都是用Mybatis Generator(以下简称为MBG)自动生成的,但是MBG自动生成的model的注释实在有点非人类,至少中国人是完全接受不了的,在配置中禁用掉注释吧,倒是简单了,可是生成的model类光秃秃的,啥都没有,字段方法没有注释,使用很不方便,别人看也不知道这个字段是啥含义,到最后还是要自己添加,一张表多点几十个字段,特么添加累死了,不能这么干,得想法子,百度了一下网上,基本有两种方法,第一种,就是直接修改MGB的源代码,第二种就是自己写一个类实现CommentGenerator接口,先说自己写一个新类实现CommentGenerator接口的方法来使自动生成的model类含有中文注释吧.

  • 1.首先新建一个maven项目,请选择一个简单的maven项目:或者在选择的时候直接选择create a simple project.

mybatis 根据 数据库表 自动生成 实体 并自动生成中文注释_第1张图片

  • 2,右键项目->build path->config build path...->Libraries,修改jdk为你工作空间的默认jdk,然后右键项目->new->source folder,输入src/main/resources,建好resources目录,如果已经建好就直接跳过.这里最好不要忘记,否则有的时候建立默认jdk是1.5的,运行可能会有莫名其妙的问题.
  • 3 因为是要写一个类实现CommentGenerator接口,所以先在项目中引入mybatis-generator-core的jar包 在pom.xml中添加依赖, 这里统一使用1.3.2版本.为了不用每次使用都要使用者自己指定ojdbc6.jar位置,直接将其引入到项目中,这里要使用该引入,需要先将jar包安装到本地maven仓库中,否则这里这样引入会报错的,怎么安装可以参考这篇文章:

    maven手动安装jar包到本地仓库,以ojdbc6为例,

   同时为了支持mysql,也一起加入mysql的驱动包,mysql的驱动包不用手动安装,直接引入就会自动下载的

复制代码
<dependency>
     <groupId>org.mybatis.generatorgroupId>
     <artifactId>mybatis-generator-coreartifactId>
     <version>1.3.2version>
dependency>

     com.oracle
     ojdbc6
     6.0


     mysql
     mysql-connector-java
     5.1.9

            
复制代码
  • 4 在源代码中新建一个类MyCommentGenerator,实现CommentGenerator接口,类的代码如下:
复制代码
package org.mybatis.generator;

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

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

import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.InnerClass;
import org.mybatis.generator.api.dom.java.InnerEnum;
import org.mybatis.generator.api.dom.java.JavaElement;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.config.MergeConstants;
import org.mybatis.generator.config.PropertyRegistry;

/**
 * 描述:
 * @since 1.9.10
 * @version 1.9.10
 * @作者:niexiaohui
 * @创建时间:2016年11月22日
 * @修改记录:
 */
public class MyCommentGenerator implements CommentGenerator{
    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")).format(new Date());
    }

    public void addJavaFileComment(CompilationUnit compilationUnit) {
        // add no file level comments by default
        return;
    }

    /**
     * Adds a suitable comment to warn users that the element was generated, and
     * when it was generated.
     */
    public void addComment(XmlElement xmlElement) {
        return;
    }

    public void addRootComment(XmlElement rootElement) {
        // add no document level comments by default
        return;
    }

    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));
    }

    /**
     * This method adds the custom javadoc tag for. You may do nothing if you do
     * not wish to include the Javadoc tag - however, if you do not include the
     * Javadoc tag then the Java merge capability of the eclipse plugin will
     * break.
     * 
     * @param javaElement
     *            the java element
     */
    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
     */
    protected String getDateString() {
        String result = null;
        if (!suppressDate) {
            result = currentDateStr;
        }
        return result;
    }

    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().replace("\n", " "));
        innerClass.addJavaDocLine(" */");
    }

    public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {
        if (suppressAllComments) {
            return;
        }
        StringBuilder sb = new StringBuilder();
        innerEnum.addJavaDocLine("/**");
        sb.append(" * ");
        sb.append(introspectedTable.getFullyQualifiedTable());
        innerEnum.addJavaDocLine(sb.toString().replace("\n", " "));
        innerEnum.addJavaDocLine(" */");
    }

    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().replace("\n", " "));
        field.addJavaDocLine(" */");
    }

    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().replace("\n", " "));
        field.addJavaDocLine(" */");
    }

    public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
        if (suppressAllComments) {
            return;
        }
      method.addJavaDocLine("/**");
      addJavadocTag(method, false);
      method.addJavaDocLine(" */");
    }

    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().replace("\n", " "));
        sb.setLength(0);
        sb.append(" * @return ");
        sb.append(introspectedColumn.getActualColumnName());
        sb.append(" ");
        sb.append(introspectedColumn.getRemarks());
        method.addJavaDocLine(sb.toString().replace("\n", " "));
        method.addJavaDocLine(" */");
    }

    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().replace("\n", " "));
        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().replace("\n", " "));
        method.addJavaDocLine(" */");
    }

    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().replace("\n", " "));
        sb.setLength(0);
        sb.append(" * @author ");
        sb.append(systemPro.getProperty("user.name"));
        sb.append(" ");
        sb.append(currentDateStr);
        innerClass.addJavaDocLine(" */");
    }
}
复制代码
  • 5.再新建一个类StartUp,用于运行项目,类的代码如下:
复制代码
package org.mybatis.generator;

import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.sql.SQLException;
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.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;

/**
 * 描述:
 * @since 1.9.10
 * @version 1.9.10
 * @作者:niexiaohui
 * @创建时间:2016年11月22日
 * @修改记录:
 */
public class StartUp {
    public static void main(String[] args) throws URISyntaxException {
        try {
            List warnings = new ArrayList();
            boolean overwrite = true;
            ClassLoader classloader = Thread.currentThread().getContextClassLoader();
            InputStream is = classloader.getResourceAsStream("generatorConfig.xml");
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(is);
            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();
        }
    }
}
复制代码
  • 6. 然后将generatorConfig.xml放入resources目录下,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>
    
    
    <context id="context1" targetRuntime="MyBatis3">
        
        <property name="javaFileEncoding" value="UTF-8"/>
        
        <commentGenerator type="org.mybatis.generator.MyCommentGenerator">
        commentGenerator>

        <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver"
            connectionURL="jdbc:oracle:thin:@远程ip地址或localhost:1521:orcl" userId="用户名"
            password="密码">
            
            <property name="remarksReporting" value="true">property>
        jdbcConnection>
    
     
        

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

        
        <javaModelGenerator targetPackage="model"
            targetProject="C:\Users\Administrator\Desktop">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        javaModelGenerator>

        
        <sqlMapGenerator targetPackage="dao"
            targetProject="C:\Users\Administrator\Desktop">
            <property name="enableSubPackages" value="true" />
        sqlMapGenerator>

        
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="dao" targetProject="C:\Users\Administrator\Desktop">
            <property name="enableSubPackages" value="true" />
        javaClientGenerator>


        
        
        
        <table schema="" tableName="ABS_DEAL" domainObjectName="AbsDeal"
            enableCountByExample="false" enableUpdateByExample="false"
            enableDeleteByExample="false" enableSelectByExample="false"
            selectByExampleQueryId="false">
        table>

    context>
generatorConfiguration>
复制代码

到此为止项目的结构如下:

mybatis 根据 数据库表 自动生成 实体 并自动生成中文注释_第2张图片

 这个时候我们运行StartUp的main方法,已经可以实现了,发现桌面上生成了两个文件夹,model和mapper文件夹,里面有生成的文件.看一下效果:

mybatis 根据 数据库表 自动生成 实体 并自动生成中文注释_第3张图片

是不是很符合中国人的审美观呢,如果不满意,或者有什么要加的,可以自己在实现类中加入代码修改,addFieldComment,addGetterComment,addSetterComment这几个方法就行了,里面的代码也很容易看懂,很容易改.

  • 6.到此为止虽然已经生成成功了,但是事情还不算完,不能要求每个人都从无到有搞这么一个项目,所以要把它打成一个可以运行的jar包才行.这里要使依赖包被打包到最后的jar包中,要在pom.xml中进行相应的配置,这里给出全部的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.0modelVersion>

    <groupId>org.mybatisgroupId>
    <artifactId>mygeneratorartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <packaging>jarpackaging>

    <name>mygeneratorname>
    <url>http://maven.apache.orgurl>

    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis.generatorgroupId>
            <artifactId>mybatis-generator-coreartifactId>
            <version>1.3.2version>
        dependency>
        <dependency>
            <groupId>com.oraclegroupId>
            <artifactId>ojdbc6artifactId>
            <version>6.0version>
        dependency>
    dependencies>
    
    <build>
        
        <finalName>mybatis-generator-core-1.3.2finalName>
        <plugins>
            <plugin>
                
                <artifactId>maven-assembly-pluginartifactId>
                <version>2.6version>
                <configuration>
                    
                    <appendAssemblyId>falseappendAssemblyId>
                    <archive>
                        <manifest>
                            
                            <mainClass>org.mybatis.generator.StartUpmainClass>
                        manifest>
                    archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependenciesdescriptorRef>
                    descriptorRefs>
                configuration>
                <executions>
                    <execution>
                        <id>make-assemblyid>
                        <phase>packagephase>
                        <goals>
                            <goal>singlegoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>
    
project>
复制代码

到这里项目就完成了,在项目根路径使用打包命令mvn clean package,当然可以在eclipse中使用maven build中输入命令来生成,我习惯使用控制台来生成,在项目根路径,按住shift的同时右键,选择在此处打开命令窗口,然后输入mvn clean package命令按下enter,当然这些可以实现的前提是你本地maven环境配置好了,如果没有设置maven_home环境变量的话运行会提示无法识别的mvn命令的,成功构建后显示build success,到target目录下,看到生成了jar包:

mybatis 根据 数据库表 自动生成 实体 并自动生成中文注释_第4张图片

同样在target目录下:按住shift同时右键->在此处打开命令行,输入java -jar mybatis-generator-core-1.3.2.jar命令运行jar包,注意-jar后打出my时按tab键mybatis-generator-core-1.3.2.jar就自动补全了,运行结束后,同样的在桌面上回看到生成的model和mapper文件夹及里面的文件.这里是测试,所以配置中写文件生成在了桌面上,可以改一下配置,设置在项目中输出,直接输出到项目中.

当然为了使用方便,不用每次都输入java -jar mybatis-generator-core-1.3.2.jar命令,可以把命令放入脚本文件中,新建一个记事本,重命名为generator.bat,然后把java -jar mybatis-generator-core-1.3.2.jar命令拷贝进去,以后只要双击generator.bat就可以直接生成了,当然你的generator.bat得和jar包在同一个目录下.

 

还有要修改generatorConfig.xml文件可以使用压缩软件打开mybatis-generator-core-1.3.2.jar,双击generatorConfig.xml,修改后保存并更新回压缩包.因为这里StartUp文件中使用的是加载generatorConfig.xml的方法,所以会加载jar包里的generatorConfig.xml配置文件,如果StartUp文件中加载配置文件的方式使用MBG原生态的加载方式,就可以使用jar包同目录下的generatorConfig.xml,不过那时运行命令就为:java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite,我觉得这样挺好的,不用每次都拖着一个generatorConfig.xml,移动都不方便,放在jar包里跟着跑挺方便的.

 

抱歉,使用了才知道,generatorConfig.xml放在jar包里似乎生成到项目里不好配置,只能写绝对路径,相对路径好像不好弄,可以稍微修改一下,用MBG原来的加载外部的generatorConfig.xml,只需要修改pom.xml的构建中的main class节点由startup改为org.mybatis.generator.api.ShellRunner然后重新打包,运行jar包时命令为

java -jar mybatis-generator-core-1.3.2.jar -configfile generatorConfig.xml -overwrite,以下提供的下载更新为使用ShellRunner运行的.如果使用ShellRunner运行,则之前的startup可以删除了,项目resource目录下的generatorConfig.xml也不需要了,直接使用外部的generatorConfig.xml.

 生成的jar包下载:  MybatisGenerator



,使用了才知

遇到问题:

1   pom.xm报错:


     com.oracle
     ojdbc6
     6.0

这个文件下载不到:改为:

 
        com.oracle  
        ojdbc  
        6  
    

基本就没问题了吧。


2   将中文注释修改@column的spring注释:

 修改方法: addFieldComment

public void addFieldComment(Field field, IntrospectedTable introspectedTable,
            IntrospectedColumn introspectedColumn) {
        if (suppressAllComments) {
            return;
        }
        // 添加字段注释
        //@Column(name = "ID", columnDefinition = "NUMBER  VARCHAR2  TIMESTAMP  DATE |本表唯一编码|11|", length = 11, nullable = false)
        StringBuffer sb = new StringBuffer();
        
        //列名
        sb.append("@Column(name = \"" + introspectedColumn.getActualColumnName() + "\", columnDefinition = \"");
        //类型
        if("VARCHAR".equals(introspectedColumn.getJdbcTypeName())){
            sb.append("VARCHAR2");
        } else if("DECIMAL".equals(introspectedColumn.getJdbcTypeName())){
            sb.append("NUMBER");
        } else{
            sb.append(introspectedColumn.getJdbcTypeName());
        }
        //列注释
        sb.append("|");
        if (introspectedColumn.getRemarks() != null){
            sb.append(introspectedColumn.getRemarks());
        }
        //列长
        if(introspectedColumn.getScale()!=0){
            sb.append("||\", precision = " + introspectedColumn.getLength() +" , scale = " + introspectedColumn.getScale() + ", ");
        } else if("TIMESTAMP".equals(introspectedColumn.getJdbcTypeName())){
            sb.append("||\", ");
        } else {
            sb.append("|"+ introspectedColumn.getLength() +"|\", length = " + introspectedColumn.getLength() +", ");
        }
        //是否为空
        sb.append(" nullable = "+introspectedColumn.isNullable()+")");
        field.addJavaDocLine(sb.toString());
    }


此处修改之后,@column注释基本没问题。

例如   @Column(name = "TOTAL_COST", columnDefinition = "NUMBER|实际价格||", precision = 10 , scale = 2,  nullable = true)
           private BigDecimal totalCost;

          @Column(name = "CLINIC_DATE", columnDefinition = "TIMESTAMP|收费时间||",  nullable = true)
           private Date clinicDate;

          @Column(name = "EXPENSE_TYPE", columnDefinition = "NUMBER|处置等标志|1|", length = 1,  nullable = true)
          private Short expenseType;

3   实体中存在的问题   数据库不分Long,Integer, 统一为Number,故生成的实体为Long,Short。 手动将实体的Short,修改为Integer。(此次等能者修改)


4 注意:

generatorConfig.xml

        
        <commentGenerator type="org.mybatis.generator.MyCommentGenerator">
        commentGenerator>

这个必须有:不然调不到自己写的注释方法,而是用mybatis原来的方法。


你可能感兴趣的:(块代码,数据库)