根据数据库代码自动生成的插件挺多的,这里主要分享两种:
1.根据database以及脚本代码自动生成
2.根据mybatis-generator-core自动生成(下一章节进行分享,包含sqlserver的注释获取)
这篇主要介绍的是database以及groovy脚本代码自动生成,可以自定义去除数据库表的前缀生成相应的类名,支持获取表的备注,字段备注,主键获取。
database以及脚本代码自动生成相对于mybatis-generator-core自动生成,其优点是不需要将生成的文件的代码嵌入到项目中,而是相当于IDEA的脚本插件使用,但是不好同时生成DO,DAO,SqlMapper文件,因为同时生成的话,反而使用mybatis-generator-core更加方便。
注:使用database以及脚本代码自动生成的时候得先生成DO文件,再DAO文件,最后生成SqlMapper文件,具体原因将在流程里面做介绍
废话不多,直接进入操作过程:
1.配置Database,链接数据库
这一步网上教程很多,也相对简单,这里不做详细介绍了,先选择数据源,这里使用MySql做介绍
接下来就是配置链接信息,需要填写的如下图,点击测试通过之后直接APPLY,OK即可
2.接下来创建脚本文件
跳转到脚本目录下新建三个文件,分别为生成DO,DAO,SQLMAPPER文件,代码如下:
Generate ModePOJOs.groovy
importcom.intellij.database.model.DasTableimportcom.intellij.database.model.ObjectKindimportcom.intellij.database.util.Caseimportcom.intellij.database.util.DasUtilimport java.io.*
importjava.text.SimpleDateFormat/*** @Description 生成DO文件
* @zsy
* @Date 2020-07-13*/packageName= ""tableComment= ""typeMapping=[
(~/(?i)tinyint|smallint|mediumint|int/) : "Integer",
(~/(?i)bigint/) : "Long",
(~/(?i)bool|bit/) : "Boolean",
(~/(?i)float|double|decimal|real/) : "Double",
(~/(?i)datetime|timestamp|date|time/) : "Date",
(~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
(~/(?i)/) : "String"]//自定义需要去除的表头,根据自己的数据库表头自定义。自定义作者名称//只有后面紧接着的是"_"下滑线的表头会被处理,比如:t_estcolumn会被处理,testcolumn不会被处理
tableHeaderRemoved = ["t","t_sys"]
authorName= "zsy"FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->SELECTION.filter { itinstanceof DasTable && it.getKind() ==ObjectKind.TABLE }.each { generate(it, dir) }
}
def generate(table, dir) {
def className= javaClassName(table.getName(), true)
def fields=calcFields(table)
packageName=getPackageName(dir)
tableComment=table.getComment()if(tableComment==null){
tableComment= ""}
tableComment= tableComment.replaceAll("\n"," ")
className= className +"DO"PrintWriter printWriter= new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))
printWriter.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 java.io.Serializable;"out.println"import io.swagger.annotations.*;"out.println"import lombok.*;"Set types= newHashSet()
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" +
" * @Description ${tableComment} \n" +
" * @Author ${authorName} \n" +
" * @Date "+ new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " \n" +
" */"out.println""out.println"@Data"out.println"@ApiModel(description= \"${tableComment}\")"out.println"public class $className implements Serializable {"out.println""out.println genSerialID()
i= 0fields.each() {
out.println""
if(it.commoent==null){
it.commoent= ""}
it.commoent= it.commoent.replaceAll("\n","").replaceAll("\r","")//输出注释
if(isNotEmpty(it.commoent)) {
out.println"\t/**"out.println"\t * ${it.commoent.toString()}"out.println"\t */"}
out.println"\t@ApiModelProperty(value = \"${it.commoent}\", position = ${i})"
//输出成员变量
out.println "\tprivate ${it.type} ${it.name};"i++}
out.println""out.println"}"}
def calcFields(table) {//加载当前数据库主键
def primaryKey = ""def prKey=DasUtil.getPrimaryKey(table);if (prKey != null) {
def keyRef