自学内容网 自学内容网

spring jpa代码生成器

目录结构如下:

完整代码如下:

pom

<?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>org.example</groupId>
    <artifactId>jpgGenerate</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.30</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>7</source>
                    <target>7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

MyController.java.ftl

package com.example.jpggenerate.res;


import org.springframework.web.bind.annotation.RequestMapping;
<#if restControllerStyle>
import org.springframework.web.bind.annotation.RestController;
<#else>
import org.springframework.stereotype.Controller;
</#if>
        <#if superControllerClassPackage??>
import ${superControllerClassPackage};
</#if>

<#if restControllerStyle>
@RestController
<#else>
@Controller
</#if>
@RequestMapping("<#if package.ModuleName?? && package.ModuleName != "">/${package.ModuleName}</#if>/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}</#if>")
<#if kotlin>
class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()</#if>
<#else>
<#if superControllerClass??>
public class ${table.controllerName} extends ${superControllerClass} {
<#else>
public class ${table.controllerName} {
</#if>

        }
</#if>

MyEntity.java.ftl

package com.example.jpggenerate.res;

<#if swagger2>
        import io.swagger.annotations.ApiModel;
        import io.swagger.annotations.ApiModelProperty;
</#if>
<#if entityLombokModel>
        import lombok.Data;
        import lombok.NoArgsConstructor;

        import javax.persistence.Entity;
        import javax.persistence.GeneratedValue;
        import javax.persistence.GenerationType;
        import javax.persistence.Id;
        <#if chainModel>
                import lombok.experimental.Accessors;
        </#if>
</#if>

<#if entityLombokModel>
        @Data
        @NoArgsConstructor
        <#if chainModel>
                @Accessors(chain = true)
        </#if>
</#if>
<#if table.convert>
        @Entity(name = "${table.name}")
</#if>
<#if swagger2>
        @ApiModel(value="${entity}对象", description="${table.comment!}")
</#if>
<#if superEntityClass??>
        public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}></#if> {
<#elseif activeRecord>
        public class ${entity} extends Model<${entity}> {
<#else>
        public class ${entity} extends JpaManualEntity {
</#if>
<#-- ----------  BEGIN 字段循环遍历  ---------->
<#list table.fields as field>
        <#if field.keyFlag>
                <#assign keyPropertyName="${field.propertyName}"/>
        </#if>
        <#if field.comment!?length gt 0>
                <#if swagger2>
                        @ApiModelProperty(value = "${field.comment}")
                <#else>
                        // ${field.comment}
                </#if>
        </#if>
        <#if field.keyFlag>
        <#-- 主键 -->
                <#if field.keyIdentityFlag>
                        @Id
                        @GeneratedValue(strategy = GenerationType.AUTO)
                <#elseif idType??>
                        @Id
                        @GeneratedValue(strategy = GenerationType.AUTO)
                <#elseif field.convert>
                        @Id
                        @GeneratedValue(strategy = GenerationType.AUTO)
                </#if>
        <#-- 普通字段 -->
        <#elseif field.fill??>
        <#-- -----   存在字段填充设置   ----->
                <#if field.convert>
                        @TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})
                <#else>
                        @TableField(fill = FieldFill.${field.fill})
                </#if>
        <#elseif field.convert>
                @TableField("${field.annotationColumnName}")
        </#if>
<#-- 乐观锁注解 -->
        <#if (versionFieldName!"") == field.name>
                @Version
        </#if>
<#-- 逻辑删除注解 -->
        <#if (logicDeleteFieldName!"") == field.name>
                @TableLogic
        </#if>
        private ${field.propertyType} ${field.propertyName};

</#list>
<#------------  END 字段循环遍历  ---------->
<#if !entityLombokModel>
        <#list table.fields as field>
                <#if field.propertyType == "boolean">
                        <#assign getprefix="is"/>
                <#else>
                        <#assign getprefix="get"/>
                </#if>
                public ${field.propertyType} ${getprefix}${field.capitalName}() {
                return ${field.propertyName};
                }
                <#if chainModel>
                        public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
                <#else>
                        public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
                </#if>
                this.${field.propertyName} = ${field.propertyName};
                <#if chainModel>
                        return this;
                </#if>
                }
        </#list>
</#if>
<#if entityColumnConstant>
        <#list table.fields as field>
                public static final String ${field.name?upper_case} = "${field.name}";

        </#list>
</#if>
<#if activeRecord>
        @Override
        protected Serializable pkVal() {
        <#if keyPropertyName??>
                return this.${keyPropertyName};
        <#else>
                return null;
        </#if>
        }
</#if>
<#if !entityLombokModel>
        @Override
        public String toString() {
        return "${entity}{" +
        <#list table.fields as field>
                <#if field_index==0>
                        "${field.propertyName}=" + ${field.propertyName} +
                <#else>
                        ", ${field.propertyName}=" + ${field.propertyName} +
                </#if>
        </#list>
        "}";
        }
</#if>
}

MyRepository.java.ftl

package com.example.jpggenerate.res;




import ${cfg.jpaSuperRepositoryClassPackage};

@Repository
<#if kotlin>
        interface ${table.mapperName} : ${superMapperClass}<${entity}>
<#else>
        public interface ${table.mapperName} extends ${superMapperClass}<${entity}, Long>, JpaSpecificationExecutor<${entity}> {
        // 接口的第二个泛型是主键的类型。要按实际修改
        }
</#if>

MyService.java.ftl

package com.example.jpggenerate.res;



<#if kotlin>
        interface ${table.serviceName} : ${superServiceClass}<${entity}>
<#else>
        public interface ${table.serviceName} {

        }
</#if>

MyServiceImpl.java.ftl

package com.example.jpggenerate.res;


import ${superServiceImplClassPackage};
import org.springframework.stereotype.Service;

@Service
<#if kotlin>
        open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} {

        }
<#else>
        public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} {

        }
</#if>
Generate.javva
package com.example.jpggenerate.res;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.HashMap;
import java.util.Map;

public class Generate {
    private static final String url = "jdbc:postgresql://10.10.12.14:5432/safety";
    private static final String userName    = "postgres";
    private static final String password    = "postgres";
    private static final String tableName   = "sys_dict";
    private static final String tablePrefix = "sys_";

    // 演示例子
    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator autoGenerator = new AutoGenerator();

        // 全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        globalConfig.setOutputDir(projectPath + "/src/main/java");
        globalConfig.setAuthor("xxx");
        globalConfig.setFileOverride(false);  //默认就是false
        globalConfig.setOpen(false);
        // gc.setBaseResultMap(true); // mapper.xml 生成 ResultMap
        // gc.setBaseColumnList(true); // mapper.xml 生成 ColumnList

        // 自定义文件命名,注意 %s 会自动填充表实体属性!
        globalConfig.setMapperName("%sRepository");
        // gc.setXmlName("%sDao");
        globalConfig.setServiceName("%sService");
        globalConfig.setServiceImplName("%sServiceImpl");
        globalConfig.setControllerName("%sController");
        // gc.setSwagger2(true); 实体属性 Swagger2 注解
        autoGenerator.setGlobalConfig(globalConfig);

        // 数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();

        dataSourceConfig.setUrl(url);
        // dsc.setSchemaName("public");
        dataSourceConfig.setDriverName("org.postgresql.Driver");
        dataSourceConfig.setUsername(userName);
        dataSourceConfig.setPassword(password);
        autoGenerator.setDataSource(dataSourceConfig);

        // 包配置
        PackageConfig packageConfig = new PackageConfig();
        // pc.setParent("com.example.generate.out");
        // pc.setModuleName("xxx");
        packageConfig.setMapper("repository");
        packageConfig.setParent("com.example.jpggenerate." + tableName.substring(tablePrefix.length()));
        autoGenerator.setPackageInfo(packageConfig);

        //自定义配置
        InjectionConfig customConfig = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<>();
                map.put("jpaSuperRepositoryClassPackage",
                        "org.springframework.data.jpa.repository.JpaRepository");
                this.setMap(map);
            }
        };
        autoGenerator.setCfg(customConfig);

        // 配置自定义输出模板
        TemplateConfig templateConfig = new TemplateConfig();
        //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
        templateConfig.setController("templates_mp/MyController.java");
        templateConfig.setService("templates_mp/MyService.java");
        templateConfig.setServiceImpl("templates_mp/MyServiceImpl.java");
        templateConfig.setMapper("templates_mp/MyRepository.java");
        templateConfig.setEntity("templates_mp/MyEntity.java");
        templateConfig.setXml(null);
        autoGenerator.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
        strategyConfig.setSuperMapperClass("JpaRepository");
        //strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
        strategyConfig.setEntityLombokModel(true);
        strategyConfig.setRestControllerStyle(true);

        // 公共父类
        // strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
        // 写于父类中的公共字段
        // strategy.setSuperEntityColumns("id");

        // 表名
        strategyConfig.setInclude(tableName);
        strategyConfig.setTablePrefix(tablePrefix);
        strategyConfig.setControllerMappingHyphenStyle(true);

        autoGenerator.setStrategy(strategyConfig);
        autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());
        autoGenerator.execute();
    }
}


原文地址:https://blog.csdn.net/ytyDaMoTou/article/details/143034396

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!