IDEA 快速生成实体类

  • Post author:
  • Post category:其他



效果


2.idea 右侧 1.点击Database   2.点击+号  3.选择Data Source



3.选择MySQL


4.链接数据库


表示链接成功

选择以下

5.点击此文件替换以下内容

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.io.*

import java.text.SimpleDateFormat


/*

* Available context bindings:

*   SELECTION   Iterable<DasObject>

*   PROJECT     project

*   FILES       files helper

*/

packageName = “”

typeMapping = [

(~/(?i)tinyint|smallint|mediumint|bigint/)      : “Long”,

(~/(?i)int/)                                    : “Integer”,

(~/(?i)bool|bit/)                               : “Boolean”,

(~/(?i)float|double|decimal|real/)              : “Double”,

(~/(?i)datetime|timestamp|date|time/)           : “Timestamp”,

(~/(?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 = javaClassName(table.getName(), true)

def className = javaClassName(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) {


def tableName = table.getName()

out.println “package $packageName”

out.println “”

out.println “import lombok.NoArgsConstructor;”

out.println “import lombok.AllArgsConstructor;”

out.println “import lombok.Data;”


Set types = new HashSet()


fields.each() {


types.add(it.type)

}


if (types.contains(“Date”)) {


out.println “import java.util.Date;”

}


if (types.contains(“InputStream”)) {


out.println “import java.io.InputStream;”

}

out.println “”

out.println “/**\n” +

” * @author  cyn \n” +

” * @create “+ new SimpleDateFormat(“yyyy-MM-dd HH:mm”).format(new Date()) + ” \n” +

” */”

out.println “”

out.println “@Data”

out.println “@AllArgsConstructor”

out.println “@NoArgsConstructor”

out.println “public class $className {”


fields.each() {


out.println “”

// 输出注释

//if (isNotEmpty(it.comment)) {


out.println “\t/**”

out.println “\t * “+”table name:”+”${it.olderName}”

out.println “\t * “+”table type:”+”${it.olderType}”

out.println “\t * “+”table comment:”+”${it.comment.toString()}”

out.println “\t */”

//}else{


//out.println “\t/**”

//out.println “\t * “+”table name:”+”${it.olderName}”

//out.println “\t * “+”table type:”+”${it.olderType}”

//out.println “\t * “+”table comment: null”

//out.println “\t */”

//}

// 输出成员变量

out.println “\tprivate ${it.type} ${it.name};”

}

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),

olderName: col.getName(),

type : typeStr,

olderType : col.getDataType().getSpecification(),

comment: col.getComment()]

fields += [comm]

}

}


// 处理类名(这里是因为我的表都是以t_命名的,所以需要处理去掉生成类名时的开头的T,

// 如果你需要那么请查找用到了 javaName 这个方法的地方修改为 javaClassName即可)

def javaClassName(str, capitalize) {


def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)

.collect { Case.LOWER.apply(it).capitalize() }

.join(“”)

.replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, “_”)

// 去除开头的T

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(”)

}

}


static String genSerialID()

{


return “\tprivate static final long serialVersionUID =  “+Math.abs(new Random().nextLong())+”L;”

}


levels

6.再次点击选择

7.选择自己需要生成的目录下

8.效果


上面注解@Data 表示get,set,toString方法


@AllArgsConstructor  全参


@NoArgsConstructor  无参


注解引用需要引入依赖

<!-- lombok依赖 -->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
    <scope>provided</scope>
</dependency>

JAVA项目下载对应jar包



版权声明:本文为changyanan1009原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。