zoukankan      html  css  js  c++  java
  • mybatis根据数据库表结构自动生成实体类,dao,mapper

    首先, pom需要引入

     <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.39</version>
        </dependency>
    <!-- mybatis-->
     <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.3</version>
        </dependency>

    然后是mybatis生成器

    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;
    
    /**
     * Mybatis 注释生成器
     */
    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());
            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());
            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());
    
            //      addJavadocTag(field, false);
    
            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());
            field.addJavaDocLine(" */");
        }
    
        public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
    
        }
    
        public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
            if (suppressAllComments) {
                return;
            }
            
        }
    
        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(" */");
        }
    
        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(" */");
        }
    
        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(" */");
        }
    }

    然后是generator.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="my" targetRuntime="MyBatis3">
            <!-- 这里的type里写的是你的实现类的类全路径,即上面那个生成器所在的位置 -->
            <commentGenerator type="org.mybatis.generator.MyCommentGenerator">
            </commentGenerator>
            <!--连接数据库 -->
            <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                            connectionURL="jdbc:mysql://远程地址:3306/数据库名" userId="数据库用户名"
                            password="密码"/>                                                             
            <!-- 实体类的地址 targetProject + targetPackage == 生成文件所在位置  根据表结构生成的实体类就在项目的com.common.model中-->
            <javaModelGenerator targetPackage="com.common.model"
                                targetProject="E:commonsrcmainjava">                   
                <property name="enableSubPackages" value="true"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
            <!-- mapper文件地址 targetProject + targetPackage == 生成文件所在物理位置     生成的.mapper文件就在mybatis文件夹下-->
            <sqlMapGenerator targetPackage="mybatis"
                             targetProject="E:srcmain
    esources">
                <property name="enableSubPackages" value="true"/>                                          
            </sqlMapGenerator>
            <!-- dao生成的存放地址 targetProject + targetPackage == 生成文件所在位置  生成的dao接口就在项目的com.dao中-->
            <javaClientGenerator targetPackage="com.dao"
                                 targetProject="E:srcmainjava" type="XMLMAPPER">
                <property name="enableSubPackages" value="true"/>                                            
            </javaClientGenerator>
            <!-- tableName 数据库中表的名字    domainObjectName  生成的实体类名字以及加上Dao和Mapper组成的dao和mapper文件的名字 -->
            <table tableName="数据库表的名字" domainObjectName="生成实体类的名字"
                   enableCountByExample="false" enableUpdateByExample="false"
                   enableDeleteByExample="false" enableSelectByExample="false"
                   selectByExampleQueryId="false">
                <property name="useActualColumnNames" value="true"/>
            </table>
    
            
        </context>
    </generatorConfiguration>

    最后是要执行的的类,执行这个类, 就能生成相应的文件了, 执行完可能需要更新下项目才能看出效果

    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 java.io.File;
    import java.io.IOException;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class MyBatisGeneratorTest {
        public static void main(String[] args) {
            try {
                List<String> warnings = new ArrayList<String>();
                boolean overwrite = true;   
               
                 File configFile = new File("E:\src\main\resource\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);
            } 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();
            }
        }
    
    }
  • 相关阅读:
    第三天
    第二天
    第一天
    构建之法阅读笔记06
    返回一个一维整数数组中最大子数组的和2
    团队介绍
    软件工程结对作业02
    返回一个整数数组中最大子数组的和
    构建之法阅读笔记05
    暑假周总结二7.22
  • 原文地址:https://www.cnblogs.com/gczmn/p/9438651.html
Copyright © 2011-2022 走看看