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等,也可以生成

  • 相关阅读:
    CF1539 VP 记录
    CF1529 VP 记录
    CF875C National Property 题解
    CF1545 比赛记录
    CF 1550 比赛记录
    CF1539E Game with Cards 题解
    CF1202F You Are Given Some Letters... 题解
    vmware Linux虚拟机挂载共享文件夹
    利用SOLR搭建企业搜索平台 之九(solr的查询语法)
    利用SOLR搭建企业搜索平台 之四(MultiCore)
  • 原文地址:https://www.cnblogs.com/grasp/p/10694880.html
Copyright © 2011-2022 走看看