1. 通过数据库动态生成自己想要生成的各种模板,需要了解grovery。

  2. view -> Tool Windows -> Database

  1. + -> Data source -> MySQL

  2. 配置数据库信息

  3. 建立存放实体的包

  4. 导入必要maven依赖

  <!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<!--jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
  1. 在database视图区域任意地方右键,然后Scripted Extensions -> Go to Scripts Directory

  2. 复制下面的文件到6中跳转的文件夹中

  • Generate POJOs.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 config = [
    impSerializable : true,
    extendBaseEntity : false,
    extendBaseService: true ]
    baseEntityPackage = "com.hhsj.base.BaseEntity"
    baseServicePackage = "com.hhsj.base.BaseService"
    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 "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 ""
    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 "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 "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 "package ${basePackage}.repository;"
    out.println ""
    out.println "import ${basePackage}.entity.$entityName;"
    out.println "import org.springframework.data.jpa.repository.JpaRepository;"
    out.println ""
    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 "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 "@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]
    }

    生成模板



spring data jpa 代码生成!!(精华帖)的更多相关文章

  1. Spring data jpa 使用技巧记录

    软件152 尹以操 最近在用Springboot 以及Spring data jpa  ,使用jpa可以让我更方便的操作数据库,特开此帖记录使用jpa的一些小技巧. 一.使用spring data j ...

  2. Spring Data Jpa:分页、Specification、Criteria

    分页的主要接口与类 PagingAndSortingRepository 继承自 CrudRepository 接口,提供了排序以及分页查询能力,提供了两个方法 Iterable<T> f ...

  3. Spring Data JPA系列5:让IDEA自动帮你写JPA实体定义代码

    大家好,又见面了. 这是本系列的最后一篇文档啦,先来回顾下前面4篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你 ...

  4. 快速搭建springmvc+spring data jpa工程

    一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...

  5. spring boot(五):spring data jpa的使用

    在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...

  6. 转:使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  7. 深入浅出学Spring Data JPA

    第一章:Spring Data JPA入门 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map ...

  8. spring data jpa 调用存储过程

    网上这方面的例子不是很多,研究了一下,列出几个调用的方法. 假如我们有一个mysql的存储过程 CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1in ...

  9. Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题

    开新坑 开新坑了(笑)....公司项目使用的是Spring Data JPA做持久化框架....学习了一段时间以后发现了一点值得注意的小问题.....与大家分享 主要是针对1:N单向关联产生的一系列问 ...

随机推荐

  1. 数据可视化之powerBI基础(一) 如何查看PowerBI图表背后的数据

    https://zhuanlan.zhihu.com/p/64405494 图表很直观,但有时候我们不仅想看图,也想更进一步查看生成该图表的明细数据,在PowerBI中有三种方式. (一)在图表上单击 ...

  2. Flask 基础组件(一):基本使用

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  3. np.nan is an invalid document, expected byte or unicode string.

    ValueError Traceback (most recent call last) <ipython-input-12-1dc462ae8893> in <module> ...

  4. SQL中的多表联查(SELECT DISTINCT 语句)

    前言:(在表中,可能会包含重复值.这并不成问题,不过,有时你也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值.) 如果不加DISTINCT 的话,主表本来 ...

  5. C# 接口与抽象类的区别? 情景下使用接口,什么情景下使用抽象类?

    接口与抽象类的区别: 接口支持多继承:抽象类不能实现多继承. 接口可以用于支持回调:抽象类不能实现回调,因为继承不支持. 接口只包含方法.属性.索引器.事件的签名,但不能定义字段和包含实现的方法:抽象 ...

  6. ajax配合art-template模板引擎的使用

    最近才接触js的模板引擎听说相比以前使用的js foreach加载后台返回的json数据简便很多而且效率方面也很不错.今天自己玩了一下 后台使用的是.net mvc,数据库脚本就不提供了,返回的Jso ...

  7. 金三银四,资深HR给面试者的十大建议

    一.提前复习好你的专业知识 专业知识是最为重要的一点,拥有了坚实的专业基础,你才能迈向成功的彼岸. 因此,面试之前,一定一定要复习好专业知识.对自己学过的知识,要做一个概括,放在脑海中.茶余饭后,复习 ...

  8. p72_电子邮件

    一.电子邮件格式 信封 abcd@xx.com 内容 2.1 首部(To, Subject)-> (From,To,Subject,Date) 2.2 主体 二.电子邮件组成结构 三.SMTP ...

  9. OpenLDAP 2.4.44 安装部署避坑指南

    写在前面: 有关openLDAP的部署文档在网上随意能找到很多,但是最近用到才发现网上的教程多数是旧版的用法,例如"/etc/openldap/slapd.conf “早已弃用,更有甚者直接 ...

  10. SparkCore

    一.概述 1,定义 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象.代码中是一个抽象类,它代表一个不可变.可分区.里面的元素可 ...