使用IDEA调用自定义脚本 自动生成SpringDataJpa代码

####  1. 打开IDEA自带的数据库连接工具

     

##### 2. 尝试连接数据库

##### 3. 尝试连接数据库

##### 3.1 如果遇时区错误,请到文章最后,有讲解,此处不表;

##### 4. 选中数据库,选中脚本,尝试生成代码

##### 5. 选中数据库,选中脚本(我选中的是 GenerateServiceDaoEntityPOJOs.groovy ,这个脚本我放在后边),尝试生成代码,结束;

##### 6. GenerateServiceDaoEntityPOJOs.groovy  脚本:

```groovy

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

config = [
        impSerializable  : true,
        extendBaseEntity : false,
        extendBaseService: true

]
baseEntityPackage = "com.shining.JPAentity"
baseServicePackage = "com.shining.JPAservice"
baseEntityProperties = ["id", "createDate", "lastModifiedDate", "version"]
typeMapping = [
        (~/(?i)bool|boolean|tinyint/)     : "Boolean",
        (~/(?i)bigint/)                   : "Long",
        (~/int/)                          : "Integer",
        (~/(?i)float|double|decimal|real/): "Double",
        (~/(?i)datetime|timestamp/)       : "java.util.Date",
        (~/(?i)date/)                     : "java.sql.Date",
        (~/(?i)time/)                     : "java.sql.Time",
        (~/(?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)
  }
}
//dif -> E:\DEVELOPE\Code\jpademo\src\main\java\com\demo\jpa
def generate(table, dir) {

  def entityPath = "${dir.toString()}\\entity",
      servicePath = "${dir.toString()}\\service",
      repPath = "${dir.toString()}\\repository",
      serviceImpPath = "${dir.toString()}\\service\\impl"

  mkdirs([entityPath, servicePath, repPath, serviceImpPath])

  def entityName = javaName(table.getName(), true)
  def fields = calcFields(table)
  def basePackage = clacBasePackage(dir)

  new File("${entityPath}\\${entityName}.java").withPrintWriter { out -> genEntity(out, table, entityName, fields, basePackage) }
  new File("${servicePath}\\${entityName}Service.java").withPrintWriter { out -> genService(out, table, entityName, fields, basePackage) }
  new File("${repPath}\\${entityName}Repository.java").withPrintWriter { out -> genRepository(out, table, entityName, fields, basePackage) }
//  new File("${repPath}\\${entityName}RepositoryCustom.java").withPrintWriter { out -> genRepositoryCustom(out, entityName, basePackage) }
  new File("${serviceImpPath}\\${entityName}ServiceImpl.java").withPrintWriter { out -> getServiceImpl(out, table, entityName, fields, basePackage) }

}

def genProperty(out, field) {
  if (field.annos != "") out.println "  ${field.annos}"
  if (field.colum != field.name) {
    out.println "\t@Column(name = \"${field.colum}\")"
  }
  out.println "\tprivate ${field.type} ${field.name};"
  out.println ""
}

def genEntity(out, table, entityName, fields, basePackage) {
  out.println "// \n" +
          "// This file is generated by using IDEA to reference its custom generated entity class script \n" +
          "// This file will be overwritten when it is regenerated \n" +
          "// Generation time: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "  \n" +
          "//"

  out.println "package ${basePackage}.entity;"
  out.println ""
  if (config.extendBaseEntity) {
    out.println "import $baseEntityPackage;"
  }
  out.println "import lombok.Data;"
  out.println ""
  if (config.impSerializable) {
    out.println "import java.io.Serializable;"
    out.println "import com.fasterxml.jackson.annotation.JsonIgnoreProperties;"
    out.println ""
  }
  out.println "import javax.persistence.*;"

  out.println "/**\n" +
          " * @Description  \n" +
          " * @Author  shining\n" + //1. 修改idea为自己名字
          " * @Date " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " \n" +
          " */"
  out.println ""
  out.println "@Data"
  out.println "@Entity"
  out.println "@Table(name = \"${table.getName()}\")"
  out.println "@JsonIgnoreProperties(value={\"hibernateLazyInitializer\",\"handler\",\"fieldHandler\"})"
  out.println "public class $entityName${config.extendBaseEntity ? " extends BaseEntity" : ""}${config.impSerializable ? " implements Serializable" : ""} {"
  out.println ""
  if (config.extendBaseEntity) {
    // 继承父类
    fields.each() { if (!isBaseEntityProperty(it.name)) genProperty(out, it) }
  } else {
    // 不继承父类
    out.println "\t@Id"
    out.println "\t@GeneratedValue(strategy = GenerationType.IDENTITY)"
    fields.each() { genProperty(out, it) }
  }
  out.println "}"

}

def genService(out, table, entityName, fields, basePackage) {
  out.println "// \n" +
          "// This file is generated by using IDEA to reference its custom generated entity class script \n" +
          "// This file will be overwritten when it is regenerated \n" +
          "// Generation time: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "  \n" +
          "//"

  out.println "package ${basePackage}.service;"
  out.println ""
  out.println "import ${basePackage}.repository.${entityName}Repository;"
  out.println "import ${basePackage}.base.Result;"
  if (config.extendBaseService) {
    out.println "import $baseServicePackage;"
    out.println "import ${basePackage}.entity.$entityName;"
  }
  out.println "import org.springframework.stereotype.Service;"
  out.println ""
  out.println "import javax.annotation.Resource;"
  out.println ""
  out.println "/**\n" +
          " * @Description  \n" +
          " * @Author  shining\n" + //1. 修改idea为自己名字
          " * @Date " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " \n" +
          " */"
  out.println "public interface ${entityName}Service${config.extendBaseService ? " extends BaseService<$entityName, ${fields[0].type}>" : ""}  {"
  out.println ""
  out.println "   //根据id查询"
  out.println "   public Result getOne(${fields[0].type} id);"
  out.println ""
  out.println "   //根据id删除"
  out.println "   public Result deleteOne(${fields[0].type} id);"
  out.println ""
  out.println "   //根据id保存"
  out.println "   public Result saveOne(${entityName} entity);"
  out.println "}"
}

def genRepository(out, table, entityName, fields, basePackage) {
  out.println "// \n" +
          "// This file is generated by using IDEA to reference its custom generated entity class script \n" +
          "// This file will be overwritten when it is regenerated \n" +
          "// Generation time: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "  \n" +
          "//"
  out.println "package ${basePackage}.repository;"
  out.println ""
  out.println "import ${basePackage}.entity.$entityName;"
  out.println "import org.springframework.data.jpa.repository.JpaRepository;"
  out.println ""
  out.println "/**\n" +
          " * @Description  \n" +
          " * @Author  shining\n" + //1. 修改idea为自己名字
          " * @Date " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " \n" +
          " */"
  out.println "public interface ${entityName}Repository extends JpaRepository<$entityName, ${fields[0].type}>{}"
}

/*def genRepositoryCustom(out, entityName, basePackage) {
  out.println "package ${basePackage}.repository;"
  out.println ""
  out.println "public interface ${entityName}RepositoryCustom { "
  out.println "}"
}*/

def getServiceImpl(out, table, entityName, fields, basePackage) {
  out.println "// \n" +
          "// This file is generated by using IDEA to reference its custom generated entity class script \n" +
          "// This file will be overwritten when it is regenerated \n" +
          "// Generation time: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "  \n" +
          "//"
  out.println "package ${basePackage}.service.impl;"
  out.println ""
  out.println "import ${basePackage}.service.${entityName}Service;"
  out.println "import org.springframework.stereotype.Service;"
  out.println "import ${basePackage}.base.Result;"
  out.println "import ${basePackage}.entity.${entityName};"
  out.println "import ${basePackage}.service.${entityName}Service;"
  out.println "import ${basePackage}.repository.${entityName}Repository;"
  out.println "import org.springframework.beans.factory.annotation.Autowired;"

  out.println ""
  out.println "/**\n" +
          " * @Description  \n" +
          " * @Author  shining\n" + //1. 修改idea为自己名字
          " * @Date " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " \n" +
          " */"
  out.println "@Service"
  out.println "public class ${entityName}ServiceImpl implements ${entityName}Service {"
  out.println ""
  out.println "\t@Autowired"
  out.println "\tprivate ${entityName}Repository rep;"
  out.println ""
  out.println "\t@Override"
  out.println "\tpublic Result getOne(${fields[0].type} id){"
  out.println " \t\t${entityName} one = rep.getOne(id);"
  out.println "\t\treturn Result.builder().success().data(one).build();"
  out.println "\t}"
  out.println ""
  out.println "\t@Override"
  out.println "\tpublic Result deleteOne(${fields[0].type} id){"
  out.println " \t\trep.deleteById(id);"
  out.println "\t\treturn Result.builder().success().build();"
  out.println "\t}"
  out.println ""
  out.println "\t@Override"
  out.println "\tpublic Result saveOne(${entityName} entity){"
  out.println " \t\t${entityName} one = rep.save(entity);"
  out.println "\t\treturn Result.builder().success().data(one).build();"
  out.println "\t}"
  out.println "}"
}

def mkdirs(dirs) {
  dirs.forEach {
    def f = new File(it)
    if (!f.exists()) {
      f.mkdirs();
    }
  }
}

def clacBasePackage(dir) {
  dir.toString()
          .replaceAll("^.+\\\\src\\\\main\\\\java\\\\", "")
          .replaceAll("\\\\", ".")
}

def isBaseEntityProperty(property) {
  baseEntityProperties.find { it == property } != null
}
// 转换类型
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),
                         colum: col.getName(),
                         type : typeStr,
                         annos: ""]]
  }
}

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

// 这里是处理数据库表前缀的方法,这里处理的是t_xxx命名的表
// 如果有需要过滤前缀的T 可以在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]
}

```

 

####  遇到如下时区问题

1. 进入命令窗口(Win + R),连接数据库 mysql -hlocalhost -uroot -p,回车,输入密码,回车,如图:

2,继续输入 show variables like'%time_zone';    (注意不要漏掉后面的分号),回车,如图:

显示 SYSTEM 就是没有设置时区啦。

3,现在我们来设置时区。

输入set global time_zone = '+8:00';  注意不要漏掉后面的分号),回车,如图:

可以试一下

如果还是不行,就尝试一下把数据库驱动版本修改一下:

如果还是不行,那只能自求多福;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值