JHipster 基础使用

认识JHipster

JHipster又称Java Hipster,是一个Java代码脚手架,hipster 的意思是时髦的 意思是最时髦的Java解决方案
他的主要核心是Spring Boot,还有Anaglar React 热门的前端框架,是Spring Boot开发的最佳实践,同时也支持Spring Cloud

JHipster 技术栈

前端

单页面程序

  • Angular 5 or React
  • Bootstrap响应式布局
  • HTML5 模板
  • 兼容ie11和现代游览器
  • 国际化支持
  • scss
  • 支持 Spring WebSocket

开发工具

  • 支持yarn 安装依赖
  • 支持webpack 开发
  • 支持JestProtractor 测试框架

同时也支持后端Thymeleaf渲染

后端

  • Spring Boot 简化配置
  • Maven or Gradle 构建工具, 测试并运行应用
  • spring profiles 开发环境和生产环境 (Maven and Gradle)
  • Spring Security 安全管理框架
  • Spring MVC REST + Jackson
  • 可选的 WebSocket 支持 with Spring Websocket
  • Spring Data JPA + Bean Validation
  • Liquibase 数据库版本管理
  • Elasticsearch 搜索引擎
  • MongoDB and Couchbase no-sql 数据库支持
  • Kafka 支持
  • 可选的微服务组件
  • ELK应用监测
  • ehcache hazelcast or Infinispan 缓存
  • logback 日志管理
  • HikariCP 连接池(号称最快的连接池)
  • docker 打包支持
  • 标准 war jar 打包支持
  • 主要的微服务提供AWS, Cloud Foundry, Heroku, Kubernetes, OpenShift, Docker…

安装JHipster

JHipster 依赖node 的Yeoman框架,所以安装之前必须安装node

step 1: 安装yeoman

npm install -g yo

step 2:安装JHipster

npm install -g generator-jhipster

第一个JHipster 项目

step1:打开dos窗口

mkdir myapplication
cd myapplication/
yo jhipster

step2:根据你的需要选择你要的选项
输入完命令后悔出现一大堆的交互问答,如下

What is the base name of your application?(jhipster)
这个是问你项目是啥 输入项目名回车进行下一步

What is your default Java package name?(com.mycompany.myapp)
项目的包名

Which type of authentication would you like to use?(Use arrow keys)
上下箭头选择 根据你的业务详情选择合适的授权方案

Which type of database would you like to use?(Use arrow keys)
选择需要的数据库类型

Which production database would you like to use?(use arrow keys)
具体的数据库产品

which development database would you like to use?
开发是用什么数据库 h2保存在磁盘中不windows下有的问题

Do you want to use Hibernate 2nd level cache?
是否开启二级缓存

Do you want to use a search engine in your application?
是否需要搜索引擎

Do you want to use clustered HTTP sessions?
是否需要使用集群session

Do you want to use WebSocket?
是否需要使用websocket

Would you like to use Maven or Gradle for building the backend?
使用maven还是gradle构建项目

Would you like to use Grunt or Gulp.js for building the frontend?
是否使用glup来构建前端应用

Would you like to use the LibSass stylesheet preprocessor for your css?
是否使用LibSass作为css样式表处理器

Would you like to enable translation support with Angular Translate?
是否使用Anaglar的翻译支持

Which testing frameworks would you like to use?
选择测试框架

所有的问题都回答完就会自动生成项目,然后使用ide导入即可

命令行参数

  • --help - 答应生成器的options
  • --blueprint - 指定使用一种语言. For example jhipster --blueprint kotlin
  • --skip-cache - 不提示缓存在对话中会跳过 (Default: false)
  • --skip-git -不添加只git仓库 (Default: false)
  • --skip-install - 不自动下载依赖(Default: false)
  • --skip-client - 跳过前端代码生成, 只会有后端代码生成 (Default: false)
  • --skip-server - 通过后端代码生成(Default: false)
  • --skip-user-management - 前后台通过用户管理生成 (Default: false)
  • --i18n - 指定i18n的状态 (Default: true)
  • --auth - 当取消服务端时选择授权方式,当跳过服务端时不是必须的
  • --db - 指定数据库,当跳过服务端时不是必须的
  • --with-entities - 覆盖已经生成的实体 (使用 .jhipster 文件夹中的配置) (Default: false)
  • --skip-checks - 通过检查需要的工具 (Default: false)
  • --jhi-prefix - 在服务、组件和状态/路由名称之前添加前缀(Default: jhi)
  • --npm - Use NPM instead of Yarn (Default: false)
  • --experimental - 启用实验功能,这些功能是不稳定的可能随时崩溃

使用JHipster创建实体

当你创建了你的应用,你就会想去创建实体,比如你想创建一个Author 和 Book实体,对于每个实体,你需要以下步骤

  • 在数据库建立表
  • Liquibase 添加一条修改记录
  • 创建 JPA 实体
  • 创建 JPA Repository
  • 创建Spring MVC REST Controller 提供基础的CURD 操作
  • 创建Angular路由,一个组件和一个service
  • 创建一个HTMl页面
  • 集成测试取保各个方面都正常

上面的步骤很多,大部分也都是我们日常做的东西,现在使用JHipster可以自动帮我们生成这些代码

使用子生成器 entity 生成代码

entity 子生成器可以为每一个实体生成前后台的CRUD操作

使用姿势

jhipster entity <entityName> --[options]

options

  • --table-name <table_name> - JHipster默认会根据你的实体名去创建表, 如果你的表名和你的实体名不一样可以使用这个参数
  • --angular-suffix <suffix> - 设置anaglar路由前缀
  • --regenerate - 无提示覆盖已经生成的实体
  • --skip-server - 跳过服务端代码生成
  • --skip-client - 跳过前端代码生成
  • --db - 指定数据库

JHipster UML and JDL Studio

上面的介绍了如何使用命令行创建实体,如果你需要重建大量实体,并且这些实体之间的关系错综复杂,这是你就需要一个图形化工具来操作

  • JHipster UML 使用uml编辑器生成
  • JDL Studio 在线生成工具 使用JHipster定义的domain-specific language JDL.

使用JDL Studio 生成实体

网站打不开的可以戳这里下载传送门 如果不想下载eclipse 和 vs code 的插件库中也有jhipster的插件,idea暂时没有

使用JDL Studio 导出会下载一个 xxx.jh 后缀的文件
然后就可以使用 import-jdl 子生成器生成代码

正确的打开方式

jhipster import-jdl your-jdl-file.jh --[options]

options

  • --json-only 不覆盖已经生成的实体,只在.jhipster 文件夹中生成json文件
  • --force 覆盖已经生成的实体

如果你想用JHipster UML代替 iimport-jdl 生成器 你需要 npm install -g jhipster-uml 然后运行 jhipster-uml yourFileName.jh

JDL介绍

JHipster Domain Language (JDL) 是一种特殊的领域模型语言,这种语言让你可以在一个或多个文件中用简单友好的语法去描述你的实体和实体之间的关系

当你有一个生成的项目或者已经存在的项目(跳过jhipster生成),你可以使用 import-jdl子生成器,通过运行在项目目录下运行 jhipster import-jdl your-jdl-file.jh生成实体,你也能通过 JHipster UML 生成实体并导出为JDL文件

定义实体

entity <entity name> {
  <field name> <type> [<validation>*]
}
  • <entity name> 实体名
  • <field name> 字段名
  • <type> 字段类型
  • <validation> 字段的检验

举个例子

entity A
entity B
entity C 空实体不用带{}

entity D {
  name String required,
  address String required maxlength(100),
  age Integer required min(18)
}

//使用正则表达式校验
entity A {
  myString String required minlength(1) maxlength(42) pattern(/[A-Z]+/)
}

JHipster 会默认加上id字段

实体关系定义

relationship (OneToMany | ManyToOne | OneToOne | ManyToMany) {
  <from entity>[{<relationship name>[(<display field>)]}] to <to entity>[{<relationship name>[(<display field>)]}]
}
  • (OneToMany | ManyToOne| OneToOne | ManyToMany)
  • <from entity> 关系的出发点 source
  • <to entity> 关系的目的地 target
  • <relationship name> 外键字段
  • <display field> 显示字段(default: id),
  • required 是否需要注入的字段

举个例子

entity Book
entity Author {
  name String required
}

relationship OneToMany {
  Author{book} to Book{writer(name) required}
}

entity A
entity B
entity C
entity D

relationship OneToOne {
  A{b} to B{a},
  B{c} to C
}
relationship ManyToMany {
  A{d} to D{a},
  C{d} to D{c}
}

entity A {
  name String required
}
entity B


relationship OneToOne {
  A{b} to B{a(name)}
}

枚举

在JDL中创建枚举

 enum Language {
    FRENCH, ENGLISH, SPANISH
  }

在实体中使用枚举作为字段类型

entity Book {
    title String required,
    description String,
    language Language
  }

二进制类型定义

JHipster 给出了三种二进制数据类型

  • AnyBlob or Blob 适用任何二进制类型
  • ImageBlob 图片类型
  • TextBlob 文本类型

定义操作

JDL可以定义实体的分页或DTO等操作
格式
<option> <ENTITIES | * | all> with <option>

可用的操作

  • dto (mapstruct)
  • service (serviceClass, serviceImpl)
  • paginate (pager, pagination, infinite-scroll)
  • search (elasticsearch)
  • microservice (custom value)
  • angularSuffix (custom value)

其他操作
<OPTION> <ENTITIES | * | all> except? <ENTITIES>

可用的操作

  • skipClient
  • skipServer
  • noFluentMethod
  • filter
entity A {
  name String required
}
entity B
entity C

dto A, B with mapstruct //生成dto

paginate A with infinite-scroll //无限滚动
paginate B with pagination 
paginate C with pager  // pager is only available in AngularJS

service A with serviceClass
service C with serviceImpl

service option

entity A
entity B
entity C

service B with serviceClass //不带service接口的
service C with serviceImpl  //带service接口的

使用 *all匹配所有, *all是等价的

entity A
entity B
...
entity Z

dto * with mapstruct except A
service all with serviceImpl except A, B, C
paginate C with pagination

skip option

entity A
entity B
entity C

skipClient for A
skipServer for B
angularSuffix * with mySuperEntities 路由前缀

entity option

entity A // A 默认是表名
entity B (table_name) // table_name指定表名

注释 & Javadoc

/**
 * Class comments.
 * @author The JHipster team.
 */
entity MyEntity { // another form of comment
  /** A required attribute */
  myField String required,
  mySecondField String // another form of comment
}

/**
 * Second entity.
 */
entity MySecondEntity {}

relationship OneToMany {
  /** This is possible too! */
  MyEntity{mySecondEntity}
  to
  /**
   * And this too!
   */
  MySecondEntity{myEntity}
}

Constants 常量

DEFAULT_MIN_LENGTH = 1
DEFAULT_MAX_LENGTH = 42
DEFAULT_MIN_BYTES = 20
DEFAULT_MAX_BYTES = 40
DEFAULT_MIN = 0
DEFAULT_MAX = 41

entity A {
  name String minlength(DEFAULT_MIN_LENGTH) maxlength(DEFAULT_MAX_LENGTH)
  content TextBlob minbytes(DEFAULT_MIN_BYTES) maxbytes(DEFAULT_MAX_BYTES)
  count Integer min(DEFAULT_MIN) max(DEFAULT_MAX)
}

各个数据库可用的数据类型

SQL|MongoDB|Cassandra|Validations
--|--|--
String|String|String|required, minlength, maxlength, pattern
Integer|Integer|Integer|required, min, max
Long|Long|Long|required, min, max
BigDecimal|BigDecimal|BigDecimal|required, min, max
Float|Float|Float|required, min, max
Double|Double|Double|required, min, max
Enum|Enum||required
Boolean|Boolean|Boolean|required
LocalDate|LocalDate||required
|||Date|required
ZonedDateTime|ZonedDateTime||required
|||UUID|required
Blob|Blob||required, minbytes, maxbytes
AnyBlob|AnyBlob||required, minbytes, maxbytes
ImageBlob|ImageBlob||required, minbytes, maxbytes
TextBlob|TextBlob| |required, minbytes, maxbytes
Instant|Instant|Instant|required

创建Spring 控制器

语法

jhipster spring-controller Foo

回答命令行的问题选择需要的方法

创建Spring service

语法

jhipster spring-service Foo

查询懒加载需要加@Transactional注解

升级应用

当一个新的JHipster 版本出来是,你可以使用子生成器 upgrade 来升级你的应用
这样就可以使用JHipster的最新功能并且能修复一些bug

语法

cd myapp/
jhipster upgrade

options

  • --verbose 日志中打印升级详情
  • --target-version=4.2.0 升级至指定版本
  • --force 强制更新

社区讨论www.youngboy.vip

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan阅读 4,128评论 2 7
  • 原文链接:https://docs.spring.io/spring-boot/docs/1.4.x/refere...
    pseudo_niaonao阅读 4,677评论 0 9
  • 今天现代发动机的件都回来了 先给洗干净了开始装 全都是按原来的东西给装回去的 自己还捅了3个活塞 开始不知道还怎么...
    京心达侯天祥阅读 111评论 0 0
  • 坟墓,遗照,故事,以及名和姓是否会在死后的某个不经意的夜悄然消逝。不掀起这个世界的一片细小的波澜,不惊动某...
    淘汲阅读 140评论 0 1