springboot 整合代码生成器 generator+lombok+自动注释+基类继承(自定义模式/不借用插件)

一、pom.xml中引入依赖

1)请确保在这之前已经添加了如下几个依赖,并且已经配置完成相关信息无误

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--整合mysql数据库-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>

        <!--整合jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--整合mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

        <!--整合lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>

2)新增generator代码生成器依赖信息

        <!--整合代码generator生成器(请先整合jdbc/mybatis/lombok)-->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>

3)build内要确保存在pring-boot-maven-plugin(一般创建项目时自带)

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

二、配置generatorConfig.xml文件信息

注:1、以下代码中的com.example.demo3请替换为自己的项目目录)

2、引入的外部配置文件信息,即application-dev.yml文件使用的哪个用哪个

<?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="application-dev.yml"/>

    <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
        <!-- 生成的 Java 文件的编码 -->
        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 格式化 Java 代码 -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- 格式化 XML 代码 -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>

        <!--自动新增@Data备注,取消setter/getter写法-->
        <plugin type="com.example.demo3.generator.LombokPlugin" >
            <property name="hasLombok" value="true"/>
        </plugin>

        <!-- 自定义注释生成器 -->
        <commentGenerator type="com.example.demo3.generator.MysqlCommentGenerator">
            <!--生成作者信息-->
            <property name="author" value="pyp"/>
            <!--生成创建时间信息-->
            <property name="dateFormat" value="yyyy/MM/dd"/>
        </commentGenerator>

        <!--数据库链接URL,用户名、密码,引用的配置文件中的参数 -->
        <jdbcConnection
                driverClass="${driver-class-name}"
                connectionURL="${url}"
                userId="${username}"
                password="${password}">
            <property name="nullCatalogMeansCurrent" value="true" />
            <!--生成表备注信息-->
            <property name="useInformationSchema" value="true" />
        </jdbcConnection>

        <javaTypeResolver>
            <!--强制转化为BigDecimals格式,非必要配置-->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- 生成实体类的包名和位置 -->
        <javaModelGenerator targetPackage="com.example.demo3.entity"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!--生成映射文件的包名和位置  com/lu/mapper-->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- 生成DAO的包名和位置 mybatis两种开发模式 xml 注解式-->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.example.demo3.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <!--mapper继承基类信息-->
            <property name="rootInterface" value="com.example.demo3.common.BaseMapper"/>
        </javaClientGenerator>

        <!-- 设置数据库的表名和实体类名 -->
        <table tableName="user" domainObjectName="User">
            <!--实体类继承基类-->
            <property name="rootClass" value="com.example.demo3.common.BaseModel"/>
            <!-- generatedKey用于生成生成主键的方法 -->
            <generatedKey column="id" sqlStatement="SELECT LAST_INSERT_ID()"/>
        </table>
    </context>

</generatorConfiguration>

三、根据generator建立相应的文件信息,这里默认将自定义的文件全部放在common和generator内

1、添加注释信息:

     1)首先建立generator文件夹,在文件夹下自定义两个java文件,分别是:EmptyCommentGenerator.java和MysqlCommentGenerator.java

EmptyCommentGenerator.java文件代码:

package com.example.demo3.generator;

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 java.util.Properties;
import java.util.Set;

public class EmptyCommentGenerator implements CommentGenerator {

    @Override
    public void addConfigurationProperties(Properties properties) {

    }

    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

    }

    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable, boolean b) {

    }

    @Override
    public void addEnumComment(InnerEnum innerEnum, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

    }

    @Override
    public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

    }

    @Override
    public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addJavaFileComment(CompilationUnit compilationUnit) {

    }

    @Override
    public void addComment(XmlElement xmlElement) {

    }

    @Override
    public void addRootComment(XmlElement xmlElement) {

    }

    @Override
    public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {

    }

    @Override
    public void addGeneralMethodAnnotation(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {

    }

    @Override
    public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {

    }

    @Override
    public void addFieldAnnotation(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn, Set<FullyQualifiedJavaType> set) {

    }

    @Override
    public void addClassAnnotation(InnerClass innerClass, IntrospectedTable introspectedTable, Set<FullyQualifiedJavaType> set) {

    }
}

MysqlCommentGenerator.java文件代码:

package com.example.demo3.generator;


import com.example.demo3.common.BaseEntity;
import org.mybatis.generator.api.FullyQualifiedTable;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.*;

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

public class MysqlCommentGenerator extends EmptyCommentGenerator {

    private Properties properties;

    public MysqlCommentGenerator() {
        properties = new Properties();
    }

    @Override
    public void addConfigurationProperties(Properties properties) {
        // 获取自定义的 properties
        this.properties.putAll(properties);
    }



    @Override
    public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {

        String author = properties.getProperty("author");
        String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
        SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat);

        FullyQualifiedTable fullyQualifiedTable = introspectedTable.getFullyQualifiedTable();

        Field field = new Field();
        field.setVisibility(JavaVisibility.PRIVATE);
        field.setType(new FullyQualifiedJavaType("long"));
        field.setStatic(true);
        field.setFinal(true);
        field.setName("serialVersionUID");
        field.setInitializationString("1L");
        topLevelClass.addField(field);

        FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("Serializable");
        FullyQualifiedJavaType imp = new FullyQualifiedJavaType("java.io.Serializable");
        topLevelClass.addSuperInterface(fqjt);
        topLevelClass.addImportedType(imp);

        topLevelClass.addJavaDocLine("/**");
        topLevelClass.addJavaDocLine(" * " + introspectedTable.getRemarks());
        topLevelClass.addJavaDocLine(" * " + fullyQualifiedTable.getIntrospectedTableName());
        topLevelClass.addJavaDocLine(" * @author " + author);
        topLevelClass.addJavaDocLine(" * @date " + dateFormatter.format(new Date()));
        topLevelClass.addJavaDocLine(" */");
    }

    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

        Class<BaseEntity> baseEntityClass = BaseEntity.class;

        java.lang.reflect.Field[] declaredFields = baseEntityClass.getDeclaredFields();

        boolean isSet = true;

        for (java.lang.reflect.Field ignored : declaredFields) {

            ignored.setAccessible(true);

            if (ignored.getName().equals(introspectedColumn.getJavaProperty())) {
                isSet = false;
                continue;
            }

        }

        // 获取列注释
        String remarks = introspectedColumn.getRemarks();

        if (isSet == true) {
            field.addJavaDocLine("/**");
            if (!remarks.equals("")) {
                field.addJavaDocLine(" * " + remarks);
            }
            field.addJavaDocLine(" * " + introspectedColumn.getActualColumnName());
            field.addJavaDocLine(" */");
        }

    }
}

    4)在common目录下新建文件BaseEntity.php,作用:忽略部分代码的注释信息

 代码如下:

package com.example.demo3.common;

public class BaseEntity {

    // 有需要忽略的在上面新增上
}

    3)在generatorConfig.xml中将<commentGenerator type="com.example.demo3.generator.MysqlCommentGenerator"></commentGenerator>配置为下面:(已在之前的文件中配置好了)

        <!-- 自定义注释生成器 -->
        <commentGenerator type="com.example.demo3.generator.MysqlCommentGenerator">
            <!--生成作者信息-->
            <property name="author" value="pyp"/>
            <!--生成创建时间信息-->
            <property name="dateFormat" value="yyyy/MM/dd"/>
        </commentGenerator>

 

 

2、配置lombok,自动生成@Data注解

    1)在generator文件下新建文件LombokPlugin.java

package com.example.demo3.generator;


import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;

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

public class LombokPlugin extends PluginAdapter {
    public LombokPlugin() {
    }

    public boolean validate(List<String> list) {
        return true;
    }

    public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        topLevelClass.addImportedType("lombok.Data");
        topLevelClass.addAnnotation("@Data");
        //topLevelClass.addImportedType("lombok.Getter");
        //topLevelClass.addImportedType("lombok.Setter");
        //topLevelClass.addImportedType("lombok.ToString");
        //topLevelClass.addAnnotation("@Getter");
        //topLevelClass.addAnnotation("@Setter");
        //topLevelClass.addAnnotation("@ToString");
//        topLevelClass.addJavaDocLine("/**");
//        topLevelClass.addJavaDocLine("* Created by Mybatis Generator " + this.date2Str(new Date()));
//        topLevelClass.addJavaDocLine("*/");
        return true;
    }

    public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        interfaze.addJavaDocLine("/**");
        interfaze.addJavaDocLine("* Created by Mybatis Generator " + this.date2Str(new Date()));
        interfaze.addJavaDocLine("*/");
        return true;
    }

    public boolean modelSetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        return false;
    }

    public boolean modelGetterMethodGenerated(Method method, TopLevelClass topLevelClass, IntrospectedColumn introspectedColumn, IntrospectedTable introspectedTable, ModelClassType modelClassType) {
        return false;
    }

    private String date2Str(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        return sdf.format(date);
    }
}

    2)在generatorConfig.xml中加入配置信息(已在配置文件内)

        <!--自动新增@Data备注,取消setter/getter写法-->
        <plugin type="com.example.demo3.generator.LombokPlugin" >
            <property name="hasLombok" value="true"/>
        </plugin>

3、配置实体类继承BaseModel基类

   1)在common内新建BaseModel.java基类

package com.example.demo3.common;

public class BaseModel {
}

   2)在genneratorConfig.xml中配置实体类继承,在table标签内新增name为rootClass的property标签

        <!-- 设置数据库的表名和实体类名 -->
        <table tableName="user" domainObjectName="User">
            <!--实体类继承基类-->
            <property name="rootClass" value="com.example.demo3.common.BaseModel"/>
            <!-- generatedKey用于生成生成主键的方法 -->
            <generatedKey column="id" sqlStatement="SELECT LAST_INSERT_ID()"/>
        </table>

4、配置mapper继承BaseMapper基类

   1)在common中新建BaseMapper基类

package com.example.demo3.common;

public interface  BaseMapper<T extends BaseModel> {
}

  2)在genneratorConfig.xml中配置mapper基类继承,在javaClientGenerator中新增name为rootInterface的property

        <!-- 生成DAO的包名和位置 mybatis两种开发模式 xml 注解式-->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.example.demo3.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <!--mapper继承基类信息-->
            <property name="rootInterface" value="com.example.demo3.common.BaseMapper"/>
        </javaClientGenerator>

 

—end—

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值