使用idea Scripted Extensions生成entity实体类groovy

在这里插入图片描述
jpa自定义模板

import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil

import java.text.SimpleDateFormat

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */
packageName = ""
typeMapping = [
        (~/(?i)tinyint|smallint|mediumint/)      : "Integer",
        (~/(?i)int/)                             : "Long",
        (~/(?i)bool|bit/)                        : "Boolean",
        (~/(?i)float|double|decimal|real/)       : "BigDecimal",
        (~/(?i)datetime|timestamp|date|time/)    : "Date",
        (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
        (~/(?i)/)                                : "String"
]


FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
    SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
}

def generate(table, dir) {
    def className = javaName(table.getName(), true)
    def fields = calcFields(table)
    packageName = getPackageName(dir)
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))
    printWriter.withPrintWriter { out -> generate(out, className, fields, table) }

//    new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields,table) }
}

// 获取包所在文件夹路径
def getPackageName(dir) {
    return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}

def generate(out, className, fields, table) {
    out.println "package $packageName"
    out.println ""
    out.println "import javax.persistence.Column;"
    out.println "import javax.persistence.Entity;"
    out.println "import javax.persistence.Table;"
    out.println "import javax.persistence.Id;"
    out.println "import javax.persistence.GeneratedValue;"
    out.println "import java.io.Serializable;"
    Set types = new HashSet()

    fields.each() {
        types.add(it.type)
    }

    if (types.contains("Date")) {
        out.println "import java.util.Date;"
    }

    if (types.contains("BigDecimal")) {
        out.println "import java.math.BigDecimal;"
    }

    if (types.contains("InputStream")) {
        out.println "import java.io.InputStream;"
    }
    out.println ""
    out.println "/**\n" +
            " * @Description  \n" +
            " * @Author  linmengmeng\n" + //1. 修改idea为自己名字
            " * @Date " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " \n" +
            " */"
    out.println ""
    out.println "@Entity"
    out.println "@Table ( name =\"" + table.getName() + "\" , schema = \"\")" //2. schema = \"后面添加自己的表空间名称(mysql可以不添加, 不用这个schema属性也行)
    out.println "public class $className  implements Serializable {"
    out.println ""
    out.println genSerialID()
    fields.each() {
        out.println ""
        // 输出注释
        if (isNotEmpty(it.commoent)) {
            out.println "\t/**"
            out.println "\t * ${it.commoent.toString()}"
            out.println "\t */"
        }

        if ((it.annos+"").indexOf("[@Id]") >= 0) out.println "\t@Id"

        if (it.annos != "") out.println "   ${it.annos.replace("[@Id]", "")}"


        // 输出成员变量
        out.println "\tprivate ${it.type} ${it.name};"
    }

    // 输出get/set方法
    fields.each() {
        out.println ""
        out.println "\tpublic ${it.type} get${it.name.capitalize()}() {"
        out.println "\t\treturn this.${it.name};"
        out.println "\t}"
        out.println ""

        out.println "\tpublic void set${it.name.capitalize()}(${it.type} ${it.name}) {"
        out.println "\t\tthis.${it.name} = ${it.name};"
        out.println "\t}"
    }

    // 输出toString方法
    out.println ""
    out.println "\t@Override"
    out.println "\tpublic String toString() {"
    out.println "\t\treturn \"{\" +"
    fields.each() {
        out.println "\t\t\t\t\t\"${it.name}='\" + ${it.name} + '\\'' +"
    }
    out.println "\t\t\t\t'}';"
    out.println "\t}"

    out.println ""
    out.println "}"
}

def calcFields(table) {
    DasUtil.getColumns(table).reduce([]) { fields, col ->
        def spec = Case.LOWER.apply(col.getDataType().getSpecification())

        def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
        def comm = [
                colName : col.getName(),
                name    : javaName(col.getName(), false),
                type    : typeStr,
                commoent: col.getComment(),
                annos   : "\t@Column(name = \"" + col.getName() + "\" )"]
        if ("id".equals(Case.LOWER.apply(col.getName())))
            comm.annos += ["@Id"]
        fields += [comm]
    }
}

// 这里是处理数据库表前缀的方法,这里处理的是t_xxx命名的表
// 已经修改为使用javaName, 如果有需要可以在def className = javaName(table.getName(), true)中修改为javaClassName
// 处理类名(这里是因为我的表都是以t_命名的,所以需要处理去掉生成类名时的开头的T,
// 如果你不需要去掉表的前缀,那么请查找用到了 javaClassName这个方法的地方修改为 javaName 即可)
def javaClassName(str, capitalize) {
    def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
            .collect { Case.LOWER.apply(it).capitalize() }
            .join("")
            .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
    // 去除开头的T  http://developer.51cto.com/art/200906/129168.htm
    s = s[1..s.size() - 1]
    capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

def javaName(str, capitalize) {
//    def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }
//            .join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "_")
//    capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
    def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
            .collect { Case.LOWER.apply(it).capitalize() }
            .join("")
            .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
    capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

def isNotEmpty(content) {
    return content != null && content.toString().trim().length() > 0
}

static String changeStyle(String str, boolean toCamel) {
    if (!str || str.size() <= 1)
        return str

    if (toCamel) {
        String r = str.toLowerCase().split('_').collect { cc -> Case.LOWER.apply(cc).capitalize() }.join('')
        return r[0].toLowerCase() + r[1..-1]
    } else {
        str = str[0].toLowerCase() + str[1..-1]
        return str.collect { cc -> ((char) cc).isUpperCase() ? '_' + cc.toLowerCase() : cc }.join('')
    }
}

//生成序列化的serialVersionUID 
static String genSerialID() {
    return "\tprivate static final long serialVersionUID =  " + Math.abs(new Random().nextLong()) + "L;"
}

原文地址:https://blog.csdn.net/linmengmeng_1314/article/details/101599559

jpa自定义模板2

import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil

import java.text.SimpleDateFormat
import java.util.Map
import java.util.HashMap

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */

packageName = "cn"//默认的包路径,后续替换
author = System.getProperty("user.name")
pkIdText = "\u4e3b\u952eID";//约定含有“主键ID”的文本注释列为主键
dateTime = getDateTime();
typeMapping = [
        (~/(?i)bigint/)                   : "Long",
        (~/(?i)int/)                      : "Integer",
        (~/(?i)number/)                      : "BigDecimal",
        (~/(?i)float|double|decimal|real/): "Double",
        (~/(?i)tinyint/)                  : "Boolean",
        (~/(?i)datetime|timestamp|date/)  : "Date",
        (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
        (~/(?i)/)                         : "String"
]

def getPackageName(dir) {
    return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".")
            .replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}

def getDateTime(){
    return new SimpleDateFormat("yyyy/MM/dd HH:mm").format(new Date());
}

def getImportMapping(){
    Map<String , String> map = new HashMap();
    map.put("BigDecimal" , "import java.math.BigDecimal;")
    map.put("Date" , "import java.util.Date;")
    map.put("InputStream" , "import java.io.InputStream;")
    return map;
}


FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
    SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
}

def generate(table, dir) {
    def className = javaName(table.getName(), true)
    def fields = calcFields(table)
    new File(dir, className + ".java").withPrintWriter("UTF-8") { out -> generate(dir , table , out, className, fields) }
}

/**
 * 生成的时候,选择项目的代码路径,从包路径中找src/java/main路径后的路径开始替换
 */
def generate(dir, table, out, className, fields) {
    packageName = getPackageName(dir);
    tableName = table.getName();
    out.println "package $packageName"
    out.println ""
    //约定按照列的描述中含有主键ID的字段备注为主键,某些关系表中的第一个字段不一定就是主键
    existPk(fields , out);
    out.println "import javax.persistence.*;"
    out.println "import io.swagger.annotations.ApiModel;"
    out.println "import io.swagger.annotations.ApiModelProperty;"
    out.println "import lombok.Data;"

    Set<String> types = new HashSet<>();
    fields.each() {
        types.add(it.type)
    }

    Iterator<String> it = types.iterator();
    while(it.hasNext()){
        String next = it.next();
        if(getImportMapping().containsKey(next)){
            out.println getImportMapping().get(next)
        }
    }

    out.println ""
    out.println "/**"
    out.println " * " + table.getComment()
    out.println " * @auth $author"
    out.println " * @date $dateTime"
    out.println " */"
    out.println "@ApiModel"
    out.println "@Entity"
    out.println "@Data"
    out.println "@Table(name=\"$tableName\")"
    out.println "public class $className {"
    out.println ""
    fields.each() {
        if (it.annos != "") out.println "  ${it.annos}"
        if (it.comment != null && it.comment.indexOf(pkIdText) != -1){
            out.println "    @Id"
            out.println "    @GeneratedValue(generator = \"main-uuid\")"
            out.println "    @GenericGenerator(name = \"main-uuid\", strategy = \"uuid\")"
        }
        out.println "    @Column(name = \"${it.column}\")"
        out.println "    @ApiModelProperty(value = \"${it.comment}\")"
        out.println "    private " + it.type + " ${it.name};"
        out.println ""
    }
    //get set 使用lombok
    /*fields.each() {
      out.println ""
      out.println "    public ${it.type} get${it.name.capitalize()}() {"
      out.println "        return ${it.name};"
      out.println "    }"
      out.println ""
      out.println "    public void set${it.name.capitalize()}(${it.type} ${it.name}) {"
      out.println "        this.${it.name} = ${it.name};"
      out.println "    }"
      out.println ""
    }*/
    out.println "}"
}

def calcFields(table) {
    DasUtil.getColumns(table).reduce([]) { fields, col ->
        def spec = Case.LOWER.apply(col.getDataType().getSpecification())
        def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
        fields += [[
                           name : javaName(col.getName(), false), //表字段名称转为Java命名
                           type : typeStr, //表字段类型
                           comment: col.getComment(), //表字段注释
                           column: col.getName(),
                           annos: ""]]
    }
}

def javaName(str, capitalize) {
    def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
            .collect { Case.LOWER.apply(it).capitalize() }
            .join("")
            .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
    capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

def existPk(fields , out){
    fields.each() {
        if (it.comment != null && it.comment.indexOf(pkIdText) != -1){
            out.println "import org.hibernate.annotations.GenericGenerator;"
        }
    }
}

mybatisplus-lombok-swagger模板

import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil

import java.text.SimpleDateFormat
import java.util.Map
import java.util.HashMap

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */

author = "chendd";
pkIdText = "\u4e3b\u952eID";//约定含有“主键ID”的文本注释列为主键
logicText = "\u903b\u8f91\u5220\u9664";//约定含有逻辑删除的文本列为逻辑删除字段

dateTime = getDateTime();
typeMapping = [
        (~/(?i)bigint/)                   : "Long",
        (~/(?i)int/)                      : "Integer",
        (~/(?i)float|double|decimal|real/): "Double",
        (~/(?i)tinyint/)                  : "Boolean",
        (~/(?i)datetime|timestamp|date/)  : "Date",
        (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
        (~/(?i)/)                         : "String"
]

def getPackageName(dir , suffix) {
    return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".")
            .replaceAll("^.*src(\\.main\\.java\\.)?", "") + suffix
}

def getDateTime(){
    return new SimpleDateFormat("yyyy/MM/dd HH:mm").format(new Date());
}

def getImportMapping(type){
    Map<String , String> map = new HashMap();
    map.put("Date" , "java.util.Date")
    map.put("InputStream" , "java.io.InputStream")
    if(map.containsKey(type)){
        return map.get(type)
    }
    return type
}

FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
    SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
}

def generate(table, dir) {
    def className = javaName(table.getName(), true)
    def fields = calcFields(table)
    //生成Model 实体类
    generateModel(table , dir , className , fields);
    //生成Mapper 接口类
    generateMapper(table , dir , className);
    //生成Service 接口类
    generateServiceInterface(table , dir , className);
    //生成Service 实现类
    generateServiceClass(table , dir , className);
    //生成Controller 控制类
    generateController(table , dir , className);
}

def generateModel(table , dir , className , fields){
    String parent = new File(dir.toString()).getPath();
    File folder = new File(parent + "/model");
    if (!folder.exists()) folder.mkdirs();
    new File(folder , className + ".java").withPrintWriter("UTF-8") { out -> generateModelImpl(dir , table , out, className, fields) }
}

/**
 * 生成的时候,选择项目的代码路径,从包路径中找src/java/main路径后的路径开始替换
 */
def generateModelImpl(dir, table, out, className, fields) {
    def packageName = getPackageName(dir , ".model;");
    tableName = table.getName();
    out.println "package $packageName"
    out.println ""
    //约定按照列的描述中含有主键ID的字段备注为主键,某些关系表中的第一个字段不一定就是主键
    modelExistPk(fields , out);
    out.println "import com.baomidou.mybatisplus.annotation.TableField;"
    out.println "import com.baomidou.mybatisplus.annotation.TableName;"
    modelExistLogic(fields , out);
    out.println "import io.swagger.annotations.ApiModel;"
    out.println "import io.swagger.annotations.ApiModelProperty;"
    out.println "import lombok.Data;"
    out.println ""
    out.println "/**"
    out.println " * " + table.getComment()
    out.println " * @author $author"
    out.println " * @date $dateTime"
    out.println " */"
    out.println "@Data"
    out.println "@ApiModel"
    out.println "@TableName(\"$tableName\")"
    out.println "public class $className {"
    out.println ""
    fields.each() {
        if (it.annos != "") out.println "  ${it.annos}"
        if (it.comment.indexOf(pkIdText) != -1){
            out.println "    @TableId(value = \"${it.name}\" , type = IdType.ASSIGN_ID)"
        }
        if (it.comment.indexOf(logicText) != -1){
            out.println "    @TableField(\"${it.name}\")"
            out.println "    @TableLogic"
            out.println "    @JsonIgnore"
            out.println "    @ApiModelProperty(value = \"\u6570\u636e\u72b6\u6001\uff0c\u53ef\u7528\u6216\u7981\u7528\" , example = \"DISABLE\" , hidden = true)"
        } else {
            out.println "    @TableField(\"${it.name}\")"
            out.println "    @ApiModelProperty(value = \"${it.comment}\")"
        }
        out.println "    private " + getImportMapping(it.type) + " ${it.name};"
        out.println ""
    }
    /*out.println ""
     fields.each() {
       out.println ""
       out.println "  public ${it.type} get${it.name.capitalize()}() {"
       out.println "    return ${it.name};"
       out.println "  }"
       out.println ""
       out.println "  public void set${it.name.capitalize()}(${it.type} ${it.name}) {"
       out.println "    this.${it.name} = ${it.name};"
       out.println "  }"
       out.println ""
     }*/
    out.println "}"
}

def calcFields(table) {
    DasUtil.getColumns(table).reduce([]) { fields, col ->
        def spec = Case.LOWER.apply(col.getDataType().getSpecification())
        def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
        fields += [[
                           name : javaName(col.getName(), false), //表字段名称转为Java命名
                           type : typeStr, //表字段类型
                           comment: col.getComment() == null ? "" : col.getComment(), //表字段注释
                           annos: ""]]
    }
}

def javaName(str, capitalize) {
    def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
            .collect { Case.LOWER.apply(it).capitalize() }
            .join("")
            .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
    capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

def modelExistPk(fields , out){
    fields.each() {
        if (it.comment.indexOf(pkIdText) != -1){
            out.println "import com.baomidou.mybatisplus.annotation.IdType;"
            out.println "import com.baomidou.mybatisplus.annotation.TableId;"
        }

    }
}

def modelExistLogic(fields , out){
    fields.each() {
        if (it.comment.indexOf(logicText) != -1){
            out.println "import com.baomidou.mybatisplus.annotation.TableLogic;"
            out.println "import com.fasterxml.jackson.annotation.JsonIgnore;"
        }

    }
}

//------------创建Mapper
def generateMapper(table , dir , className){
    String parent = new File(dir.toString()).getPath();
    File folder = new File(parent + "/mapper");
    if (!folder.exists()) folder.mkdirs();
    new File(folder , className + "Mapper.java").withPrintWriter("UTF-8") { out -> generateMapperImpl(table , dir , out, className) }
}

def generateMapperImpl(table , dir , out , className) {
    def packageName = getPackageName(dir , "");
    out.println "package $packageName" + ".mapper;"
    out.println ""
    out.println "import com.baomidou.mybatisplus.core.mapper.BaseMapper;"
    out.println "import $packageName" + ".model." + className + ";"
    out.println ""
    out.println "/**"
    out.println " * " + table.getComment() + "Mapper\u63a5\u53e3\u5b9a\u4e49"
    out.println " * @author $author"
    out.println " * @date $dateTime"
    out.println " */"
    out.println "public interface $className" + "Mapper extends BaseMapper<$className> {"
    out.println ""
    out.println "    "
    out.println "}"
}

//------------创建Service接口
def generateServiceInterface(table , dir , className){
    String parent = new File(dir.toString()).getPath();
    File folder = new File(parent + "/service");
    if (!folder.exists()) folder.mkdirs();
    new File(folder , "I" + className + "Service.java").withPrintWriter("UTF-8") { out -> generateServiceInterfaceImpl(table , dir , out, className) }
}

def generateServiceInterfaceImpl(table , dir , out , className) {
    def packageName = getPackageName(dir , "");
    out.println "package $packageName" + ".service;"
    out.println ""
    out.println "import $packageName" + ".model." + "$className;"
    out.println "import com.baomidou.mybatisplus.extension.service.IService;"
    out.println ""
    out.println "/**"
    out.println " * " + table.getComment() + "Service\u63a5\u53e3\u5b9a\u4e49"
    out.println " * @author $author"
    out.println " * @date $dateTime"
    out.println " */"
    out.println "public interface I$className" + "Service extends IService<$className> {"
    out.println ""
    out.println "    "
    out.println "}"

}

//------------创建Service实现类
def generateServiceClass(table , dir , className){
    String parent = new File(dir.toString()).getPath();
    File folder = new File(parent + "/service/impl");
    if (!folder.exists()) folder.mkdirs();
    new File(folder , className + "Service.java").withPrintWriter("UTF-8") { out -> generateServiceClassImpl(table , dir , out, className) }
}

def generateServiceClassImpl(table , dir , out, className) {
    def packageName = getPackageName(dir , "");
    out.println "package $packageName" + ".service.impl;"
    out.println ""
    out.println "import $packageName" + ".model." + "$className;"
    out.println "import $packageName" + ".mapper." + "$className" + "Mapper;"
    out.println "import $packageName" + ".service." + "I$className" + "Service;"
    out.println "import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;"
    out.println "import org.springframework.stereotype.Service;"
    out.println "import javax.annotation.Resource;"
    out.println ""
    out.println "/**"
    out.println " * " + table.getComment() + "Service\u63a5\u53e3\u5b9e\u73b0"
    out.println " * @author $author"
    out.println " * @date $dateTime"
    out.println " */"
    out.println "@Service"
    out.println "public class $className" + "Service extends ServiceImpl<$className" + "Mapper , $className> implements I$className" + "Service {"
    out.println ""
    out.println "    @Resource"
    out.println "    private $className" + "Mapper " + className.uncapitalize() + "Mapper;"
    out.println ""
    out.println "}"
}

//------------创建Controller控制类
def generateController(table , dir , className) {
    String parent = new File(dir.toString()).getPath();
    File folder = new File(parent + "/controller");
    if (!folder.exists()) folder.mkdirs();
    new File(folder , className + "Controller.java").withPrintWriter("UTF-8") { out -> generateControllerImpl(table , dir , out, className) }
}

def generateControllerImpl(table , dir , out, className) {
    def packageName = getPackageName(dir , "");
    out.println "package $packageName" + ".controller;"
    out.println ""
    out.println "import cn.chendd.blog.base.controller.BaseController;"
    out.println "import $packageName" + ".service." + "I$className" + "Service;"
    out.println "import javax.annotation.Resource;"
    out.println "import io.swagger.annotations.Api;"
    out.println "import io.swagger.annotations.ApiSort;"
    out.println "import org.springframework.stereotype.Controller;"
    out.println "import org.springframework.web.bind.annotation.RequestMapping;"
    out.println "import org.springframework.http.MediaType;"
    out.println ""
    out.println "/**"
    out.println " * " + table.getComment() + "Controller\u63a5\u53e3\u5b9a\u4e49"
    out.println " * @author $author"
    out.println " * @date $dateTime"
    out.println " */"
    out.println "@Api(value = \"" + table.getComment() + "\" , tags = \"" + table.getComment() + "\")"
    out.println "@ApiSort(10)"
    out.println "@RequestMapping(value = \"\" , produces = MediaType.APPLICATION_JSON_VALUE)"
    out.println "@Controller"
    out.println "public class $className" + "Controller extends BaseController {"
    out.println ""
    out.println "    @Resource"
    out.println "    private I$className" + "Service " + className.uncapitalize() + "Service;"
    out.println ""
    out.println "}"
}

mybatisplus-lombok-swagger模板

import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil

import java.text.SimpleDateFormat
import java.util.Map
import java.util.HashMap

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */

packageName = "cn.chendd.blog;"//默认的包路径,后续替换
author = "chendd";
pkIdText = "\u4e3b\u952eID";//约定含有“主键ID”的文本注释列为主键
logicText = "\u903b\u8f91\u5220\u9664";//约定含有逻辑删除的文本列为逻辑删除字段

dateTime = getDateTime();
typeMapping = [
        (~/(?i)bigint/)                   : "Long",
        (~/(?i)int/)                      : "Integer",
        (~/(?i)float|double|decimal|real/): "Double",
        (~/(?i)tinyint/)                  : "Boolean",
        (~/(?i)datetime|timestamp|date/)  : "Date",
        (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
        (~/(?i)/)                         : "String"
]

def getPackageName(dir , suffix) {
    return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".")
            .replaceAll("^.*src(\\.main\\.java\\.)?", "") + suffix + ";"
}

def getDateTime(){
    return new SimpleDateFormat("yyyy/MM/dd HH:mm").format(new Date());
}

def getImportMapping(type){
    Map<String , String> map = new HashMap();
    map.put("Date" , "java.util.Date")
    map.put("InputStream" , "java.io.InputStream")
    if(map.containsKey(type)){
        return map.get(type)
    }
    return type
}

FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
    SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
}

def generate(table, dir) {
    def className = javaName(table.getName(), true)
    def fields = calcFields(table)
    //生成Model 文件
    generateModel(table , dir , className , fields);
    //生成Mapper 文件
    //new File(dir , className + ".java")
}

def generateModel(table , dir , className , fields){
    String parent = new File(dir.toString()).getPath();
    File folder = new File(parent + "/model");
    if (!folder.exists()) folder.mkdirs();
    new File(folder , className + ".java").withPrintWriter("UTF-8") { out -> generateModelImpl(dir , table , out, className, fields) }
}

/**
 * 生成的时候,选择项目的代码路径,从包路径中找src/java/main路径后的路径开始替换
 */
def generateModelImpl(dir, table, out, className, fields) {
    packageName = getPackageName(dir , ".model");
    tableName = table.getName();
    out.println "package $packageName"
    out.println ""
    //约定按照列的描述中含有主键ID的字段备注为主键,某些关系表中的第一个字段不一定就是主键
    modelExistPk(fields , out);
    out.println "import com.baomidou.mybatisplus.annotation.TableField;"
    out.println "import com.baomidou.mybatisplus.annotation.TableName;"
    modelExistLogic(fields , out);
    out.println "import io.swagger.annotations.ApiModel;"
    out.println "import io.swagger.annotations.ApiModelProperty;"
    out.println "import lombok.Data;"
    out.println ""
    out.println "/**"
    out.println " * " + table.getComment()
    out.println " * @auth $author"
    out.println " * @date $dateTime"
    out.println " */"
    out.println "@Data"
    out.println "@ApiModel"
    out.println "@TableName(\"$tableName\")"
    out.println "public class $className {"
    out.println ""
    fields.each() {
        if (it.annos != "") out.println "  ${it.annos}"
        if (it.comment.indexOf(pkIdText) != -1){
            out.println "    @TableId(value = \"${it.name}\" , type = IdType.ASSIGN_ID)"
        }
        if (it.comment.indexOf(logicText) != -1){
            out.println "    @TableField(\"${it.name}\")"
            out.println "    @TableLogic"
            out.println "    @JsonIgnore"
            out.println "    @ApiModelProperty(value = \"\u6570\u636e\u72b6\u6001\uff0c\u53ef\u7528\u6216\u7981\u7528\" , example = \"DISABLE\" , hidden = true)"
        } else {
            out.println "    @TableField(\"${it.name}\")"
            out.println "    @ApiModelProperty(value = \"${it.comment}\")"
        }
        out.println "    private " + getImportMapping(it.type) + " ${it.name};"
        out.println ""
    }
    /*out.println ""
     fields.each() {
       out.println ""
       out.println "  public ${it.type} get${it.name.capitalize()}() {"
       out.println "    return ${it.name};"
       out.println "  }"
       out.println ""
       out.println "  public void set${it.name.capitalize()}(${it.type} ${it.name}) {"
       out.println "    this.${it.name} = ${it.name};"
       out.println "  }"
       out.println ""
     }*/
    out.println "}"
}

def calcFields(table) {
    DasUtil.getColumns(table).reduce([]) { fields, col ->
        def spec = Case.LOWER.apply(col.getDataType().getSpecification())
        def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
        fields += [[
                           name : javaName(col.getName(), false), //表字段名称转为Java命名
                           type : typeStr, //表字段类型
                           comment: col.getComment() == null ? "" : col.getComment(), //表字段注释
                           annos: ""]]
    }
}

def javaName(str, capitalize) {
    def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
            .collect { Case.LOWER.apply(it).capitalize() }
            .join("")
            .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
    capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

def modelExistPk(fields , out){
    fields.each() {
        if (it.comment.indexOf(pkIdText) != -1){
            out.println "import com.baomidou.mybatisplus.annotation.IdType;"
            out.println "import com.baomidou.mybatisplus.annotation.TableId;"
        }

    }
}

def modelExistLogic(fields , out){
    fields.each() {
        if (it.comment.indexOf(logicText) != -1){
            out.println "import com.baomidou.mybatisplus.annotation.TableLogic;"
            out.println "import com.fasterxml.jackson.annotation.JsonIgnore;"
        }

    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值