zoukankan      html  css  js  c++  java
  • Mybatis generator生成工具简单介绍

    其主要的功能就是方便,快捷的创建好Dao,entry,xml 加快了开发速度,使用方面根据其提供的规则配置好就OK

      这里还有一个重要的开发场景,开发过程中,对数据库的操作肯定很多,比如新增字段什么的,你只要将原先自动生成的一套代码删除,重新再生成一份,这就完美解决了,但是这样做的前提是,你必须对生成后的代码不改动,只是使用。不需要想手动开发写代码那样到处改代码,还担心改漏地方。

      其实这个的实现方式也是五花八门的,写一种比较常见的

     主要流程

      第一步:添加依赖

      主要是jdbc和generator

    <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.6</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>

       第二步:配置 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="DB2Tables" targetRuntime="MyBatis3">
            <!-- 生成mysql带有分页的sql的插件  这个可以自己写,-->
            <plugin type="generator.MysqlPaginationPlugin" />
            <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
            <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
            <!-- 自定义的注释规则,继承 DefaultCommentGenerator 重写 一些方法 -->
            <commentGenerator type="generator.NewbatisGenerator">
                <!-- 是否去除自动生成日期的注释 true:是 : false:否 -->
                <property name="suppressDate" value="true"/>
                <!-- 是否去除所有自动生成的注释 true:是 : false:否 -->
                <property name="suppressAllComments" value="true"/>
            </commentGenerator>
            <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://数据库地址"
                            userId="username"
                            password="password">
            </jdbcConnection>
            <!--生成entity类存放位置-->
            <javaModelGenerator targetPackage="包名(com.generator.test.entity)" targetProject="项目地址到java (D:workspacesrcmainjava)">
                <property name="enableSubPackages" value="true"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
            <!--生成映射文件存放位置-->
            <sqlMapGenerator targetPackage="包名(com.generator.test.mapper)" targetProject="项目地址到java (D:workspacesrcmainjava)">
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
            <!--生成Dao类存放位置-->
            <javaClientGenerator type="XMLMAPPER" targetPackage="包名(com.generator.test.dao)"
                                 targetProject="项目地址到java (D:workspacesrcmainjava)">
                <property name="enableSubPackages" value="true"/>
            </javaClientGenerator>
            <table tableName="表名" domainObjectName="生成实体的类名">
            </table>
        </context>
    </generatorConfiguration>

      第三步:主要看你个人的需求,对注释,分页啥的有啥要求不,可以重写几个方法对其进行改造

      主要举几个例子  

      对注释的修改 NewbatisGenerator 

    public class NewbatisGenerator extends DefaultCommentGenerator {
        private Properties properties;
        private Properties systemPro;
        private boolean suppressDate;
        private boolean suppressAllComments;
        private String currentDateStr;
    
        public NewbatisGenerator() {
            super();
            properties = new Properties();
            systemPro = System.getProperties();
            suppressDate = false;
            suppressAllComments = false;
            currentDateStr = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date());
        }
    
        /**
         * 对类的注解
         * @param topLevelClass
         * @param introspectedTable
         */
        @Override
        public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
            topLevelClass.addJavaDocLine("/**");
            topLevelClass.addJavaDocLine(" * 这是MyBatis Generator自动生成的Model Class.");
    
            StringBuilder sb = new StringBuilder();
            sb.append(" * 对应的数据表是 : ");
            sb.append(introspectedTable.getFullyQualifiedTable());
            topLevelClass.addJavaDocLine(sb.toString());
    
            String tableRemarks = introspectedTable.getRemarks();
            if (!StringUtils.isEmpty(tableRemarks)) {
                sb.setLength(0);
                sb.append(" * 数据表注释 : ");
                sb.append(tableRemarks);
                topLevelClass.addJavaDocLine(sb.toString());
            }
    
            sb.setLength(0);
            sb.append(" * @author ");
            sb.append(systemPro.getProperty("user.name"));
            topLevelClass.addJavaDocLine(sb.toString());
    
            String curDateString = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date());
            sb.setLength(0);
            sb.append(" * @date ");
            sb.append(curDateString);
            topLevelClass.addJavaDocLine(sb.toString());
    
            topLevelClass.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("
    ", " "));
            field.addJavaDocLine(" */");
        }
    
    }

    对分页的添加  MysqlPaginationPlugin  自动生成带分页插件

    public class MysqlPaginationPlugin extends PluginAdapter {
        public MysqlPaginationPlugin() {}
    
        public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,
                IntrospectedTable introspectedTable) {
            this.addLimit(topLevelClass, introspectedTable, "limitStart");
            this.addLimit(topLevelClass, introspectedTable, "limitSize");
            return super.modelExampleClassGenerated(topLevelClass, introspectedTable);
        }
    
        public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,
                IntrospectedTable introspectedTable) {
            XmlElement isNotNullElement = new XmlElement("if");
            isNotNullElement
                    .addAttribute(new Attribute("test", "limitStart != null and limitSize >= 0"));
            isNotNullElement.addElement(new TextElement("limit #{limitStart} , #{limitSize}"));
            element.addElement(isNotNullElement);
            return super.sqlMapSelectByExampleWithoutBLOBsElementGenerated(element, introspectedTable);
        }
    
        public boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element,
                IntrospectedTable introspectedTable) {
            XmlElement isNotNullElement = new XmlElement("if");
            isNotNullElement
                    .addAttribute(new Attribute("test", "limitStart != null and limitSize >= 0"));
            isNotNullElement.addElement(new TextElement("limit #{limitStart} , #{limitSize}"));
            element.addElement(isNotNullElement);
            return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable);
        }
    
        private void addLimit(TopLevelClass topLevelClass, IntrospectedTable introspectedTable,
                String name) {
            CommentGenerator commentGenerator = this.context.getCommentGenerator();
            Field field = new Field();
            field.setVisibility(JavaVisibility.PROTECTED);
            field.setType(PrimitiveTypeWrapper.getIntegerInstance());
            field.setName(name);
            commentGenerator.addFieldComment(field, introspectedTable);
            topLevelClass.addField(field);
            char c = name.charAt(0);
            String camel = Character.toUpperCase(c) + name.substring(1);
            Method method = new Method();
            method.setVisibility(JavaVisibility.PUBLIC);
            method.setName("set" + camel);
            method.addParameter(new Parameter(PrimitiveTypeWrapper.getIntegerInstance(), name));
            StringBuilder sb = new StringBuilder();
            sb.append("this.");
            sb.append(name);
            sb.append(" = ");
            sb.append(name);
            sb.append(";");
            method.addBodyLine(sb.toString());
            commentGenerator.addGeneralMethodComment(method, introspectedTable);
            topLevelClass.addMethod(method);
            Method getterMethod = AbstractJavaGenerator.getGetter(field);
            commentGenerator.addGeneralMethodComment(getterMethod, introspectedTable);
            topLevelClass.addMethod(getterMethod);
        }
    
        public boolean validate(List<String> warnings) {
            return true;
        }
    
    
    
        /**
         * 生成mapper.xml,文件内容会被清空再写入
         * */
        @Override
        public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) {
            sqlMap.setMergeable(false);
            return super.sqlMapGenerated(sqlMap, introspectedTable);
        }
    
    }

      最后一步:运行生成

      这些官网都是有的

    public class Generator {
    
        public static void main(String[] args) throws Exception{
            List<String> warnings = new ArrayList<String>();
            boolean overwrite = true;
            File configFile = new File("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);
    
        }
    }

     转载请注明出处:https://www.cnblogs.com/zhouguanglin/p/11239583.html

  • 相关阅读:
    __init__.py文件的作用
    is is not == !=之间的区别
    使用七牛上传头像
    flask的request的用法
    Mac各个文件夹表示的意思
    sqlalchemy的基本的使用
    将Cygwin Emacs设为Windows explorer默认打开程序
    使用Stardict命令行版本sdcv
    坚持使用GNU/Linux
    在Windows上创建同样的Linux操作环境
  • 原文地址:https://www.cnblogs.com/zf15193741987/p/13161340.html
Copyright © 2011-2022 走看看