zoukankan      html  css  js  c++  java
  • mybatis的逆向工程和中文注解

    取不到中文注释字段的时候,可以试试下面的方法

    下面的配置均指的是Mybatis Generator 的配置文件(一般是叫generatorConfig.xml)的配置:

    mysql

    方法1:

    <jdbcConnection driverClass="${driver}"
        connectionURL="{url}" userId="${username}" password="${password}">
        <!-- 针对mysql数据库 -->
        <property name="useInformationSchema" value="true"></property>
    </jdbcConnection>

    方法2

    connectionURL="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&useInformationSchema=true"

    Oracle

    <jdbcConnection driverClass="${driver}"
        connectionURL="{url}" userId="${username}" password="${password}">
        <!-- 针对oracle数据库 -->
        <property name="remarksReporting" value="true"></property>
    </jdbcConnection>

    详解

    MBG访问数据库也是通过JDBC进行,而通过JDBC连接Oracle、Mysql(其它数据库暂不清楚)时,想获取到表及字段注释是需要额外设置一些连接属性的.一般大体上都是如下的代码(以Oracle为例):

    我们先来看下MBG连接数据库的代码,可以在org.mybatis.generator.internal.JDBCConnectionFactory中找到:

        public JDBCConnectionFactory(JDBCConnectionConfiguration config) {
            super();
            userId = config.getUserId();
            password = config.getPassword();
            connectionURL = config.getConnectionURL();
            driverClass = config.getDriverClass();
            otherProperties = config.getProperties(); //注意此行
        }
        
        public Connection getConnection()
                throws SQLException {
            Driver driver = getDriver();
    
            Properties props = new Properties();
    
            if (stringHasValue(userId)) {
                props.setProperty("user", userId); //$NON-NLS-1$
            }
    
            if (stringHasValue(password)) {
                props.setProperty("password", password); //$NON-NLS-1$
            }
    
            props.putAll(otherProperties); //注意此行
    
            Connection conn = driver.connect(connectionURL, props);
    
            if (conn == null) {
                throw new SQLException(getString("RuntimeError.7")); //$NON-NLS-1$
            }
    
            return conn;
        }

    通过上面代码(尤其是我加了注意此行注释的两行代码)我们可以看到,MBG在建立连接时,是把JDBCConnectionConfiguration中的所有properties给设置进去了.那么显然我们只需要找到在哪配置这些properties就行了.
    JDBCConnectionConfiguration对应到XML配置里就是jdbcConnection节点.
    再来看看官方的使用文档,官方文档关于jdbcConnection (点击查看) 一节中 <property>子元素的说明:

    • <property> (0..N) Note: any properties specified here will be added to the properties of the JDBC driver.

    那么在配置文件中我们如下改动即可:

    <jdbcConnection driverClass="${driver}"
        connectionURL="{url}" userId="${username}" password="${password}">
        <!-- 针对oracle数据库 -->
        <property name="remarksReporting" value="true"></property>
    </jdbcConnection>

    由于MyBatis Generator自带了生成注释的功能,但是,是英文的而且生成的根本无法理解,所以可以通过,修改他的源码来实现生成中文的注释,具体方式有以下几种:

    1) 自定义CommentGenerator
    2) 修改源码
    3) PluginAdapter插件的形式

    这个例子通过自定义CommentGenerator来实现。

    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>
    
        <groupId>com.test</groupId>
        <artifactId>testgenerator</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <!--  依赖版本  -->
            <mapper.version>3.3.9</mapper.version>
            <mysql.version>5.1.10</mysql.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.1</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>tk.mybatis</groupId>
                <artifactId>mapper</artifactId>
                <version>${mapper.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-core</artifactId>
                <version>1.3.5</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.1.1</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.5</version>
                    <configuration>
                        <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                        <overwrite>true</overwrite>
                        <verbose>true</verbose>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>mysql</groupId>
                            <artifactId>mysql-connector-java</artifactId>
                            <version>${mysql.version}</version>
                        </dependency>
                        <dependency>
                            <groupId>tk.mybatis</groupId>
                            <artifactId>mapper</artifactId>
                            <version>${mapper.version}</version>
                        </dependency>
                        <dependency>
                            <groupId>com.test</groupId>
                            <artifactId>testgenerator</artifactId>
                            <version>1.0-SNAPSHOT</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </project>

    在java目录里面增加MybatisCommentGenerator.java

    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.*;
    import org.mybatis.generator.api.dom.xml.XmlElement;
    import org.mybatis.generator.config.MergeConstants;
    import org.mybatis.generator.config.PropertyRegistry;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Properties;
    
    import static org.mybatis.generator.internal.util.StringUtility.isTrue;
    
    /**
     * TODO
     *
     * @Author mx
     * @Date: 2019-04-09 11:32
     */
    public class MybatisCommentGenerator implements CommentGenerator {
        private Properties properties;
        private Properties systemPro;
        private boolean suppressDate;
        private boolean suppressAllComments;
        private String currentDateStr;
    
        public MybatisCommentGenerator() {
            super();
            properties = new Properties();
            systemPro = System.getProperties();
            suppressDate = false;
            suppressAllComments = false;
            currentDateStr = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date());
        }
    
        /**
         * Adds properties for this instance from any properties configured in the
         * CommentGenerator configuration.
         * <p>     * This method will be called before any of the other methods.
         *
         * @param properties All properties from the configuration
         */
        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));
        }
    
        /**
         * @param field              the field
         * @param introspectedTable  the introspected table
         * @param introspectedColumn
         */
        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(" */");
        }
    
        /**
         * Adds the field comment.
         *
         * @param field             the field
         * @param introspectedTable
         */
        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(" */");
        }
    
        public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
            if (suppressAllComments) {
                return;
            }
            StringBuilder sb = new StringBuilder();
            topLevelClass.addJavaDocLine("/**");
            sb.append(" * ");
            sb.append(introspectedTable.getRemarks());
            sb.append(" ");
            sb.append(introspectedTable.getTableType());
            sb.append(" ");
            sb.append(getDateString());
            topLevelClass.addJavaDocLine(sb.toString());
            topLevelClass.addJavaDocLine(" */");
        }
    
        /**
         * Adds the inner class comment.
         *
         * @param innerClass        the inner class
         * @param introspectedTable
         */
        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(" */");
        }
    
        /**
         * Adds the inner class comment.
         *
         * @param innerClass        the inner class
         * @param introspectedTable the introspected table
         * @param markAsDoNotDelete
         */
        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(" */");
        }
    
        /**
         * Adds the enum comment.
         *
         * @param innerEnum         the inner enum
         * @param introspectedTable
         */
        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(" */");
        }
    
        /**
         * Adds the getter comment.
         *
         * @param method             the method
         * @param introspectedTable  the introspected table
         * @param introspectedColumn
         */
        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(" */");
        }
    
        /**
         * Adds the setter comment.
         *
         * @param method             the method
         * @param introspectedTable  the introspected table
         * @param introspectedColumn
         */
        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(" */");
        }
    
        /**
         * Adds the general method comment.
         *
         * @param method            the method
         * @param introspectedTable
         */
        public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
            if (suppressAllComments) {
                return;
            }
            method.addJavaDocLine("/**");
    //        addJavadocTag(method, false);
            StringBuilder sb = new StringBuilder();
            sb.append(" * ");
            sb.append(MergeConstants.NEW_ELEMENT_TAG);
            String s = method.getName();
            sb.append(' ');
            sb.append(s);
            method.addJavaDocLine(sb.toString());
            method.addJavaDocLine(" */");
        }
    
        public void addJavaFileComment(CompilationUnit compilationUnit) {
    
        }
    
        public void addComment(XmlElement xmlElement) {
    
        }
    
        public void addRootComment(XmlElement rootElement) {
        }
    
        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());
        }
    
        protected String getDateString() {
            String result = null;
            if (!suppressDate) {
                result = currentDateStr;
            }
            return result;
        }
    }

    在resources目录下面增加文件config.properties,generatorConfig.xml。

    config.properties的内容:

    # 数据库配置
    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/wmbook
    jdbc.user=root
    jdbc.password=123456
    
    # 通用Mapper固定配置
    mapper.plugin=tk.mybatis.mapper.generator.MapperPlugin
    mapper.Mapper=tk.mybatis.mapper.common.Mapper
    mapper.forceAnnotation=true
    
    # 生成文件保存位置
    targetModelPackage=com.test.testgenerator.domain
    targetXMLPackage=com.test.testgenerator.mapper.xml
    targetMapperPackage=com.test.testgenerator.mapper
    targetJavaProject=src/main/java
    targetResourcesProject=src/main/java

    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="config.properties"/>
    
        <context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
            <property name="beginningDelimiter" value="`"/>
            <property name="endingDelimiter" value="`"/>
    
            <!--支持序列化-->
            <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
    
    <!--        <commentGenerator>-->
    <!--            &lt;!&ndash; 是否去除自动生成的注释 true:是 : false:否 &ndash;&gt;-->
    <!--            <property name="suppressAllComments" value="false"/>-->
    <!--        </commentGenerator>-->
    
            <commentGenerator type="MybatisCommentGenerator">
                <property name="suppressDate" value="false"/>
                <property name="suppressAllComments" value="false"/>
            </commentGenerator>
    
            <jdbcConnection driverClass="${jdbc.driverClass}"
                            connectionURL="${jdbc.url}"
                            userId="${jdbc.user}"
                            password="${jdbc.password}">
            </jdbcConnection>
    
            <javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false"/>
                <!-- 从数据库返回的值被清理前后的空格 -->
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
    
            <sqlMapGenerator targetPackage="${targetXMLPackage}" targetProject="${targetResourcesProject}">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false"/>
            </sqlMapGenerator>
    
            <javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}"
                                 type="XMLMAPPER">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false"/>
            </javaClientGenerator>
    
            <!--全部表参与逆向工程-->
            <!--以下example为false,表示不会生成example类,否则将自动生成example类-->
            <table schema="" tableName="%">
            </table>
    
            <!--指定某些表参与逆向工程-->
            <!--<table tableName="user"-->
            <!--enableCountByExample="false"-->
            <!--enableUpdateByExample="false"-->
            <!--enableDeleteByExample="false"-->
            <!--enableSelectByExample="false"-->
            <!--selectByExampleQueryId="false">-->
            <!--</table>-->
        </context>
    </generatorConfiguration>

    创建完相关文件后的目录为:

    生成方式一 

    新建生成文件的类StartUp.java

    public class StartUp {
        public static void main(String[] args) {
            try {
                List<String> warnings = new ArrayList<String>();
                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();
            }
        }
    }

    执行main方法就可以生成文件了。

    如果需要让生成的实体和mapper继承其它对象和接口可以设置

            <javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false"/>
                <!-- 从数据库返回的值被清理前后的空格 -->
                <property name="trimStrings" value="true"/>
                <property name="rootClass" value="com.XXX.BaseEntity"/>
            </javaModelGenerator>
    
            <javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}"
                                 type="XMLMAPPER">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="true"/>
                <property name="rootInterface" value="com.XXX.BaseMapper"/>
            </javaClientGenerator>

    如果还想自定义生成实体和mapper里面的内容,可以参考 让MyBatis Generator产生的Mapper更简洁

    生成方式二

    先安装maven项目,然后在配置文成通过执行maven插件执行程序生成文件

    执行后生成的目录路径为:

    在生成的实体文件中就有中文注释了:

    生成方式三

    使用IDEA的插件MyBatisCodeHelper等,也可以生成

  • 相关阅读:
    c++标准库容器【转】
    C++命名空间的解释 【转】
    [转载]定义、公理、定理、推论、命题和引理的区别
    待读论文
    矩阵分解 Matrix Factorization (RegularSVD) 实验总结
    Predicting the Next Location: A Recurrent Model with Spatial and Temporal Contexts AAAI2016
    Discovering Urban Functional Zones Using Latent Activity Trajectories TKDE 2015
    numpy
    python 编程 规范
    深度学习
  • 原文地址:https://www.cnblogs.com/grasp/p/10694880.html
Copyright © 2011-2022 走看看