✨[docs feat]移除了开发工具的部分内容
开发工具这部分访问量比较小,和整体内容出入比较大,所以移除了,会统一搭建一个站点放相关的文章。
118
README.md
@ -1,6 +1,7 @@
|
||||
> [JavaGuide 官方知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)来啦!!!如果你需要专属面试小册/一对一交流/简历修改/专属求职指南/学习打卡,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc) (一定要确定自己真的需要再加入,一定要看完详细介绍之后再加我)。
|
||||
|
||||
<div align="center">
|
||||
|
||||
<p>
|
||||
<a href="https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc">
|
||||
<img src="./media/sponsor/xingqiu.png" style="margin: 0 auto; width: 850px;" />
|
||||
@ -17,8 +18,8 @@
|
||||
<img src="https://img.shields.io/github/forks/Snailclimb/JavaGuide" alt="forks" />
|
||||
<img src="https://img.shields.io/github/issues/Snailclimb/JavaGuide" alt="issues" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
> 1. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试进阶指北 》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) (质量很高,专为面试打造,配合 JavaGuide 食用)。
|
||||
> 1. **知识星球** :专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 [JavaGuide 知识星球](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)(点击链接即可查看星球的详细介绍,一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我)。
|
||||
@ -26,15 +27,15 @@
|
||||
|
||||
推荐你通过在线阅读网站进行阅读,体验更好,速度更快!
|
||||
|
||||
- [JavaGuide 在线阅读网站(新版,推荐👍)](https://javaguide.cn/)
|
||||
- [JavaGuide 在线阅读版(老版)](https://snailclimb.gitee.io/javaguide/#/)
|
||||
* [JavaGuide 在线阅读网站(新版,推荐👍)](https://javaguide.cn/)
|
||||
* [JavaGuide 在线阅读版(老版)](https://snailclimb.gitee.io/javaguide/#/)
|
||||
|
||||
你可能需要:
|
||||
|
||||
- [项目介绍](./docs/javaguide/intro)
|
||||
- [贡献指南](./docs/javaguide/contribution-guideline)
|
||||
- [常见问题](./docs/javaguide/faq)
|
||||
- [项目代办](./docs/javaguide/todo)
|
||||
* [项目介绍](./docs/javaguide/intro)
|
||||
* [贡献指南](./docs/javaguide/contribution-guideline)
|
||||
* [常见问题](./docs/javaguide/faq)
|
||||
* [项目代办](./docs/javaguide/todo)
|
||||
|
||||
## Java
|
||||
|
||||
@ -42,18 +43,18 @@
|
||||
|
||||
**知识点/面试题** : (必看:+1: ):
|
||||
|
||||
- [Java 基础常见知识点&面试题总结(上)](docs/java/basis/java-basic-questions-01.md)
|
||||
- [Java 基础常见知识点&面试题总结(中)](docs/java/basis/java-basic-questions-02.md)
|
||||
- [Java 基础常见知识点&面试题总结(下)](docs/java/basis/java-basic-questions-03.md)
|
||||
* [Java 基础常见知识点&面试题总结(上)](docs/java/basis/java-basic-questions-01.md)
|
||||
* [Java 基础常见知识点&面试题总结(中)](docs/java/basis/java-basic-questions-02.md)
|
||||
* [Java 基础常见知识点&面试题总结(下)](docs/java/basis/java-basic-questions-03.md)
|
||||
|
||||
**重要知识点详解** :
|
||||
|
||||
- [为什么 Java 中只有值传递?](docs/java/basis/why-there-only-value-passing-in-java.md)
|
||||
- [什么是反射机制?反射机制的应用场景有哪些?](docs/java/basis/reflection.md)
|
||||
- [代理模式详解:静态代理+JDK/CGLIB 动态代理实战](docs/java/basis/proxy.md)
|
||||
- [常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?](docs/java/basis/io.md)
|
||||
- [BigDecimal解决浮点数运算精度丢失问题](docs/java/basis/bigdecimal.md)
|
||||
- **[泛型连环炮](docs/java/basis/generics.md)**
|
||||
* [为什么 Java 中只有值传递?](docs/java/basis/why-there-only-value-passing-in-java.md)
|
||||
* [什么是反射机制?反射机制的应用场景有哪些?](docs/java/basis/reflection.md)
|
||||
* [代理模式详解:静态代理+JDK/CGLIB 动态代理实战](docs/java/basis/proxy.md)
|
||||
* [常见的 IO 模型有哪些?Java 中的 BIO、NIO、AIO 有啥区别?](docs/java/basis/io.md)
|
||||
* [BigDecimal解决浮点数运算精度丢失问题](docs/java/basis/bigdecimal.md)
|
||||
* **[泛型连环炮](docs/java/basis/generics.md)**
|
||||
|
||||
### 集合
|
||||
|
||||
@ -65,9 +66,9 @@
|
||||
|
||||
**源码分析** :
|
||||
|
||||
- [ArrayList 源码+扩容机制分析](docs/java/collection/arraylist-source-code.md)
|
||||
- [HashMap(JDK1.8)源码+底层数据结构分析](docs/java/collection/hashmap-source-code.md)
|
||||
- [ConcurrentHashMap 源码+底层数据结构分析](docs/java/collection/concurrent-hash-map-source-code.md)
|
||||
* [ArrayList 源码+扩容机制分析](docs/java/collection/arraylist-source-code.md)
|
||||
* [HashMap(JDK1.8)源码+底层数据结构分析](docs/java/collection/hashmap-source-code.md)
|
||||
* [ConcurrentHashMap 源码+底层数据结构分析](docs/java/collection/concurrent-hash-map-source-code.md)
|
||||
|
||||
### 并发
|
||||
|
||||
@ -142,14 +143,14 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
|
||||
|
||||
算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的:
|
||||
|
||||
- [算法学习书籍+资源推荐](https://www.zhihu.com/question/323359308/answer/1545320858) 。
|
||||
- [如何刷Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374)
|
||||
* [算法学习书籍+资源推荐](https://www.zhihu.com/question/323359308/answer/1545320858) 。
|
||||
* [如何刷Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374)
|
||||
|
||||
**常见算法问题总结** :
|
||||
|
||||
- [几道常见的字符串算法题总结 ](docs/cs-basics/algorithms/string-algorithm-problems.md)
|
||||
- [几道常见的链表算法题总结 ](docs/cs-basics/algorithms/linkedlist-algorithm-problems.md)
|
||||
- [剑指 offer 部分编程题](docs/cs-basics/algorithms/the-sword-refers-to-offer.md)
|
||||
* [几道常见的字符串算法题总结 ](docs/cs-basics/algorithms/string-algorithm-problems.md)
|
||||
* [几道常见的链表算法题总结 ](docs/cs-basics/algorithms/linkedlist-algorithm-problems.md)
|
||||
* [剑指 offer 部分编程题](docs/cs-basics/algorithms/the-sword-refers-to-offer.md)
|
||||
|
||||
另外,[GeeksforGeeks]( https://www.geeksforgeeks.org/fundamentals-of-algorithms/) 这个网站总结了常见的算法 ,比较全面系统。
|
||||
|
||||
@ -183,6 +184,18 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
|
||||
|
||||
用于提高搜索效率,功能和浏览器搜索引擎类似。比较常见的搜索引擎是 Elasticsearch(推荐) 和 Solr。
|
||||
|
||||
## 开发工具
|
||||
|
||||
### Docker
|
||||
|
||||
* [Docker 基本概念解读](./docs/tools/docker/docker-intro.md)
|
||||
* [Docker从入门到上手干事](./docs/tools/docker/docker-in-action.md)
|
||||
|
||||
### Git
|
||||
|
||||
* [Git 入门](./docs/tools/git/git-intro.md)
|
||||
* [Github 小技巧](./docs/tools/git/github-tips.md)
|
||||
|
||||
## 系统设计
|
||||
|
||||
### 系统设计必备基础
|
||||
@ -231,11 +244,11 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
|
||||
|
||||
**[《认证授权基础》](docs/system-design/security/basis-of-authority-certification.md)** 这篇文章中我会介绍认证授权常见概念: **Authentication**, **Authorization** 以及 **Cookie**、**Session**、Token、**OAuth 2**、**SSO** 。如果你不清楚这些概念的话,建议好好阅读一下这篇文章。
|
||||
|
||||
- **JWT** :JWT(JSON Web Token)是一种身份认证的方式,JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。相关阅读:
|
||||
- [JWT 优缺点分析以及常见问题解决方案](docs/system-design/security/advantages&disadvantages-of-jwt.md)
|
||||
- [适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide)
|
||||
* **JWT** :JWT(JSON Web Token)是一种身份认证的方式,JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。相关阅读:
|
||||
+ [JWT 优缺点分析以及常见问题解决方案](docs/system-design/security/advantages&disadvantages-of-jwt.md)
|
||||
+ [适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide)
|
||||
|
||||
- **SSO(单点登录)** :**SSO(Single Sign On)** 即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东家电等子系统。相关阅读:[**SSO 单点登录看这篇就够了!**](docs/system-design/security/sso-intro.md)
|
||||
* **SSO(单点登录)** :**SSO(Single Sign On)** 即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东家电等子系统。相关阅读:[**SSO 单点登录看这篇就够了!**](docs/system-design/security/sso-intro.md)
|
||||
|
||||
#### 数据脱敏
|
||||
|
||||
@ -267,8 +280,8 @@ CAP 也就是 Consistency(一致性)、Availability(可用性)、Partiti
|
||||
|
||||
相关阅读:
|
||||
|
||||
- [Paxos 算法解读](docs/distributed-system/theorem&algorithm&protocol/paxos-algorithm.md)
|
||||
- [Raft 算法解读](docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md)
|
||||
* [Paxos 算法解读](docs/distributed-system/theorem&algorithm&protocol/paxos-algorithm.md)
|
||||
* [Raft 算法解读](docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md)
|
||||
|
||||
### RPC
|
||||
|
||||
@ -276,8 +289,8 @@ RPC 让调用远程服务调用像调用本地方法那样简单。
|
||||
|
||||
Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读:
|
||||
|
||||
- [Dubbo 常见问题总结](docs/distributed-system/rpc/dubbo.md)
|
||||
- [服务之间的调用为啥不直接用 HTTP 而用 RPC?](docs/distributed-system/rpc/why-use-rpc.md)
|
||||
* [Dubbo 常见问题总结](docs/distributed-system/rpc/dubbo.md)
|
||||
* [服务之间的调用为啥不直接用 HTTP 而用 RPC?](docs/distributed-system/rpc/why-use-rpc.md)
|
||||
|
||||
### API 网关
|
||||
|
||||
@ -285,8 +298,8 @@ Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读:
|
||||
|
||||
相关阅读:
|
||||
|
||||
- [为什么要网关?你知道有哪些常见的网关系统?](docs/distributed-system/api-gateway.md)
|
||||
- [百亿规模API网关服务Shepherd的设计与实现](https://tech.meituan.com/2021/05/20/shepherd-api-gateway.html)
|
||||
* [为什么要网关?你知道有哪些常见的网关系统?](docs/distributed-system/api-gateway.md)
|
||||
* [百亿规模API网关服务Shepherd的设计与实现](https://tech.meituan.com/2021/05/20/shepherd-api-gateway.html)
|
||||
|
||||
### 分布式 id
|
||||
|
||||
@ -384,43 +397,43 @@ Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读:
|
||||
|
||||
**灾备** = 容灾+备份。
|
||||
|
||||
- **备份** : 将系统所产生的的所有重要数据多备份几份。
|
||||
- **容灾** : 在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。
|
||||
* **备份** : 将系统所产生的的所有重要数据多备份几份。
|
||||
* **容灾** : 在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。
|
||||
|
||||
**异地多活** 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。
|
||||
|
||||
相关阅读:
|
||||
|
||||
- [搞懂异地多活,看这篇就够了](https://mp.weixin.qq.com/s/T6mMDdtTfBuIiEowCpqu6Q)
|
||||
- [四步构建异地多活](https://mp.weixin.qq.com/s/hMD-IS__4JE5_nQhYPYSTg)
|
||||
- [《从零开始学架构》— 28 | 业务高可用的保障:异地多活架构](http://gk.link/a/10pKZ)
|
||||
* [搞懂异地多活,看这篇就够了](https://mp.weixin.qq.com/s/T6mMDdtTfBuIiEowCpqu6Q)
|
||||
* [四步构建异地多活](https://mp.weixin.qq.com/s/hMD-IS__4JE5_nQhYPYSTg)
|
||||
* [《从零开始学架构》— 28 | 业务高可用的保障:异地多活架构](http://gk.link/a/10pKZ)
|
||||
|
||||
## 开发工具
|
||||
|
||||
### 数据库
|
||||
|
||||
- [CHINER: 干掉 PowerDesigner,这个国产数据库建模工具很强!](./docs/tools/database/CHINER.md)
|
||||
- [DBeaver:开源数据库管理工具。](./docs/tools/database/DBeaver.md)
|
||||
- [screw:一键生成数据库文档,堪称数据库界的Swagger](./docs/tools/database/screw.md)
|
||||
- [DataGrip:IDEA官方的这个数据库管理神器真香!](./docs/tools/database/datagrip.md)
|
||||
* [CHINER: 干掉 PowerDesigner,这个国产数据库建模工具很强!](./docs/tools/database/CHINER.md)
|
||||
* [DBeaver: 开源数据库管理工具。](./docs/tools/database/DBeaver.md)
|
||||
* [screw: 一键生成数据库文档,堪称数据库界的Swagger](./docs/tools/database/screw.md)
|
||||
* [DataGrip: IDEA官方的这个数据库管理神器真香!](./docs/tools/database/datagrip.md)
|
||||
|
||||
### Git
|
||||
|
||||
- [Git 入门](./docs/tools/git/git-intro.md)
|
||||
- [Github 小技巧](./docs/tools/git/git-intro.md)
|
||||
* [Git 入门](./docs/tools/git/git-intro.md)
|
||||
* [Github 小技巧](./docs/tools/git/git-intro.md)
|
||||
|
||||
### Docker
|
||||
|
||||
- [Docker 基本概念解读](./docs/tools/docker/docker-intro.md)
|
||||
- [Docker从入门到上手干事](./docs/tools/docker/docker-in-action.md)
|
||||
* [Docker 基本概念解读](./docs/tools/docker/docker-intro.md)
|
||||
* [Docker从入门到上手干事](./docs/tools/docker/docker-in-action.md)
|
||||
|
||||
## 关于作者
|
||||
|
||||
- [个人介绍 Q&A](https://javaguide.cn/about-the-author/)
|
||||
- [我曾经也是网瘾少年](https://javaguide.cn/about-the-author/internet-addiction-teenager/)
|
||||
- [入职培训一个月后的感受](https://javaguide.cn/about-the-author/feelings-after-one-month-of-induction-training/)
|
||||
- [从毕业到入职半年的感受](https://javaguide.cn/about-the-author/feelings-of-half-a-year-from-graduation-to-entry/)
|
||||
- [某培训机构盗我文章做成视频还上了B站热门](https://javaguide.cn/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular/)
|
||||
* [个人介绍 Q&A](https://javaguide.cn/about-the-author/)
|
||||
* [我曾经也是网瘾少年](https://javaguide.cn/about-the-author/internet-addiction-teenager/)
|
||||
* [入职培训一个月后的感受](https://javaguide.cn/about-the-author/feelings-after-one-month-of-induction-training/)
|
||||
* [从毕业到入职半年的感受](https://javaguide.cn/about-the-author/feelings-of-half-a-year-from-graduation-to-entry/)
|
||||
* [某培训机构盗我文章做成视频还上了B站热门](https://javaguide.cn/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular/)
|
||||
|
||||
## 公众号
|
||||
|
||||
@ -433,4 +446,3 @@ Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读:
|
||||

|
||||
|
||||

|
||||
|
||||
|
@ -10,23 +10,6 @@ module.exports = defineHopeConfig({
|
||||
// 是否开启默认预加载 js
|
||||
shouldPrefetch: (file, type) => false,
|
||||
head: [
|
||||
// 百度站点验证
|
||||
["meta", { name: "baidu-site-verification", content: "code-IZvTs9l2OK" }],
|
||||
[
|
||||
"script",
|
||||
{ src: "https://cdn.jsdelivr.net/npm/react/umd/react.production.min.js" },
|
||||
],
|
||||
[
|
||||
"script",
|
||||
{
|
||||
src: "https://cdn.jsdelivr.net/npm/react-dom/umd/react-dom.production.min.js",
|
||||
},
|
||||
],
|
||||
["script", { src: "https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js" }],
|
||||
[
|
||||
"script",
|
||||
{ src: "https://cdn.jsdelivr.net/npm/@babel/standalone/babel.min.js" },
|
||||
],
|
||||
// 添加百度统计
|
||||
[
|
||||
"script", {},
|
||||
|
@ -12,17 +12,5 @@ export const navbarConfig = defineNavbarConfig([
|
||||
icon: "recommend",
|
||||
link: "https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc",
|
||||
},
|
||||
{
|
||||
text: "开发工具",
|
||||
icon: "Tools",
|
||||
link: "/tools/",
|
||||
children: [
|
||||
{ text: "Java", icon: "java", link: "/tools/java/jadx/" },
|
||||
{ text: "Database", icon: "database", link: "/tools/database/chiner/" },
|
||||
{ text: "Git", icon: "git", link: "/tools/git/git-intro/" },
|
||||
{ text: "Docker", icon: "docker1", link: "/tools/docker/docker-intro/" },
|
||||
{ text: "IntelliJ IDEA", icon: "intellijidea", link: "/idea-tutorial/" },
|
||||
],
|
||||
},
|
||||
{ text: "关于作者", icon: "zuozhe", link: "/about-the-author/" },
|
||||
]);
|
||||
|
@ -25,36 +25,6 @@ export const sidebarConfig = defineSidebarConfig({
|
||||
],
|
||||
},
|
||||
],
|
||||
"/tools/": [
|
||||
{
|
||||
text: "Java",
|
||||
icon: "java",
|
||||
prefix: "java/",
|
||||
collapsable: false,
|
||||
children: ["jadx"],
|
||||
},
|
||||
{
|
||||
text: "Database",
|
||||
icon: "database",
|
||||
prefix: "database/",
|
||||
collapsable: false,
|
||||
children: ["chiner", "dbeaver", "screw", "datagrip"],
|
||||
},
|
||||
{
|
||||
text: "Git",
|
||||
icon: "git",
|
||||
prefix: "git/",
|
||||
collapsable: false,
|
||||
children: ["git-intro", "github-tips"],
|
||||
},
|
||||
{
|
||||
text: "Docker",
|
||||
icon: "docker1",
|
||||
prefix: "docker/",
|
||||
collapsable: false,
|
||||
children: ["docker-intro", "docker-in-action"],
|
||||
},
|
||||
],
|
||||
"/high-quality-technical-articles/": [
|
||||
{
|
||||
text: "练级攻略",
|
||||
@ -92,44 +62,6 @@ export const sidebarConfig = defineSidebarConfig({
|
||||
children: ["get-into-work-mode-quickly-when-you-join-a-company"],
|
||||
},
|
||||
],
|
||||
"/idea-tutorial/": [
|
||||
{
|
||||
text: "IDEA小技巧",
|
||||
icon: "tips",
|
||||
prefix: "idea-tips/",
|
||||
collapsable: false,
|
||||
children: [
|
||||
"idea-refractor-intro",
|
||||
"idea-plug-in-development-intro",
|
||||
"idea-source-code-reading-skills",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "IDEA插件推荐",
|
||||
icon: "chajian1",
|
||||
collapsable: false,
|
||||
prefix: "idea-plugins/",
|
||||
children: [
|
||||
"shortcut-key",
|
||||
"idea-themes",
|
||||
"improve-code",
|
||||
"interface-beautification",
|
||||
"camel-case",
|
||||
"code-glance",
|
||||
"code-statistic",
|
||||
"git-commit-template",
|
||||
"gson-format",
|
||||
"idea-features-trainer",
|
||||
"jclasslib",
|
||||
"maven-helper",
|
||||
"rest-devlop",
|
||||
"save-actions",
|
||||
"sequence-diagram",
|
||||
"translation",
|
||||
"others",
|
||||
],
|
||||
},
|
||||
],
|
||||
// 必须放在最后面
|
||||
"/": [
|
||||
{
|
||||
@ -340,6 +272,28 @@ export const sidebarConfig = defineSidebarConfig({
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "开发工具",
|
||||
icon: "Tools",
|
||||
prefix: "tools/",
|
||||
collapsable: true,
|
||||
children: [
|
||||
{
|
||||
text: "Git",
|
||||
icon: "git",
|
||||
prefix: "git/",
|
||||
collapsable: true,
|
||||
children: ["git-intro", "github-tips"],
|
||||
},
|
||||
{
|
||||
text: "Docker",
|
||||
icon: "docker1",
|
||||
prefix: "docker/",
|
||||
collapsable: true,
|
||||
children: ["docker-intro", "docker-in-action"],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "系统设计",
|
||||
icon: "xitongsheji",
|
||||
|
@ -42,7 +42,6 @@ export default defineThemeConfig({
|
||||
pwa: {
|
||||
favicon: "/favicon.ico",
|
||||
cachePic: true,
|
||||
cacheHTML: false,
|
||||
apple: {
|
||||
icon: "/assets/icon/apple-icon-152.png",
|
||||
statusBarColor: "black",
|
||||
|
@ -1,26 +0,0 @@
|
||||
---
|
||||
title: Camel Case:命名之间快速切换
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
非常有用!这个插件可以实现包含6种常见命名格式之间的切换。并且,你还可以对转换格式进行相关配置(转换格式) *Preferences / Settings | Camel Case* 。
|
||||
|
||||

|
||||
|
||||
有了这个插件之后,点击你想要修改的变量或者方法名使用快捷键 `shift+option+u(mac)` / `shift+alt+u` 即可实现在多种命名格式之间切换。
|
||||
|
||||

|
||||
|
||||
如果你突然忘记快捷键的话,可以直接在IDEA的菜单栏的 Edit 部分找到。
|
||||
|
||||

|
||||
|
||||
使用这个插件对开发效率提升高吗?拿我之前项目组的情况举个例子:
|
||||
|
||||
我之前有一个项目组的测试名字是驼峰这种形式: `ShouldReturnTicketWhenRobotSaveBagGiven1LockersWith2FreeSpace` 。但是,使用驼峰形式命名测试方法的名字不太明显,一般建议用下划线_的形式: `should_return_ticket_when_robot_save_bag_given_1_lockers_with_2_free_space`
|
||||
|
||||
如果我们不用这个插件,而是手动去一个一个改的话,工作量想必会很大,而且正确率也会因为手工的原因降低。
|
||||
|
@ -1,11 +0,0 @@
|
||||
---
|
||||
title: CodeGlance:代码微型地图
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
CodeGlance提供一个代码的微型地图,当你的类比较多的时候可以帮忙你快速定位到要去的位置。这个插件在我们日常做普通开发的时候用处不大,不过,在你阅读源码的时候还是很有用的,如下图所示:
|
||||
|
||||

|
@ -1,39 +0,0 @@
|
||||
---
|
||||
title: Statistic:项目代码统计
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
编程是一个很奇妙的事情,大部分的我们把大部分时间实际都花在了复制粘贴,而后修改代码上面。
|
||||
|
||||
很多时候,我们并不关注代码质量,只要功能能实现,我才不管一个类的代码有多长、一个方法的代码有多长。
|
||||
|
||||
因此,我们经常会碰到让自己想要骂街的项目,不过,说真的,你自己写的代码也有极大可能被后者 DISS。
|
||||
|
||||
为了快速分析项目情况,判断这个项目是不是一个“垃圾”项目,有一个方法挺简单的。
|
||||
|
||||
那就是**对代码的总行数、单个文件的代码行数、注释行数等信息进行统计。**
|
||||
|
||||
**怎么统计呢?**
|
||||
|
||||
首先想到的是 Excel 。不过,显然太麻烦了。
|
||||
|
||||
**有没有专门用于代码统计的工具呢?**
|
||||
|
||||
基于Perl语言开发的cloc(count lines of code)或许可以满足你的要求。
|
||||
|
||||
**有没有什么更简单的办法呢?**
|
||||
|
||||
如果你使用的是 IDEA 进行开发的话,推荐你可以使用一下 **Statistic** 这个插件。
|
||||
|
||||
有了这个插件之后你可以非常直观地看到你的项目中所有类型的文件的信息比如数量、大小等等,可以帮助你更好地了解你们的项目。
|
||||
|
||||

|
||||
|
||||
你还可以使用它看所有类的总行数、有效代码行数、注释行数、以及有效代码比重等等这些东西。
|
||||
|
||||

|
||||
|
||||
如果,你担心插件过多影响IDEA速度的话,可以只在有代码统计需求的时候开启这个插件,其他时间禁用它就完事了!
|
@ -1,19 +0,0 @@
|
||||
---
|
||||
title: Git Commit Template:提交代码格式规范
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
没有安装这个插件之前,我们使用IDEA提供的Commit功能提交代码是下面这样的:
|
||||
|
||||

|
||||
|
||||
使用了这个插件之后是下面这样的,提供了一个commit信息模板的输入框:
|
||||
|
||||

|
||||
|
||||
完成之后的效果是这样的:
|
||||
|
||||

|
@ -1,34 +0,0 @@
|
||||
---
|
||||
title: GsonFormat:JSON转对象
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
GsonFormat 这个插件可以根据Gson库使用的要求,将JSONObject格式的String 解析成实体类。
|
||||
|
||||
> 说明:2021.x 版本以上的 IDEA 可以使用:GsonFormatPlus
|
||||
|
||||
使用起来非常简单,我们新建一个类,然后在类中使用快捷键 `option + s`(Mac)或`alt + s` (win)调出操作窗口(**必须在类中使用快捷键才有效**),如下图所示。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
这个插件是一个国人几年前写的,不过已经很久没有更新了,可能会因为IDEA的版本问题有一些小Bug。而且,这个插件无法将JSON转换为Kotlin(这个其实无关痛痒,IDEA自带的就有Java转Kotlin的功能)。
|
||||
|
||||

|
||||
|
||||
另外一个与之相似的插件是 **:RoboPOJOGenerator** ,这个插件的更新频率比较快。
|
||||
|
||||
`File-> new -> Generate POJO from JSON`
|
||||
|
||||

|
||||
|
||||
然后将JSON格式的数据粘贴进去之后,配置相关属性之后选择“*Generate*”
|
||||
|
||||

|
||||
|
||||
|
||||
|
@ -1,17 +0,0 @@
|
||||
---
|
||||
title: IDE Features Trainer:IDEA 交互式教程
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
**有了这个插件之后,你可以在 IDE 中以交互方式学习IDEA最常用的快捷方式和最基本功能。** 非常非常非常方便!强烈建议大家安装一个,尤其是刚开始使用IDEA的朋友。
|
||||
|
||||
当我们安装了这个插件之后,你会发现我们的IDEA 编辑器的右边多了一个“**Learn**”的选项,我们点击这个选项就可以看到如下界面。
|
||||
|
||||

|
||||
|
||||
我们选择“Editor Basics”进行,然后就可以看到如下界面,这样你就可以按照指示来练习了!非常不错!
|
||||
|
||||

|
@ -1,99 +0,0 @@
|
||||
---
|
||||
title: IDEA主题推荐
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
经常有小伙伴问我:“Guide哥,你的IDEA 主题怎么这么好看,能推荐一下不?”。就实在有点不耐烦了,才索性写了这篇文章。
|
||||
|
||||
在这篇文章中,我精选了几个比较是和 Java 编码的 IDEA 主题供小伙伴们选择。另外,我自己用的是 One Dark theme 这款。
|
||||
|
||||
**注意:以下主题按照使用人数降序排序。**
|
||||
|
||||
## [Material Theme UI](https://plugins.jetbrains.com/plugin/8006-material-theme-ui)
|
||||
|
||||
**推荐指数** :⭐⭐⭐⭐
|
||||
|
||||
这是 IDEA 中使用人数最多的一款主题。
|
||||
|
||||
当你安装完这个插件之后,你会发现这个主题本身又提供了多种相关的主题供你选择。
|
||||
|
||||

|
||||
|
||||
**Material Deep Ocean** 这款的效果图如下。默认的字体是真的小,小伙伴们需要自行调整一下。
|
||||
|
||||

|
||||
|
||||
## [One Dark theme](https://plugins.jetbrains.com/plugin/11938-one-dark-theme)
|
||||
|
||||
**推荐指数** :⭐⭐⭐⭐⭐
|
||||
|
||||
我比较喜欢的一款(*黄色比较多?*)。 没有花里花哨,简单大气,看起来比较舒服。颜色搭配也很棒,适合编码!
|
||||
|
||||
这款主题的效果图如下。
|
||||
|
||||

|
||||
|
||||
## [Gradianto](https://plugins.jetbrains.com/plugin/12334-gradianto)
|
||||
|
||||
**推荐指数** :⭐⭐⭐⭐⭐
|
||||
|
||||
Gradianto这个主题的目标是在保持页面色彩比较层次分明的情况下,让我们因为代码而疲惫的双眼更加轻松。
|
||||
|
||||
Gradianto附带了自然界的渐变色,看着挺舒服的。另外,这个主题本身也提供了多种相关的主题供你选择。
|
||||
|
||||

|
||||
|
||||
**Gradianto Nature Green** 的效果图如下。
|
||||
|
||||

|
||||
|
||||
## [Dark Purple Theme](https://plugins.jetbrains.com/plugin/12100-dark-purple-theme)
|
||||
|
||||
**推荐指数** :⭐⭐⭐⭐⭐
|
||||
|
||||
这是一款紫色色调的深色主题,喜欢紫色的小伙伴不要错过。
|
||||
|
||||
这个主题的效果图如下。个人觉得整体颜色搭配的是比较不错的,适合编码!
|
||||
|
||||

|
||||
|
||||
## [Hiberbee Theme](https://plugins.jetbrains.com/plugin/12118-hiberbee-theme)
|
||||
|
||||
**推荐指数** :⭐⭐⭐⭐⭐
|
||||
|
||||
一款受到了 Monokai Pro 和 MacOS Mojave启发的主题,是一款色彩层次分明的深色主题。
|
||||
|
||||
这个主题的效果图如下。看着也是非常赞!适合编码!
|
||||
|
||||

|
||||
|
||||
上面推荐的都是偏暗色系的主题,这里我再推荐两款浅色系的主题。
|
||||
|
||||
## [Gray Theme](https://plugins.jetbrains.com/plugin/12103-gray-theme)
|
||||
|
||||
**推荐指数** :⭐⭐⭐
|
||||
|
||||
这是一款对比度比较低的一款浅色主题,不太适合代码阅读,毕竟这款主题是专门为在IntelliJ IDE中使用Markdown而设计的。
|
||||
|
||||
这个主题的效果图如下。
|
||||
|
||||

|
||||
|
||||
## [Roboticket Light Theme](https://plugins.jetbrains.com/plugin/12191-roboticket-light-theme)
|
||||
|
||||
**推荐指数** :⭐⭐⭐
|
||||
|
||||
这是一款对比度比较低的浅色主题,不太适合代码阅读。
|
||||
|
||||
这个主题的效果图如下。
|
||||
|
||||

|
||||
|
||||
## 后记
|
||||
|
||||
我个人还是比较偏爱深色系的主题。
|
||||
|
||||
小伙伴们比较喜欢哪款主题呢?可以在评论区简单聊聊不?如果你还有其他比较喜欢的主题也可以在评论区说出来供大家参考哦!
|
@ -1,140 +0,0 @@
|
||||
---
|
||||
title: IDEA 代码优化插件推荐
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
- 代码优化
|
||||
---
|
||||
|
||||
## Lombok:帮你简化代码
|
||||
|
||||
之前没有推荐这个插件的原因是觉得已经是人手必备的了。如果你要使用 Lombok 的话,不光是要安装这个插件,你的项目也要引入相关的依赖。
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
使用 Lombok 能够帮助我们少写很多代码比如 Getter/Setter、Constructor 等等。
|
||||
|
||||
关于 Lombok 的使用,可以查看这篇文章:[《十分钟搞懂 Java 效率工具 Lombok 使用与原理》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485385&idx=2&sn=a7c3fb4485ffd8c019e5541e9b1580cd&chksm=cea24802f9d5c1144eee0da52cfc0cc5e8ee3590990de3bb642df4d4b2a8cd07f12dd54947b9&token=1667678311&lang=zh_CN#rd)。
|
||||
|
||||
## Codota:代码智能提示
|
||||
|
||||
> 目前的话,Codota 已经更名为 **Tabnine** 。
|
||||
|
||||
我一直在用的一个插件,可以说非常好用了(_我身边的很多大佬平时写代码也会用这个插件_)。
|
||||
|
||||
Codota 这个插件用于智能代码补全,它基于数百万 Java 程序,能够根据程序上下文提示补全代码。相比于 IDEA 自带的智能提示来说,Codota 的提示更加全面一些。
|
||||
|
||||
除了代码补全之外,Codota 还支持代码智能搜索,直接选中对应的类或者方法即可搜索相关的代码示例。
|
||||
|
||||

|
||||
|
||||
如果你觉得 IDEA 插件安装的太多比较卡顿的话,不用担心!Codota 插件还有一个对应的在线网站([https://www.codota.com/code](https://www.codota.com/code)),在这个网站上你可以根据代码关键字搜索相关代码示例,非常不错!
|
||||
|
||||
我在工作中经常会用到,说实话确实给我带来了很大便利,比如我们搜索 `Files.readAllLines`相关的代码,搜索出来的结果如下图所示:
|
||||
|
||||

|
||||
|
||||
另外,Codota 插件的基础功能都是免费的。你的代码也不会被泄露,这点你不用担心。
|
||||
|
||||
类似的插件还有阿里云智能编码插件 **Cosy**(Alibaba Cloud AI Coding Assistant) ,关于 Cosy 的详细介绍,可以看一下我写的 [阿里云 Java 智能编码插件 Cosy 诞生!](https://zhuanlan.zhihu.com/p/464874603)这篇文章。
|
||||
|
||||
## Alibaba Java Code Guidelines:阿里巴巴 Java 代码规范
|
||||
|
||||
阿里巴巴 Java 代码规范,对应的 Github 地址为:[https://github.com/alibaba/p3c](https://github.com/alibaba/p3c) 。非常推荐安装!
|
||||
|
||||
安装完成之后建议将与语言替换成中文,提示更加友好一点。
|
||||
|
||||

|
||||
|
||||
根据官方描述:
|
||||
|
||||
> 目前这个插件实现了开发手册中的的 53 条规则,大部分基于 PMD 实现,其中有 4 条规则基于 IDEA 实现,并且基于 IDEA [Inspection](https://www.jetbrains.com/help/idea/code-inspection.html)实现了实时检测功能。部分规则实现了 Quick Fix 功能,对于可以提供 Quick Fix 但没有提供的,我们会尽快实现,也欢迎有兴趣的同学加入进来一起努力。 目前插件检测有两种模式:实时检测、手动触发。
|
||||
|
||||
上述提到的开发手册也就是在 Java 开发领域赫赫有名的《阿里巴巴 Java 开发手册》。
|
||||
|
||||
### 手动配置检测规则
|
||||
|
||||
你还可以手动配置相关 inspection 规则:
|
||||
|
||||

|
||||
|
||||
### 使用效果
|
||||
|
||||
这个插件会实时检测出我们的代码不匹配它的规则的地方,并且会给出修改建议。比如我们按照下面的方式去创建线程池的话,这个插件就会帮我们检测出来,如下图所示。
|
||||
|
||||

|
||||
|
||||
这个可以对应上 《阿里巴巴 Java 开发手册》 这本书关于创建线程池的方式说明。
|
||||
|
||||

|
||||
|
||||
## CheckStyle: Java 代码格式规范
|
||||
|
||||
### 为何需要 CheckStyle 插件?
|
||||
|
||||
**CheckStyle 几乎是 Java 项目开发必备的一个插件了,它会帮助我们检查 Java 代码的格式是否有问题比如变量命名格式是否有问题、某一行代码的长度是否过长等等。**
|
||||
|
||||
在项目上,**通过项目开发人员自我约束来规范代码格式必然是不靠谱的!** 因此,我们非常需要这样一款工具来帮助我们规范代码格式。
|
||||
|
||||
如果你看过我写的轮子的话,可以发现我为每一个项目都集成了 CheckStyle,并且设置了 **Git Commit 钩子**,保证在提交代码之前代码格式没有问题。
|
||||
|
||||
> **Guide 哥造的轮子**(_代码简洁,结构清晰,欢迎学习,欢迎一起完善_):
|
||||
>
|
||||
> 1. [guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) :A custom RPC framework implemented by Netty+Kyro+Zookeeper.(一款基于 Netty+Kyro+Zookeeper 实现的自定义 RPC 框架-附详细实现过程和相关教程)
|
||||
> 2. [jsoncat](https://github.com/Snailclimb/jsoncat) :仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架
|
||||
>
|
||||
> **Git 钩子**: Git 能在特定的重要动作比如 commit、push 发生时触发自定义脚本。 钩子都被存储在 Git 目录下的 `hooks` 子目录中。 也即绝大部分项目中的 `.git/hooks` 。
|
||||
|
||||
### 如何在 Maven/Gradle 项目中集成 Checksytle?
|
||||
|
||||
一般情况下,我们都是将其集成在项目中,并设置相应的 Git 钩子。网上有相应的介绍文章,这里就不多提了。
|
||||
|
||||
如果你觉得网上的文章不直观的话,可以参考我上面提到了两个轮子:
|
||||
|
||||
1. [guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) :Maven 项目集成 Checksytle。
|
||||
2. [jsoncat](https://github.com/Snailclimb/jsoncat) :Gradle 项目集成 Checksytle。
|
||||
|
||||
如果你在项目中集成了 Checksytle 的话,每次检测会生成一个 HTML 格式的文件告诉你哪里的代码格式不对,这样看着非常不直观。通过 Checksytle 插件的话可以非常直观的将项目中存在格式问题的地方显示出来。
|
||||
|
||||

|
||||
|
||||
如果你只是自己在本地使用,并不想在项目中集成 Checksytle 的话也可以,只需要下载一个 Checksytle 插件就足够了。
|
||||
|
||||
### 如何安装?
|
||||
|
||||
我们直接在 IDEA 的插件市场即可找到这个插件。我这里已经安装好了。
|
||||
|
||||

|
||||
|
||||
安装插件之后重启 IDEA,你会发现就可以在底部菜单栏找到 CheckStyle 了。
|
||||
|
||||

|
||||
|
||||
### 如何自定义检测规则?
|
||||
|
||||
如果你需要自定义代码格式检测规则的话,可以按照如下方式进行配置(你可以导入用于自定义检测规则的`CheckStyle.xml`文件)。
|
||||
|
||||

|
||||
|
||||
### 使用效果
|
||||
|
||||
配置完成之后,按照如下方式使用这个插件!
|
||||
|
||||

|
||||
|
||||
可以非常清晰的看到:CheckStyle 插件已经根据我们自定义的规则将项目中的代码存在格式问题的地方都检测了出来。
|
||||
|
||||
## SonarLint:帮你优化代码
|
||||
|
||||
SonarLint 帮助你发现代码的错误和漏洞,就像是代码拼写检查器一样,SonarLint 可以实时显示出代码的问题,并提供清晰的修复指导,以便你提交代码之前就可以解决它们。
|
||||
|
||||

|
||||
|
||||
并且,很多项目都集成了 SonarQube,SonarLint 可以很方便地与 SonarQube 集成。
|
@ -1,67 +0,0 @@
|
||||
---
|
||||
title: IDEA 界面美化插件推荐
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
- 代码优化
|
||||
---
|
||||
|
||||
|
||||
## Background Image Plus:背景图片
|
||||
|
||||
我这里推荐使用国人 Jack Chu 基于 Background Image Plus 开发的最新版本,适用于 2021.x 版本的 IDEA。
|
||||
|
||||
前面几个下载量比较高的,目前都还未支持 2021.x 版本的 IDEA。
|
||||
|
||||

|
||||
|
||||
通过这个插件,你可以将 IDEA 背景设置为指定的图片,支持随机背景。
|
||||
|
||||
效果图如下:
|
||||
|
||||

|
||||
|
||||
如果你想要设置随机背景的话,可以通过 IDEA 设置页 **Settings** -> **Appearance & Behaviour** -> **Background Image Plus** 自定义设置项,随机显示目录下的图片为背景图。
|
||||
|
||||
## Power Mode II : 代码特效
|
||||
|
||||
使用了这个插件之后,写代码会自带特效,适用于 2021.x 版本的 IDEA。 2021.x 版本之前,可以使用 **activate-power-mode** 。
|
||||
|
||||

|
||||
|
||||
你可以通过 IDEA 设置页 **Settings** -> **Appearance & Behaviour** -> **Power Mode II** 自定义设置项。
|
||||
|
||||

|
||||
|
||||
## Nyan Progress Bar : 进度条美化
|
||||
|
||||
可以让你拥有更加漂亮的进度条。
|
||||
|
||||

|
||||
|
||||
## Grep Console:控制台输出处理
|
||||
|
||||
可以说是必备的一个 IDEA 插件,非常实用!
|
||||
|
||||
这个插件主要的功能有两个:
|
||||
|
||||
**1. 自定义设置控制台输出颜色**
|
||||
|
||||
我们可以在设置中进行相关的配置:
|
||||
|
||||

|
||||
|
||||
配置完成之后的 log warn 的效果对比图如下:
|
||||
|
||||

|
||||
|
||||
**2. 过滤控制台输出**
|
||||
|
||||

|
||||
|
||||
## Rainbow Brackets : 彩虹括号
|
||||
|
||||
使用各种鲜明的颜色来展示你的括号,效果图如下。可以看出代码层级变得更加清晰了,可以说非常实用友好了!
|
||||
|
||||

|
@ -1,93 +0,0 @@
|
||||
---
|
||||
title: jclasslib :一款IDEA字节码查看神器
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
- 字节码
|
||||
---
|
||||
|
||||
由于后面要分享的一篇文章中用到了这篇文章要推荐的一个插件,所以这里分享一下。非常实用!你会爱上它的!
|
||||
|
||||

|
||||
|
||||
**开始推荐 IDEA 字节码查看神器之前,先来回顾一下 Java 字节码是啥。**
|
||||
|
||||
## 何为 Java 字节码?
|
||||
|
||||
Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
|
||||
|
||||
**什么是字节码?采用字节码的好处是什么?**
|
||||
|
||||
> 在 Java 中,JVM 可以理解的代码就叫做`字节码`(即扩展名为 `.class` 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
|
||||
|
||||
**Java 程序从源代码到运行一般有下面 3 步:**
|
||||
|
||||

|
||||
|
||||
## 为什么要查看 Java 字节码?
|
||||
|
||||
我们在平时学习的时候,经常需要查看某个 java 类的字节码文件。查看字节码文件更容易让我们搞懂 java 代码背后的原理比如搞懂 java 中的各种语法糖的本质。
|
||||
|
||||
## 如何查看 Java 字节码?
|
||||
|
||||
如果我们通过命令行来查看某个 class 的字节码文件的话,可以直接通过 `javap` 命令,不过这种方式太原始了,效率十分低,并且看起来不直观。
|
||||
|
||||
下面介绍两种使用 IDEA 查看类对应字节码文件的方式(_`javap`这种方式就不提了_)。
|
||||
|
||||
我们以这段代码作为案例:
|
||||
|
||||
```java
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
Integer i = null;
|
||||
Boolean flag = false;
|
||||
System.out.println(flag ? 0 : i);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
上面这段代码由于使用三目运算符不当导致诡异了 NPE 异常。为了搞清楚事情的原因,我们来看其对应的字节码。
|
||||
|
||||
### 使用 IDEA 自带功能
|
||||
|
||||
我们点击 `View -> Show Bytecode` 即可通过 IDEA 查看某个类对应的字节码文件。
|
||||
|
||||
> 需要注意的是:**查看某个类对应的字节码文件之前确保它已经被编译过。**
|
||||
|
||||

|
||||
|
||||
稍等几秒钟之后,你就可以直观到看到对应的类的字节码内容了。
|
||||
|
||||

|
||||
|
||||
从字节码中可以看出,我圈出来的位置发生了 **拆箱操作** 。
|
||||
|
||||
> - **装箱**:将基本类型用它们对应的引用类型包装起来;
|
||||
> - **拆箱**:将包装类型转换为基本数据类型;
|
||||
|
||||
详细解释下就是:`flag ? 0 : i` 这行代码中,0 是基本数据类型 int,返回数据的时候 i 会被强制拆箱成 int 类型,由于 i 的值是 null,因此就抛出了 NPE 异常。
|
||||
|
||||
```java
|
||||
Integer i = null;
|
||||
Boolean flag = false;
|
||||
System.out.println(flag ? 0 : i);
|
||||
```
|
||||
|
||||
如果,我们把代码中 `flag` 变量的值修改为 true 的话,就不会存在 NPE 问题了,因为会直接返回 0,不会进行拆箱操作。
|
||||
|
||||
### 使用 IDEA 插件 jclasslib(推荐)
|
||||
|
||||
相比于 IDEA 自带的查看类字节的功能,我更推荐 `jclasslib` 这个插件,非常棒!
|
||||
|
||||
**使用 `jclasslib` 不光可以直观地查看某个类对应的字节码文件,还可以查看类的基本信息、常量池、接口、属性、函数等信息。**
|
||||
|
||||

|
||||
|
||||
我们直接在 IDEA 的插件市场即可找到这个插件。我这里已经安装好了。
|
||||
|
||||

|
||||
|
||||
安装完成之后,重启 IDEA。点击`View -> Show Bytecode With jclasslib` 即可通过`jclasslib` 查看某个类对应的字节码文件。
|
||||
|
||||

|
@ -1,19 +0,0 @@
|
||||
---
|
||||
title: Maven Helper:解决 Maven 依赖冲突问题
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
- Maven
|
||||
---
|
||||
|
||||
|
||||
**Maven Helper** 主要用来分析 Maven 项目的相关依赖,可以帮助我们解决 Maven 依赖冲突问题。
|
||||
|
||||

|
||||
|
||||
**何为依赖冲突?**
|
||||
|
||||
说白了就是你的项目使用的 2 个 jar 包引用了同一个依赖 h,并且 h 的版本还不一样,这个时候你的项目就存在两个不同版本的 h。这时 Maven 会依据依赖路径最短优先原则,来决定使用哪个版本的 Jar 包,而另一个无用的 Jar 包则未被使用,这就是所谓的依赖冲突。
|
||||
|
||||
大部分情况下,依赖冲突可能并不会对系统造成什么异常,因为 Maven 始终选择了一个 Jar 包来使用。但是,不排除在某些特定条件下,会出现类似找不到类的异常,所以,只要存在依赖冲突,在我看来,最好还是解决掉,不要给系统留下隐患。
|
@ -1,21 +0,0 @@
|
||||
---
|
||||
title: 其他
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
|
||||
1. **leetcode editor** :提供在线 Leetcode 刷题功能,比较方便我们刷题,不过我试用之后发现有一些小 bug,个人感觉还是直接在网站找题目刷来的痛快一些。
|
||||
2. **A Search with Github** :直接通过 Github搜索相关代码。
|
||||
3. **stackoverflow** : 选中相关内容后单击右键即可快速跳转到 stackoverflow 。
|
||||
4. **CodeStream** :让code review变得更加容易。
|
||||
5. **Code screenshots** :代码片段保存为图片。
|
||||
6. **GitToolBox** :Git工具箱
|
||||
7. **OK, Gradle!** :搜索Java库用于Gradle项目
|
||||
8. **Java Stream Debugger** : Java8 Stream调试器
|
||||
9. **EasyCode** : Easycode 可以直接对数据的表生成entity、controller、service、dao、mapper无需任何编码,简单而强大。更多内容可以查看这篇文章:[《懒人 IDEA 插件插件:EasyCode 一键帮你生成所需代码~》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486205&idx=1&sn=0ff2f87f0d82a1bd9c0c44328ef69435&chksm=cea24536f9d5cc20c6cc7669f0d4167d747fe8b8c05a64546c0162d694aa96044a2862e24b57&token=1862674725&lang=zh_CN#rd)
|
||||
10. **JFormDesigner** :Swing GUI 在线编辑器。
|
||||
11. **VisualVM Launcher** : Java性能分析神器。
|
||||
12. ......
|
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 180 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 309 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 886 KiB |
Before Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 150 KiB |
Before Width: | Height: | Size: 125 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 4.1 MiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 106 KiB |
Before Width: | Height: | Size: 546 KiB |
Before Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 84 KiB |
@ -1,96 +0,0 @@
|
||||
---
|
||||
title: RestfulToolkit:RESTful Web 服务辅助开发工具
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
|
||||
开始推荐这个 IDEA 插件之前,我觉得有必要花一小会时间简单聊聊 **REST** 这个我们经常打交道的概念。
|
||||
|
||||
## REST 相关概念解读
|
||||
|
||||
### 何为 REST?
|
||||
|
||||
REST 即 **REpresentational State Transfer** 的缩写。这个词组的翻译过来就是"**表现层状态转化**"。
|
||||
|
||||
这样理解起来甚是晦涩,实际上 REST 的全称是 **Resource Representational State Transfer** ,直白地翻译过来就是 **“资源”在网络传输中以某种“表现形式”进行“状态转移”** 。
|
||||
|
||||
**有没有感觉很难理解?**
|
||||
|
||||
没关系,看了我对 REST 涉及到的一些概念的解读之后你没准就能理解了!
|
||||
|
||||
- **资源(Resource)** :我们可以把真实的对象数据称为资源。一个资源既可以是一个集合,也可以是单个个体。比如我们的班级 classes 是代表一个集合形式的资源,而特定的 class 代表单个个体资源。每一种资源都有特定的 URI(统一资源定位符)与之对应,如果我们需要获取这个资源,访问这个 URI 就可以了,比如获取特定的班级:`/class/12`。另外,资源也可以包含子资源,比如 `/classes/classId/teachers`:列出某个指定班级的所有老师的信息
|
||||
- **表现形式(Representational)**:"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式比如 json,xml,image,txt 等等叫做它的"表现层/表现形式"。
|
||||
- **状态转移(State Transfer)** :大家第一眼看到这个词语一定会很懵逼?内心 BB:这尼玛是啥啊? **大白话来说 REST 中的状态转移更多地描述的服务器端资源的状态,比如你通过增删改查(通过 HTTP 动词实现)引起资源状态的改变。** (HTTP 协议是一个无状态的,所有的资源状态都保存在服务器端)
|
||||
|
||||
### 何为 RESTful 架构?
|
||||
|
||||
满足 REST 风格的架构设计就可以称为 RESTful 架构:
|
||||
|
||||
1. 每一个 URI 代表一种资源;
|
||||
2. 客户端和服务器之间,传递这种资源的某种表现形式比如 json,xml,image,txt 等等;
|
||||
3. 客户端通过特定的 HTTP 动词,对服务器端资源进行操作,实现"表现层状态转化"。
|
||||
|
||||
### 何为 RESTful Web 服务?
|
||||
|
||||
基于 REST 架构的 Web 服务就被称为 RESTful Web 服务。
|
||||
|
||||
## RESTful Web 服务辅助开发工具
|
||||
|
||||
### 安装
|
||||
|
||||
这个插件的名字叫做 “**RestfulToolkit**” 。我们直接在 IDEA 的插件市场即可找到这个插件。如下图所示。
|
||||
|
||||
> 如果你因为网络问题没办法使用 IDEA 自带的插件市场的话,也可以通过[IDEA 插件市场的官网](https://plugins.jetbrains.com/idea)手动下载安装。
|
||||
|
||||

|
||||
|
||||
### 简单使用
|
||||
|
||||
#### URL 跳转到对应方法
|
||||
|
||||
根据 URL 直接跳转到对应的方法定义 (Windows: `ctrl+\` or `ctrl+alt+n` Mac:`command+\` or `command+alt+n` )并且提供了一个服务的树形可视化显示窗口。 如下图所示。
|
||||
|
||||

|
||||
|
||||
#### 作为 HTTP 请求工具
|
||||
|
||||
这个插件还可以作为一个简单的 http 请求工具来使用。如下图所示。
|
||||
|
||||

|
||||
|
||||
#### 复制生成 URL、复制方法参数...
|
||||
|
||||
这个插件还提供了生成 URL、查询参数、请求体(RequestBody)等功能。
|
||||
|
||||
举个例子。我们选中 `Controller` 中的某个请求对应的方法右击,你会发现多了几个可选项。当你选择`Generate & Copy Full URL`的话,就可以把整个请求的路径直接复制下来。eg:`http://localhost:9333/api/users?pageNum=1&pageSize=1` 。
|
||||
|
||||

|
||||
|
||||
#### 将 Java 类转换为对应的 JSON 格式
|
||||
|
||||
这个插件还为 Java 类上添加了 **Convert to JSON** 功能 。
|
||||
|
||||
我们选中的某个类对应的方法然后右击,你会发现多了几个可选项。
|
||||
|
||||

|
||||
|
||||
当我们选择`Convert to JSON`的话,你会得到如下 json 类型的数据:
|
||||
|
||||
```json
|
||||
{
|
||||
"username": "demoData",
|
||||
"password": "demoData",
|
||||
"rememberMe": true
|
||||
}
|
||||
```
|
||||
|
||||
## 后记
|
||||
|
||||
RESTFulToolkit 原作者不更新了,IDEA.201 及以上版本不再适配。
|
||||
|
||||
因此,国内就有一个大佬参考 RESTFulToolkit 开发了一款类似的插件——RestfulTool(功能较少一些,不过够用了)。
|
||||
|
||||

|
@ -1,23 +0,0 @@
|
||||
---
|
||||
title: Save Actions:优化文件保存
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
|
||||
真必备插件!可以帮助我们在保存文件的时候:
|
||||
|
||||
1. 优化导入;
|
||||
2. 格式化代码;
|
||||
3. 执行一些quick fix
|
||||
4. ......
|
||||
|
||||
这个插件是支持可配置的,我的配置如下:
|
||||
|
||||

|
||||
|
||||
实际使用效果如下:
|
||||
|
||||

|
@ -1,91 +0,0 @@
|
||||
---
|
||||
title: SequenceDiagram:一键可以生成时序图
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
|
||||
|
||||
在平时的学习/工作中,我们会经常面临如下场景:
|
||||
|
||||
1. 阅读别人的代码
|
||||
2. 阅读框架源码
|
||||
3. 阅读自己很久之前写的代码。
|
||||
|
||||
千万不要觉得工作就是单纯写代码,实际工作中,你会发现你的大部分时间实际都花在了阅读和理解已有代码上。
|
||||
|
||||
为了能够更快更清晰地搞清对象之间的调用关系,我经常需要用到序列图。手动画序列图还是很麻烦费时间的,不过 IDEA 提供了一个叫做**SequenceDiagram** 的插件帮助我们解决这个问题。通过 SequenceDiagram 这个插件,我们一键可以生成时序图。
|
||||
|
||||
## 何为序列图?
|
||||
|
||||
网上对于序列图的定义有很多,我觉得都不太好理解,太抽象了。最神奇的是,大部分文章对于序列图的定义竟然都是一模一样,看来大家是充分发挥了写代码的“精髓”啊!
|
||||
|
||||
我还是简单说一说我的理解吧!不过,说实话,我自己对于 Sequence Diagram 也不是很明朗。下面的描述如有问题和需要完善的地方,还请指出。
|
||||
|
||||
> **序列图**(Sequence Diagram),亦称为**循序图**,是一种[UML](https://zh.m.wikipedia.org/wiki/UML)行为图。表示系统执行某个方法/操作(如登录操作)时,对象之间的顺序调用关系。
|
||||
>
|
||||
> 这个顺序调用关系可以这样理解:你需要执行系统中某个对象 a 提供的方法/操作 login(登录),但是这个对象又依赖了对象 b 提供的方法 getUser(获取用户)。因此,这里就有了 a -> b 调用关系之说。
|
||||
|
||||
再举两个例子来说一下!
|
||||
|
||||
下图是微信支付的业务流程时序图。这个图描述了微信支付相关角色(顾客,商家...)在微信支付场景下,基础支付和支付的的顺序调用关系。
|
||||
|
||||

|
||||
|
||||
下图是我写的一个 HTTP 框架中的执行某个方法的序列图。这个图描述了我们在调用 `InterceptorFactory`类的 `loadInterceptors()` 方法的时候,所涉及到的类之间的调用关系。
|
||||
|
||||

|
||||
|
||||
另外,国内一般更喜欢称呼序列图为"时序图"。
|
||||
|
||||
- 如果你按照纯翻译的角度来说, sequence 这个单词并无"时间"的意思,只有序列,顺序等意思,因此也有人说“时序图”的说法是不准确的。
|
||||
- 如果从定义角度来说,时序图这个描述是没问题的。因为 Sequence Diagram 中每条消息的触发时机确实是按照时间顺序执行的。
|
||||
|
||||
我觉得称呼 Sequence Diagram 为时序图或者序列图都是没问题的,不用太纠结。
|
||||
|
||||
## 哪些场景下需要查看类的时序图?
|
||||
|
||||
我们在很多场景下都需要时序图,比如说:
|
||||
|
||||
1. **阅读源码** :阅读源码的时候,你可能需要查看调用目标方法涉及的相关类的调用关系。特别是在代码的调用层级比较多的时候,对于我们理解源码非常有用。(_题外话:实际工作中,大部分时间实际我们都花在了阅读理解已有代码上。_)
|
||||
2. **技术文档编写** :我们在写项目介绍文档的时候,为了让别人更容易理解你的代码,你需要根据核心方法为相关的类生成时序图来展示他们之间的调用关系。
|
||||
3. **梳理业务流程** :当我们的系统业务流程比较复杂的时候,我们可以通过序列图将系统中涉及的重要的角色和对象的之间关系可视化出来。
|
||||
4. ......
|
||||
|
||||
## 如何使用 IDEA 根据类中方法生成时序图?
|
||||
|
||||
**通过 SequenceDiagram 这个插件,我们一键可以生成时序图。**
|
||||
|
||||
并且,你还可以:
|
||||
|
||||
1. 点击时序图中的类/方法即可跳转到对应的地方。
|
||||
2. 从时序图中删除对应的类或者方法。
|
||||
3. 将生成的时序图导出为 PNG 图片格式。
|
||||
|
||||
### 安装
|
||||
|
||||
我们直接在 IDEA 的插件市场即可找到这个插件。我这里已经安装好了。
|
||||
|
||||
> 如果你因为网络问题没办法使用 IDEA 自带的插件市场的话,也可以通过[IDEA 插件市场的官网](https://plugins.jetbrains.com/idea)手动下载安装。
|
||||
|
||||

|
||||
|
||||
### 简单使用
|
||||
|
||||
1. 选中方法名(注意不要选类名),然后点击鼠标右键,选择 **Sequence Diagram** 选项即可!
|
||||
|
||||

|
||||
|
||||
2. 配置生成的序列图的一些基本的参数比如调用深度之后,我们点击 ok 即可!
|
||||
|
||||

|
||||
|
||||
你还可以通过生成的时序图来定位到相关的代码,这对于我们阅读源码的时候尤其有帮助!
|
||||
|
||||

|
||||
|
||||
时序图生成完成之后,你还可以选择将其导出为图片。
|
||||
|
||||

|
@ -1,56 +0,0 @@
|
||||
---
|
||||
title: IDEA 快捷键相关插件
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
|
||||
相信我!下面这两个一定是IDEA必备的插件。
|
||||
|
||||
## Key Promoter X:快捷键提示
|
||||
|
||||
这个插件的功能主要是**在你本可以使用快捷键操作的地方提醒你用快捷键操作。**
|
||||
|
||||
举个例子。我直接点击tab栏下的菜单打开 Version Control(版本控制) 的话,这个插件就会提示你可以用快捷键 `command+9`或者`shift+command+9`打开。如下图所示。
|
||||
|
||||

|
||||
|
||||
除了这个很棒的功能之外,这个插件还有一个功能我觉得非常棒。
|
||||
|
||||
它可以展示出哪些快捷键你忘记使用的次数最多!这样的话,你可以给予你忘记次数最多的那些快捷键更多的关注。
|
||||
|
||||
我忘记最多的快捷键是debug的时候经常使用的 F8(Step Over)。如下图所示。
|
||||
|
||||

|
||||
|
||||
关于快捷键,很多人不愿意去记,觉得单纯靠鼠标就完全够了。
|
||||
|
||||
让我来说的话!我觉得如果你偶尔使用一两次 IDEA 的话,你完全没有必要纠结快捷键。
|
||||
|
||||
但是,如果 IDEA 是你开发的主力,你经常需要使用的话,相信我,掌握常用的一些快捷键真的很重要!
|
||||
|
||||
不说多的,**熟练掌握IDEA的一些最常见的快捷键,你的工作效率至少提升 30 %。**
|
||||
|
||||
**除了工作效率的提升之外,使用快捷键会让我们显得更加专业。**
|
||||
|
||||
你在使用快捷键进行操作的时候,是很帅,很酷啊!但是,当你用 IDEA 给别人演示一些操作的时候,你使用了快捷键的话,别人可能根本不知道你进行了什么快捷键操作。
|
||||
|
||||
**怎么解决这个问题呢?**
|
||||
|
||||
很简单!这个时候就轮到 **Presentation Assistant** 这个插件上场了!
|
||||
|
||||
## Presentation Assistant:快捷键展示
|
||||
|
||||
安装这个插件之后,你使用的快捷键操作都会被可视化地展示出来,非常适合自己在录制视频或者给别人展示代码的时候使用。
|
||||
|
||||
举个例子。我使用快捷键 `command+9`打开 Version Control ,使用了这个插件之后的效果如下图所示。
|
||||
|
||||

|
||||
|
||||
从上图可以很清晰地看到,IDEA 的底部中间的位置将我刚刚所使用的快捷键给展示了出来。
|
||||
|
||||
并且,**这个插件会展示出 Mac 和 Win/Linux 两种不同的版本的快捷键。**
|
||||
|
||||
因此,不论你的操作系统是 Mac 还是 Win/Linux ,这款插件都能满足你的需求。
|
@ -1,28 +0,0 @@
|
||||
---
|
||||
title: Translation:翻译
|
||||
category: IDEA指南
|
||||
tag:
|
||||
- IDEA
|
||||
- IDEA插件
|
||||
---
|
||||
|
||||
|
||||
有了这个插件之后,你再也不用在编码的时候打开浏览器查找某个单词怎么拼写、某句英文注释什么意思了。
|
||||
|
||||
并且,这个插件支持多种翻译源:
|
||||
|
||||
1. Google 翻译
|
||||
2. Youdao 翻译
|
||||
3. Baidu 翻译
|
||||
|
||||
除了翻译功能之外还提供了语音朗读、单词本等实用功能。这个插件的Github地址是:[https://github.com/YiiGuxing/TranslationPlugin](https://github.com/YiiGuxing/TranslationPlugin) (貌似是国人开发的,很赞)。
|
||||
|
||||
**使用方法很简单!选中你要翻译的单词或者句子,使用快捷键 `command+ctrl+u(mac)` / `shift+ctrl+y(win/linux)`** (如果你忘记了快捷的话,鼠标右键操作即可!)
|
||||
|
||||

|
||||
|
||||
**如果需要快速打开翻译框,使用快捷键`command+ctrl+i(mac)`/`ctrl + shift + o(win/linux)`**
|
||||
|
||||

|
||||
|
||||
如果你需要将某个重要的单词添加到生词本的话,只需要点击单词旁边的收藏按钮即可!
|
@ -1,299 +0,0 @@
|
||||
# IDEA 插件开发入门
|
||||
|
||||
我这个人没事就喜欢推荐一些好用的 [IDEA 插件](https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1319419426898329600&__biz=Mzg2OTA0Njk0OA==#wechat_redirect)给大家。这些插件极大程度上提高了我们的生产效率以及编码舒适度。
|
||||
|
||||
**不知道大家有没有想过自己开发一款 IDEA 插件呢?**
|
||||
|
||||
我自己想过,但是没去尝试过。刚好有一位读者想让我写一篇入门 IDEA 开发的文章,所以,我在周末就花了一会时间简单了解一下。
|
||||
|
||||

|
||||
|
||||
不过,**这篇文章只是简单带各位小伙伴入门一下 IDEA 插件开发**,个人精力有限,暂时不会深入探讨太多。如果你已经有 IDEA 插件开发的相关经验的话,这篇文章就可以不用看了,因为会浪费你 3 分钟的时间。
|
||||
|
||||
好的废话不多说!咱们直接开始!
|
||||
|
||||
## 01 新建一个基于 Gradle 的插件项目
|
||||
|
||||
这里我们基于 Gradle 进行插件开发,这也是 IntelliJ 官方的推荐的插件开发解决方案。
|
||||
|
||||
**第一步,选择 Gradle 项目类型并勾选上相应的依赖。**
|
||||
|
||||

|
||||
|
||||
**第二步,填写项目相关的属性比如 GroupId、ArtifactId。**
|
||||
|
||||

|
||||
|
||||
**第三步,静静等待项目下载相关依赖。**
|
||||
|
||||
第一次创建 IDEA 插件项目的话,这一步会比较慢。因为要下载 IDEA 插件开发所需的 SDK 。
|
||||
|
||||
## 02 插件项目结构概览
|
||||
|
||||
新建完成的项目结构如下图所示。
|
||||
|
||||

|
||||
|
||||
这里需要额外注意的是下面这两个配置文件。
|
||||
|
||||
**`plugin.xml` :插件的核心配置文件。通过它可以配置插件名称、插件介绍、插件作者信息、Action 等信息。**
|
||||
|
||||
```xml
|
||||
<idea-plugin>
|
||||
<id>github.javaguide.my-first-idea-plugin</id>
|
||||
<!--插件的名称-->
|
||||
<name>Beauty</name>
|
||||
<!--插件的作者相关信息-->
|
||||
<vendor email="koushuangbwcx@163.com" url="https://github.com/Snailclimb">JavaGuide</vendor>
|
||||
<!--插件的介绍-->
|
||||
<description><![CDATA[
|
||||
Guide哥代码开发的第一款IDEA插件<br>
|
||||
<em>这尼玛是什么垃圾插件!!!</em>
|
||||
]]></description>
|
||||
|
||||
<!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
|
||||
on how to target different products -->
|
||||
<depends>com.intellij.modules.platform</depends>
|
||||
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
<!-- Add your extensions here -->
|
||||
</extensions>
|
||||
|
||||
<actions>
|
||||
<!-- Add your actions here -->
|
||||
</actions>
|
||||
</idea-plugin>
|
||||
```
|
||||
|
||||
**`build.gradle` :项目依赖配置文件。通过它可以配置项目第三方依赖、插件版本、插件版本更新记录等信息。**
|
||||
|
||||
```groovy
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'org.jetbrains.intellij' version '0.6.3'
|
||||
}
|
||||
|
||||
group 'github.javaguide'
|
||||
// 当前插件版本
|
||||
version '1.0-SNAPSHOT'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
// 项目依赖
|
||||
dependencies {
|
||||
testCompile group: 'junit', name: 'junit', version: '4.12'
|
||||
}
|
||||
|
||||
// See https://github.com/JetBrains/gradle-intellij-plugin/
|
||||
// 当前开发该插件的 IDEA 版本
|
||||
intellij {
|
||||
version '2020.1.2'
|
||||
}
|
||||
patchPluginXml {
|
||||
// 版本更新记录
|
||||
changeNotes """
|
||||
Add change notes here.<br>
|
||||
<em>most HTML tags may be used</em>"""
|
||||
}
|
||||
```
|
||||
|
||||
没有开发过 IDEA 插件的小伙伴直接看这两个配置文件内容可能会有点蒙。所以,我专门找了一个 IDEA 插件市场提供的现成插件来说明一下。小伙伴们对照下面这张图来看下面的配置文件内容就非常非常清晰了。
|
||||
|
||||

|
||||
|
||||
这就非常贴心了!如果这都不能让你点赞,我要这文章有何用!
|
||||
|
||||

|
||||
|
||||
## 03 手动创建 Action
|
||||
|
||||
我们可以把 Action 看作是 IDEA 提供的事件响应处理器,通过 Action 我们可以自定义一些事件处理逻辑/动作。比如说你点击某个菜单的时候,我们进行一个展示对话框的操作。
|
||||
|
||||
**第一步,右键`java`目录并选择 new 一个 Action**
|
||||
|
||||
.png>)
|
||||
|
||||
**第二步,配置 Action 相关信息比如展示名称。**
|
||||
|
||||
.png>)
|
||||
|
||||
创建完成之后,我们的 `plugin.xml` 的 `<actions>`节点下会自动生成我们刚刚创建的 Action 信息:
|
||||
|
||||
```xml
|
||||
<actions>
|
||||
<!-- Add your actions here -->
|
||||
<action id="test.hello" class="HelloAction" text="Hello" description="IDEA插件入门">
|
||||
<add-to-group group-id="ToolsMenu" anchor="first"/>
|
||||
</action>
|
||||
</actions>
|
||||
```
|
||||
|
||||
并且 `java` 目录下会生成一个叫做 `HelloAction` 的类。这个类继承了 `AnAction` ,并覆盖了 `actionPerformed()` 方法。这个 `actionPerformed` 方法就好比 JS 中的 `onClick` 方法,会在你点击的时候触发对应的动作。
|
||||
|
||||
我简单对 `actionPerformed` 方法进行了修改,添加了一行代码。这行代码很简单,就是显示 1 个对话框并展示一些信息。
|
||||
|
||||
```java
|
||||
public class HelloAction extends AnAction {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e) {
|
||||
//显示对话框并展示对应的信息
|
||||
Messages.showInfoMessage("素材不够,插件来凑!", "Hello");
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
另外,我们上面也说了,每个动作都会归属到一个 Group 中,这个 Group 可以简单看作 IDEA 中已经存在的菜单。
|
||||
|
||||
举个例子。我上面创建的 Action 的所属 Group 是 **ToolsMenu(Tools)** 。这样的话,我们创建的 Action 所在的位置就在 Tools 这个菜单下。
|
||||
|
||||

|
||||
|
||||
再举个例子。加入我上面创建的 Action 所属的 Group 是**MainMenu** (IDEA 最上方的主菜单栏)下的 **FileMenu(File)** 的话。
|
||||
|
||||
```xml
|
||||
<actions>
|
||||
<!-- Add your actions here -->
|
||||
<action id="test.hello" class="HelloAction" text="Hello" description="IDEA插件入门">
|
||||
<add-to-group group-id="FileMenu" anchor="first"/>
|
||||
</action>
|
||||
</actions>
|
||||
```
|
||||
|
||||
我们创建的 Action 所在的位置就在 File 这个菜单下。
|
||||
|
||||

|
||||
|
||||
## 04 验收成果
|
||||
|
||||
点击 `Gradle -> Tasks -> intellij -> runIde` 就会启动一个默认了这个插件的 IDEA。然后,你可以在这个 IDEA 上实际使用这个插件了。
|
||||
|
||||

|
||||
|
||||
效果如下:
|
||||
|
||||

|
||||
|
||||
我们点击自定义的 Hello Action 的话就会弹出一个对话框并展示出我们自定义的信息。
|
||||
|
||||

|
||||
|
||||
## 05 完善一下
|
||||
|
||||
想要弄点界面花里胡哨一下, 我们还可以通过 Swing 来写一个界面。
|
||||
|
||||
这里我们简单实现一个聊天机器人。代码的话,我是直接参考的我大二刚学 Java 那会写的一个小项目(_当时写的代码实在太烂了!就很菜!_)。
|
||||
|
||||

|
||||
|
||||
首先,你需要在[图灵机器人官网](http://www.tuling123.com/ "图灵机器人官网")申请一个机器人。(_其他机器人也一样,感觉这个图灵机器人没有原来好用了,并且免费调用次数也不多_)
|
||||
|
||||

|
||||
|
||||
然后,简单写一个方法来请求调用机器人。由于代码比较简单,我这里就不放出来了,大家简单看一下效果就好。
|
||||
|
||||

|
||||
|
||||
## 06 打包分发
|
||||
|
||||
插件写好之后,如果我们想把插件分享给小伙伴使用的话要怎么做呢。
|
||||
|
||||
### 首先,我们要打包插件
|
||||
|
||||
执行 Gradle -> Tasks -> intellij -> buildPlugin
|
||||
|
||||
执行完成后,项目中会生成一个 build 文件夹,点击进入后找到 distributions 文件夹,里面会出现一个 .zip 结尾的压缩包,里面打包了插件所需要的依赖、配置文件等。
|
||||
|
||||
### 其次,分发插件
|
||||
|
||||
打开 IDEA,在 Settings -> Plugins -> 点击小齿轮后选择 Install Plugin From Disk
|
||||

|
||||
|
||||
### 最后,提交至官网
|
||||
|
||||
这步并不是必须的,如果你想把你的插件发布到官网上,别人直接可以在 [应用市场](https://plugins.jetbrains.com/) 中搜到你的插件的话可以做这步。
|
||||
|
||||
|
||||
## 07 深入学习
|
||||
|
||||
如果你想要深入学习的 IDEA 插件的话,可以看一下官网文档:[https://jetbrains.org/intellij/sdk/docs/basics/basics.html ](https://jetbrains.org/intellij/sdk/docs/basics/basics.html "https://jetbrains.org/intellij/sdk/docs/basics/basics.html ") 。
|
||||
|
||||
这方面的资料还是比较少的。除了官方文档的话,你还可以简单看看下面这几篇文章:
|
||||
|
||||
- [8 条经验轻松上手 IDEA 插件开发](https://developer.aliyun.com/article/777850?spm=a2c6h.12873581.0.dArticle777850.118d6446r096V4&groupCode=alitech "8 条经验轻松上手 IDEA 插件开发")
|
||||
- [IDEA 插件开发入门教程](https://blog.xiaohansong.com/idea-plugin-development.html "IDEA 插件开发入门教程")
|
||||
|
||||
## 08 后记
|
||||
|
||||
我们开发 IDEA 插件主要是为了让 IDEA 更加好用,比如有些框架使用之后可以减少重复代码的编写、有些主题类型的插件可以让你的 IDEA 更好看。
|
||||
|
||||
我这篇文章的这个案例说实话只是为了让大家简单入门一下 IDEA 开发,没有任何实际应用意义。**如果你想要开发一个不错的 IDEA 插件的话,还要充分发挥想象,利用 IDEA 插件平台的能力。**
|
||||
|
||||
## 常见问题一:JDK版本过低
|
||||
|
||||
创建好项目之后,运行 Gradle,出现如下报错
|
||||
|
||||
```
|
||||
FAILURE: Build failed with an exception.
|
||||
|
||||
* What went wrong:
|
||||
A problem occurred configuring root project 'string-template-error-scanner'.
|
||||
> Could not resolve all artifacts for configuration ':classpath'.
|
||||
> Could not resolve org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.4.0.
|
||||
Required by:
|
||||
project : > org.jetbrains.intellij:org.jetbrains.intellij.gradle.plugin:1.4.0
|
||||
> Unable to find a matching variant of org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.4.0:
|
||||
- Variant 'apiElements' capability org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.4.0:
|
||||
- Incompatible attributes:
|
||||
- Required org.gradle.jvm.version '8' and found incompatible value '11'.
|
||||
- Required org.gradle.usage 'java-runtime' and found incompatible value 'java-api'.
|
||||
- Other attributes:
|
||||
- Found org.gradle.category 'library' but wasn't required.
|
||||
- Required org.gradle.dependency.bundling 'external' and found compatible value 'external'.
|
||||
- Found org.gradle.jvm.environment 'standard-jvm' but wasn't required.
|
||||
- Required org.gradle.libraryelements 'jar' and found compatible value 'jar'.
|
||||
- Found org.gradle.status 'release' but wasn't required.
|
||||
- Found org.jetbrains.kotlin.platform.type 'jvm' but wasn't required.
|
||||
- Variant 'runtimeElements' capability org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.4.0:
|
||||
- Incompatible attribute:
|
||||
- Required org.gradle.jvm.version '8' and found incompatible value '11'.
|
||||
- Other attributes:
|
||||
- Found org.gradle.category 'library' but wasn't required.
|
||||
- Required org.gradle.dependency.bundling 'external' and found compatible value 'external'.
|
||||
- Found org.gradle.jvm.environment 'standard-jvm' but wasn't required.
|
||||
- Required org.gradle.libraryelements 'jar' and found compatible value 'jar'.
|
||||
- Found org.gradle.status 'release' but wasn't required.
|
||||
- Required org.gradle.usage 'java-runtime' and found compatible value 'java-runtime'.
|
||||
- Found org.jetbrains.kotlin.platform.type 'jvm' but wasn't required.
|
||||
|
||||
* Try:
|
||||
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
|
||||
|
||||
* Get more help at https://help.gradle.org
|
||||
|
||||
BUILD FAILED in 94ms
|
||||
```
|
||||
|
||||
> 原因分析:一般情况下,我们都是使用 JDK8 进行开发,但是新版的 IDEA 插件的编译需要使用 JAVA11 版本以上,因此要把 JDK8 换成 JDK11。(设置方法:左上角点击 Settings -> Build, Execution, Deployment, Build Tools -> Gradle,在下面找到 Gradle JVM: 改成 Java11 再次运行 Gradle 即可)
|
||||
>
|
||||
>
|
||||
|
||||
## 常见问题二:无法创建 org.jetbrains.intellij.utils.ArchiveUtils 的实例
|
||||
|
||||
```
|
||||
Build file 'D:\project\string-template-error-scanner\build.gradle' line: 3
|
||||
|
||||
An exception occurred applying plugin request [id: 'org.jetbrains.intellij', version: '1.4.0']
|
||||
> Failed to apply plugin [id 'org.jetbrains.intellij']
|
||||
> Could not create an instance of type org.jetbrains.intellij.utils.ArchiveUtils.
|
||||
> Could not generate a decorated class for type ArchiveUtils.
|
||||
> org/gradle/api/file/ArchiveOperations
|
||||
|
||||
```
|
||||
|
||||
> 原因分析:这个问题我在 StackOverFlow、CSDN 等等网站搜了一大圈都从根源上找到怎么解决(知道的小伙伴可以编辑此页和我说一下~)
|
||||
>
|
||||
> 最后通过修改 `build.gradle` 中 org.jetbrains.intellij 的版本解决的,我创建好项目之后版本是 1.4.0,换成 0.6.3,再重新运行一次 Gradle 就可以了
|
@ -1,75 +0,0 @@
|
||||
# IDEA 重构入门
|
||||
|
||||
我们在使用 IDEA 进行重构之前,先介绍一个方便我们进行重构的快捷键:`ctrl+t(mac)/ctrl+shift+alt+t`(如果忘记快捷键的话,鼠标右键也能找到重构选项),使用这个快捷键可以快速调出常用重构的选项,如下图所示:
|
||||
|
||||

|
||||
|
||||
### 重命名(rename)
|
||||
|
||||
快捷键:**Shift + F6(mac) / Shift + F6(windows/Linux):** 对类、变量或者方法名重命名。
|
||||
|
||||

|
||||
|
||||
### 提取相关重构手段
|
||||
|
||||
这部分的快捷键实际很好记忆,我是这样记忆的:
|
||||
|
||||
前面两个键位是 `command + option(mac) / ctrl + alt (Windows/Linux)` 是固定的,只有后面一个键位会变比如Extract constant (提取变量)就是 c(constant)、Extract variable (提取变量)就是 v(variable)。
|
||||
|
||||
#### 提取常量(extract constant)
|
||||
|
||||
1. **使用场景** :提取未经过定义就直接出现的常量。提取常量使得你的编码更易读,避免硬编码。
|
||||
2. **快捷键:** `command + option+ c(mac)/ ctrl + alt + c(Windows/Linux)`
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
||||
#### 提取参数(exact parameter)
|
||||
|
||||
1. **使用场景** :提取参数到方法中。
|
||||
2. **快捷键:** `command + option+ p(mac)/ ctrl + alt + p(Windows/Linux)`
|
||||
|
||||

|
||||
|
||||
#### 提取变量(exact variable)
|
||||
|
||||
1. **使用场景** :提取多次出现的表达式。
|
||||
2. **快捷键:** `command + option+ v(mac) / ctrl + alt + v(Windows/Linux) `
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
||||
#### 提取属性(exact field)
|
||||
|
||||
1. **使用场景** :把当前表达式提取成为类的一个属性。
|
||||
2. **快捷键:** `command + option+ f(mac) / ctrl + alt + f(Windows/Linux) `
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
||||
#### 提取方法(exact method)
|
||||
|
||||
1. **使用场景** :1个或者多个表达式可以提取为一个方法。 提取方法也能使得你的编码更易读,更加语义化。
|
||||
2. **快捷键:** `command + option+ m(mac)/ ctrl + alt + m(Windows/Linux)`
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
||||
#### 提取接口(exact interface)
|
||||
|
||||
1. **使用场景** :想要把一个类中的1个或多个方法提取到一个接口中的时候。
|
||||
2. **快捷键:** `command + option+ m(mac)/ ctrl + alt + m(Windows/Linux)`
|
||||
|
||||
**示例:**
|
||||
|
||||

|
||||
|
@ -1,189 +0,0 @@
|
||||
# IDEA源码阅读技巧
|
||||
|
||||
项目有个新来了一个小伙伴,他看我查看项目源代码的时候,各种骚操作“花里胡哨”的。于是他向我请教,想让我分享一下我平时使用 IDEA 看源码的小技巧。
|
||||
|
||||
## 基本操作
|
||||
|
||||
这一部分的内容主要是一些我平时看源码的时候常用的快捷键/小技巧!非常好用!
|
||||
|
||||
掌握这些快捷键/小技巧,看源码的效率提升一个等级!
|
||||
|
||||
### 查看当前类的层次结构
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ---------- |
|
||||
| ⭐⭐⭐⭐⭐ | `Ctrl + H` |
|
||||
|
||||
平时,我们阅读源码的时候,经常需要查看类的层次结构。就比如我们遇到抽象类或者接口的时候,经常需要查看其被哪些类实现。
|
||||
|
||||
拿 Spring 源码为例,`BeanDefinition` 是一个关于 Bean 属性/定义的接口。
|
||||
|
||||
```java
|
||||
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
|
||||
......
|
||||
}
|
||||
```
|
||||
|
||||
如果我们需要查看 `BeanDefinition` 被哪些类实现的话,只需要把鼠标移动到 `BeanDefinition` 类名上,然后使用快捷键 `Ctrl + H` 即可。
|
||||
|
||||

|
||||
|
||||
同理,如果你想查看接口 `BeanDefinition` 继承的接口 `AttributeAccessor` 被哪些类实现的话,只需要把鼠标移动到 `AttributeAccessor` 类名上,然后使用快捷键 `Ctrl + H` 即可。
|
||||
|
||||
### 查看类结构
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ------------------------------------- |
|
||||
| ⭐⭐⭐⭐ | `Alt + 7`(Win) / `Command +7` (Mac) |
|
||||
|
||||
类结构可以让我们快速了解到当前类的方法、变量/常量,非常使用!
|
||||
|
||||
我们在对应的类的任意位置使用快捷键 `Alt + 7`(Win) / `Command +7` (Mac)即可。
|
||||
|
||||

|
||||
|
||||
### 快速检索类
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ---------------------------------------- |
|
||||
| ⭐⭐⭐⭐⭐ | `Ctrl + N` (Win) / `Command + O` (Mac) |
|
||||
|
||||
使用快捷键 `Ctrl + N` (Win) / `Command + O` (Mac)可以快速检索类/文件。
|
||||
|
||||

|
||||
|
||||
### 关键字检索
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ---------- |
|
||||
| ⭐⭐⭐⭐⭐ | 见下文 |
|
||||
|
||||
- 当前文件下检索 : `Ctrl + F` (Win) / `Command + F` (Mac)
|
||||
- 全局的文本检索 : `Ctrl + Shift + F` (Win) / `Command + Shift + F` (Mac)
|
||||
|
||||
### 查看方法/类的实现类
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | -------------------------------------------------- |
|
||||
| ⭐⭐⭐⭐ | `Ctrl + Alt + B` (Win) / `Command + Alt + B` (Mac) |
|
||||
|
||||
如果我们想直接跳转到某个方法/类的实现类,直接在方法名或者类名上使用快捷键 `Ctrl + Alt + B/鼠标左键` (Win) / `Command + Alt + B/鼠标左键` (Mac) 即可。
|
||||
|
||||
如果对应的方法/类只有一个实现类的话,会直接跳转到对应的实现类。
|
||||
|
||||
比如 `BeanDefinition` 接口的 `getBeanClassName()` 方法只被 `AbstractBeanDefinition` 抽象类实现,我们对这个方法使用快捷键就可以直接跳转到 `AbstractBeanDefinition` 抽象类中对应的实现方法。
|
||||
|
||||
```java
|
||||
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
|
||||
@Nullable
|
||||
String getBeanClassName();
|
||||
......
|
||||
}
|
||||
```
|
||||
|
||||
如果对应的方法/类有多个实现类的话,IDEA 会弹出一个选择框让你选择。
|
||||
|
||||
比如 `BeanDefinition` 接口的 `getParentName()` 方法就有多个不同的实现。
|
||||
|
||||

|
||||
|
||||
### 查看方法被使用的情况
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ---------- |
|
||||
| ⭐⭐⭐⭐ | `Alt + F7` |
|
||||
|
||||
我们可以通过直接在方法名上使用快捷键 `Alt + F7` 来查看这个方法在哪些地方被调用过。
|
||||
|
||||

|
||||
|
||||
### 查看最近使用的文件
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | -------------------------------------- |
|
||||
| ⭐⭐⭐⭐⭐ | `Ctrl + E`(Win) / `Command +E` (Mac) |
|
||||
|
||||
你可以通过快捷键 `Ctrl + E`(Win) / `Command +E` (Mac)来显示 IDEA 最近使用的一些文件。
|
||||
|
||||

|
||||
|
||||
### 查看图表形式的类继承链
|
||||
|
||||
| 使用频率 | 相关快捷键 |
|
||||
| -------- | ------------------------ |
|
||||
| ⭐⭐⭐⭐ | 相关快捷键较多,不建议记 |
|
||||
|
||||
点击类名 **右键** ,选择 **Shw Diagrams** 即可查看图表形式的类继承链。
|
||||
|
||||

|
||||
|
||||
你还可以对图表进行一些操作。比如,你可以点击图表中具体的类 **右键**,然后选择显示它的实现类或者父类。
|
||||
|
||||

|
||||
|
||||
再比如你还可以选择是否显示类中的属性、方法、内部类等等信息。
|
||||
|
||||

|
||||
|
||||
如果你想跳转到对应类的源码的话,直接点击图表中具体的类 **右键** ,然后选择 **Jump to Source** 。
|
||||
|
||||

|
||||
|
||||
## 插件推荐
|
||||
|
||||
### 一键生成方法的序列图
|
||||
|
||||
**序列图**(Sequence Diagram),亦称为**循序图**,是一种 UML 行为图。表示系统执行某个方法/操作(如登录操作)时,对象之间的顺序调用关系。
|
||||
|
||||
这个顺序调用关系可以这样理解:你需要执行系统中某个对象 a 提供的方法/操作 login(登录),但是这个对象又依赖了对象 b 提供的方法 getUser(获取用户)。因此,这里就有了 a -> b 调用关系之说。
|
||||
|
||||
我们可以通过 **SequenceDiagram** 这个插件一键生成方法的序列图。
|
||||
|
||||
> 如果你因为网络问题没办法使用 IDEA 自带的插件市场的话,也可以通过 IDEA 插件市场的官网手动下载安装。
|
||||
|
||||

|
||||
|
||||
**如何使用呢?**
|
||||
|
||||
1、选中方法名(注意不要选类名),然后点击鼠标右键,选择 **Sequence Diagram** 选项即可!
|
||||
|
||||

|
||||
|
||||
2、配置生成的序列图的一些基本的参数比如调用深度之后,我们点击 ok 即可!
|
||||
|
||||

|
||||
|
||||
3、你还可以通过生成的时序图来定位到相关的代码,这对于我们阅读源码的时候尤其有帮助!
|
||||
|
||||

|
||||
|
||||
4、时序图生成完成之后,你还可以选择将其导出为图片。
|
||||
|
||||

|
||||
|
||||
相关阅读:[《安利一个 IDEA 骚操作:一键生成方法的序列图》](https://mp.weixin.qq.com/s/SG1twZczqdup_EQAOmNERg) 。
|
||||
|
||||
### 项目代码统计
|
||||
|
||||
为了快速分析项目情况,我们可以对项目的 **代码的总行数、单个文件的代码行数、注释行数等信息进行统计。**
|
||||
|
||||
**Statistic** 这个插件来帮助我们实现这一需求。
|
||||
|
||||

|
||||
|
||||
有了这个插件之后你可以非常直观地看到你的项目中所有类型的文件的信息比如数量、大小等等,可以帮助你更好地了解你们的项目。
|
||||
|
||||

|
||||
|
||||
你还可以使用它看所有类的总行数、有效代码行数、注释行数、以及有效代码比重等等这些东西。
|
||||
|
||||

|
||||
|
||||
如果,你担心插件过多影响 IDEA 速度的话,可以只在有代码统计需求的时候开启这个插件,其他时间禁用它就完事了!
|
||||
|
||||
相关阅读:[快速识别烂项目!试试这款项目代码统计 IDEA 插件](https://mp.weixin.qq.com/s/fVEeMW6elhu79I-rTZB40A)
|
||||
|
||||
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 276 KiB |
Before Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 509 KiB |
Before Width: | Height: | Size: 324 KiB |
Before Width: | Height: | Size: 228 KiB |
Before Width: | Height: | Size: 218 KiB |
Before Width: | Height: | Size: 127 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 311 KiB |
@ -1,17 +0,0 @@
|
||||
---
|
||||
icon: creative
|
||||
category: IDEA指南
|
||||
---
|
||||
|
||||
# IntelliJ IDEA 使用指南 | 必备插件推荐 | 插件开发入门 | 重构小技巧 | 源码阅读技巧
|
||||
|
||||
**项目地址** :
|
||||
|
||||
- Github 地址:[https://github.com/CodingDocs/awesome-idea-tutorial](https://github.com/CodingDocs/awesome-idea-tutorial)
|
||||
- Gitee 地址:[https://gitee.com/SnailClimb/awesome-idea-tutorial](https://gitee.com/SnailClimb/awesome-idea-tutorial ) (Github 无法访问或者访问速度比较慢的小伙伴可以看码云上的对应内容)
|
||||
|
||||
**常见问题** :
|
||||
|
||||
- [选择IDEA还是Eclipse? - JavaGuide的回答 - 知乎](https://www.zhihu.com/question/305591091/answer/2259316801)
|
||||
- [IntelliJ IDEA 中有什么让你相见恨晚的技巧? - JavaGuide的回答 - 知乎](https://www.zhihu.com/question/300830746/answer/2255262082)
|
||||
|
@ -1,105 +0,0 @@
|
||||
---
|
||||
title: CHINER:干掉 PowerDesigner,这个国产数据库建模工具很强!
|
||||
category: 数据库
|
||||
tag:
|
||||
- 开发工具
|
||||
---
|
||||
|
||||
大家好,我是 Guide!
|
||||
|
||||
今天给小伙伴们分享一个我平时经常使用的国产数据库建模工具,非常好用!
|
||||
|
||||
这个数据库建模工具的名字叫做 **CHINER** [kaɪˈnər] 。可能大部分小伙伴都没有听过这个工具,不过,相信大部分小伙伴应该都听说过 CHINER 的前身 **PDMan**。
|
||||
|
||||
CHINER 是 CHINESE Entity Relation 的缩写,翻译过来就是国产实体关系图工具,中文名称为:**元数建模**,也作:"**CHINER[元数建模]**"公开使用。
|
||||
|
||||
CHINER 对 PDMan 的架构设计进行了大幅改善,并对 PDMan 做到高度兼容。
|
||||
|
||||
CHINER 的界面简单,功能简洁,非常容易上手。并且,可以直接导入 PowerDesigner 文件、PDMan 文件,还可以直接从数据库或者 DDL 语句直接导入。
|
||||
|
||||

|
||||
|
||||
CHINER 的技术栈:React+Electron+Java 。
|
||||
|
||||
* Gitee 地址:https://gitee.com/robergroup/chiner 。
|
||||
* 操作手册: https://www.yuque.com/chiner/docs/manual 。
|
||||
|
||||
## 快速体验
|
||||
|
||||
### 下载安装
|
||||
|
||||
CHINER 提供了 **Windows** 、**Mac** 、**Linux** 下的一键安装包,我们直接下载即可。
|
||||
|
||||
> 下载地址:https://gitee.com/robergroup/chiner/releases
|
||||
|
||||
需要注意的是:如果你当前使用的 Chrome 浏览器的话,无法直接点击链接下载。你可以更换浏览器下载或者右键链接选择链接存储为...。
|
||||
|
||||

|
||||
|
||||
打开软件之后,界面如下图所示。
|
||||
|
||||

|
||||
|
||||
我这里以电商项目参考模板来演示 CHINER 的基本操作。
|
||||
|
||||
### 模块化管理
|
||||
|
||||
电商项目比较复杂,我们可以将其拆分为一个一个独立的模块(表分组),每个模块下有数据表,视图,关系图,数据字典。
|
||||
|
||||
像这个电商项目就创建了 3 个模块:消费端、商家端、平台端。
|
||||
|
||||

|
||||
|
||||
不过,对于一些比较简单的项目比如博客系统、企业管理系统直接使用简单模式即可。
|
||||
|
||||
### 数据库表管理
|
||||
|
||||
右键数据表即可创建新的数据库表,点击指定的数据库表即可对指定的数据库表进行设计。
|
||||
|
||||

|
||||
|
||||
并且,数据表字段可以直接关联数据字典。
|
||||
|
||||

|
||||
|
||||
如果需要创建视图的话,直接右键视图即可。视图是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。
|
||||
|
||||

|
||||
|
||||
数据库视图可以方便我们进行查询。不过,数据库视图会影响数据库性能,通常不建议使用。
|
||||
|
||||
### 关系图
|
||||
|
||||
我平时在项目中比较常见的 **ER 关联关系图** ,可以使用 CHINER 进行手动维护。
|
||||
|
||||
如果你需要添加新的数据库表到关系图的话,直接拖拽指定的数据库表到右边的关系图展示界面即可。另外,表与表之间的关联也需要你手动对相关联的字段进行连接。
|
||||
|
||||

|
||||
|
||||
手动进行维护,说实话还是比较麻烦的,也比较容易出错。
|
||||
|
||||
像 [Navicat Data Modeler](https://www.navicat.com.cn/products/navicat-data-modeler) 在这方面就强多了,它可以自动生成 ER 图。
|
||||
|
||||

|
||||
|
||||
### 数据库表代码模板
|
||||
|
||||
支持直接生成对应表的 SQL 代码(支持 MySQL、Oracle、SQL Server、PostgreSQL 等数据库)并且还提供了 Java 和 C# 的 JavaBean。
|
||||
|
||||

|
||||
|
||||
### 导出数据库表
|
||||
|
||||
你可以选择导出 DDL、Word 文档、数据字典 SQL、当前关系图的图片。
|
||||
|
||||

|
||||
|
||||
### 数据库逆向
|
||||
|
||||
你还可以连接数据库,逆向解析数据库。
|
||||
|
||||

|
||||
|
||||
数据库连接成功之后,我们点击右上角的菜单 `导入—> 从数据库导入` 即可。
|
||||
|
||||

|
@ -1,92 +0,0 @@
|
||||
---
|
||||
title: DBeaver:开源数据库管理工具
|
||||
category: 数据库
|
||||
tag:
|
||||
- 开发工具
|
||||
---
|
||||
|
||||
# DBeaver:开源数据库管理工具。
|
||||
|
||||
[《再见,Navicat!同事安利的这个IDEA的兄弟,真香!》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247489523&idx=1&sn=4e96972842bdcea2e05cb267d17c5e8e&chksm=cea25838f9d5d12e45a9939370eccf2bff7177038e70437ea0e01d64030118852ee66ae72284&token=2000865596&lang=zh_CN#rd) 这篇文章发了之后很多人抱怨Datagrip 的占用内存太大,很多人推荐了 DBeaver 这款开源免费的数据库管理工具。于是,我昨夜简单体验了一下 DBeaver ,然后写了这篇文章。
|
||||
|
||||
## DBeaver 概览
|
||||
|
||||
DBeaver 是一个基于 Java 开发 ,并且支持几乎所有的数据库产品的开源数据库管理工具。
|
||||
|
||||
DBeaver 社区版不光支持关系型数据库比如MySQL、PostgreSQL、MariaDB、SQLite、Oracle、Db2、SQL Server,还比如 SQLite、H2这些内嵌数据库。还支持常见的全文搜索引擎比如 Elasticsearch 和 Solr、大数据相关的工具比如Hive和 Spark。
|
||||
|
||||

|
||||
|
||||
甚至说,DBeaver 的商业版本还支持各种 NoSQL 数据库。
|
||||
|
||||

|
||||
|
||||
## 使用
|
||||
|
||||
**DBeaver 虽然小巧,但是功能还是十分强大的。基本的表设计、SQL执行、ER图、数据导入导出等等常用功能都不在话下。**
|
||||
|
||||
**我下面只简单演示一下基本的数据库的创建以及表的创建。**
|
||||
|
||||
### 下载安装
|
||||
|
||||
官方网提供的下载地址:https://dbeaver.io/download/ ,你可以根据自己的操作系统选择合适的版本进行下载安装。
|
||||
|
||||
比较简单,这里就不演示了。
|
||||
|
||||
### 连接数据库
|
||||
|
||||
**1.选择自己想要的连接的数据库,然后点击下一步即可(第一次连接可能需要下载相关驱动)。**
|
||||
|
||||
我这里以MySQL为例。
|
||||
|
||||

|
||||
|
||||
**2.输入数据库的地址、用户名和密码等信息,然后点击完成即可连接**
|
||||
|
||||
点击完成之前,你可以先通过左下方的测试连接来看一下数据库是否可以被成功连接上。
|
||||
|
||||

|
||||
|
||||
### 新建数据库
|
||||
|
||||
右键-> 新建数据库(MySQL 用户记得使用 utf8mb4而不是 utf8)
|
||||
|
||||

|
||||
|
||||
### 数据库表相关操作
|
||||
|
||||
#### 新建表
|
||||
|
||||

|
||||
|
||||
#### 新建列
|
||||
|
||||

|
||||
|
||||
#### 创建约束(主键、唯一键)
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
#### 插入数据
|
||||
|
||||
我们通过 SQL 编辑器插入数据:
|
||||
|
||||

|
||||
|
||||
```java
|
||||
INSERT into user(id,name,phone,password) values ('A00001','guide哥','181631312315','123456');
|
||||
INSERT into user(id,name,phone,password) values ('A00002','guide哥2','181631312313','123456');
|
||||
INSERT into user(id,name,phone,password) values ('A00003','guide哥3','181631312312','123456');
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
总的来说,简单体验之后感觉还是很不错的,占用内存也确实比 DataGrip 确实要小很多。
|
||||
|
||||
各位小伙伴可以自行体验一下。毕竟免费并且开源,还是很香的!
|
||||
|
||||
|
||||
|
||||
|
@ -1,289 +0,0 @@
|
||||
---
|
||||
title: DataGrip:IDEA官方的这个数据库管理神器真香!
|
||||
category: 数据库
|
||||
tag:
|
||||
- 开发工具
|
||||
---
|
||||
|
||||
> Atzuge | https://www.cnblogs.com/zuge/p/7397255.html
|
||||
|
||||
DataGrip 是由 JetBrains 公司(就是那个出品 Intellij IDEA 的公司,JetBrains出品,必属精品)推出的数据库管理软件。如果你不爱折腾的话,这家公司出品的很多 IDE 都是你的最佳选择,比如你进行 Python 开发的可以选择 JetBrains 全家桶中的 PyCharm 。
|
||||
|
||||
**DataGrip 支持几乎所有主流的关系数据库产品,如 DB2、Derby、H2、MySQL、Oracle、PostgreSQL、SQL Server、SQLite 及 Sybase 等,并且提供了简单易用的界面,开发者上手几乎不会遇到任何困难。**
|
||||
|
||||
我相信,当你第一眼看到 DataGrip 以后,会有一种惊艳的感觉,就好比你第一眼看到一个姑娘,就是那么一瞥,你对自己说,就是她了!废话不多说,来看看 DataGrip 的常用功能。
|
||||
|
||||
## 下载
|
||||
|
||||
DataGrip 下载链接如下 [https://www.jetbrains.com/datagrip/download](https://www.jetbrains.com/datagrip/download)。安装过程也很简单,双击安装,下一步,中间会让你选择主题,本人选择的是经典的 Darcula,安装完成后,启动,界面如下
|
||||
|
||||

|
||||
|
||||
## 配置 Data Source
|
||||
|
||||
相信使用过 IDEA 的同学看到这个界面都会感到很亲切。`File->DataSource` :配置数据源。
|
||||
|
||||

|
||||
DataGrip 支持主流的数据库。你也可以在 Database 视图中展开绿色的+号,添加数据库连接
|
||||
|
||||

|
||||
选择需要连接的数据库类型
|
||||
|
||||

|
||||
|
||||
在面板中,左上部分列出了已经建立的数据库连接,点击各项,右侧会展示当前连接的配置信息,General 面板中,可以配置数据库连接的信息,如主机、用户名、密码等,不同数据库配置信息不完全相同,填入数据库 URL,注意,URL 后有个选项,可以选择直接填入 url,那么就不需要单独填主机名、端口等信息了。
|
||||
|
||||
Driver 部分显示数据库驱动信息,如果还没有下载过驱动,底部会有个警告,提示缺少驱动
|
||||
|
||||

|
||||
点击 Driver 后的数据库类型,会跳转到驱动下载页面,点击 download,下载完会显示驱动包
|
||||
|
||||

|
||||
|
||||

|
||||
如果下载的驱动有问题,可以手动添加本地驱动包,在试用过程中,创建 Oracle 连接时,下载的驱动包就有问题,提示缺少 class,点击右侧绿色的+号,选择本地下载好的 jar 包,通过右侧上下箭头,将导入的 jar 包移到最上位置就 OK 了
|
||||
|
||||

|
||||
|
||||
点击 Test Connection,查看配置是否正确,接下来就可以使用了。
|
||||
|
||||
## 常用设置
|
||||
|
||||
打开 DataGrip,选择 `File->Settings`,当前面板显示了常用设置项
|
||||
|
||||

|
||||
基本上默认设置就足够了,要更改设置也很简单,左侧菜单已经分类好了,第一项是数据库相关的配置,第二项是配置外观的,在这里可以修改主题,key map 修改快捷键,editor 配置编辑器相关设置,在这里可以修改编辑器字体,展开 edit 项: `Editor->Color & Fonts->Font`
|
||||
|
||||

|
||||
需要将当前主题保存一下,点击 save as,起个名,选择重命名后的主题就能修改了,这里我选择习惯的 Conurier New 字体,大小为 14 号,点击右下角的 apply,点击 OK
|
||||
|
||||

|
||||
|
||||
其他的没啥好设置的了。
|
||||
|
||||
## 数据库常用操作
|
||||
|
||||
接下来,我们来使用 DataGrip 完成数据库的常用操作,包括查询数据、修改数据,创建数据库、表等。
|
||||
|
||||

|
||||
左上区域显示了当前数据库连接,展开后会显示数据库表等信息,如果展开后没有任何信息,需要选中数据库连接,点击上面的旋转图标同步一下,下方有个 More Schema 选项,点击可以切换不同的 schema。
|
||||
|
||||
### sql 语句编写
|
||||
|
||||
右键选中的数据库连接,选择 open console,就可以在右侧的控制台中书写 sql 语句了。
|
||||
|
||||

|
||||
|
||||
**DataGrip 的智能提示非常爽,无论是标准的 sql 关键字,还是表名、字段名,甚至数据库特定的字段,都能提示,不得不感叹这智能提示太强大了,Intellij IDEA 的智能提示也是秒杀 eclipse。**
|
||||
|
||||
写完 sql 语句后,可以选中,电子左上侧绿色箭头执行
|
||||
|
||||

|
||||
也可以使用快捷键 `Ctrl+Enter`,选中情况下,会直接执行该 sql,未选中情况下,如果控制台中有多条 sql,会提示你要执行哪条 sql。
|
||||
|
||||
之前习惯了 dbvisualizer 中的操作,dbvisualizer 中光标停留在当前 sql 上(sql 以分号结尾),按下`Ctrl+.`快捷键会自动执行当前 sql,其实 DataGrip 也能设置,在 `setting->Database-General`中
|
||||
|
||||

|
||||
语句执行时默认是提示,改成 smallest statement 后,光标停留在当前语句时,按下 Ctrl+Enter 就会直接执行当前语句。
|
||||
|
||||
语句的执行结果在底部显示
|
||||
|
||||

|
||||
如果某列的宽度太窄,可以鼠标点击该列的任意一个,使用快捷键`Ctrl+Shift+左右箭头`可以调整宽度,如果要调整所有列的宽度,可以点击左上角红框部分,选择所有行,使用快捷键`Ctrl+Shift+左右箭头调整`
|
||||
|
||||
### 修改数据
|
||||
|
||||
添加行、删除行也很方便,上部的+、-按钮能直接添加行或删除选中的行,编辑列同样也很方便,双击要修改的列,输入修改后的值,鼠标在其他部分点击就完成修改了
|
||||
|
||||

|
||||
有的时候我们要把某个字段置为 null,不是空字符串"",DataGrip 也提供了渐变的操作,直接在列上右键,选择 set null
|
||||
|
||||

|
||||
对于需要多窗口查看结果的,即希望查询结果在新的 tab 中展示,可以点击 pin tab 按钮,那新查询将不会再当前 tab 中展示,而是新打开一个 tab
|
||||
|
||||

|
||||
|
||||
旁边的 output 控制台显示了执行 sql 的日志信息,能看到 sql 执行的时间等信息
|
||||
|
||||

|
||||
我就问这么吊的工具,还有谁!!!
|
||||
|
||||
### 新建表
|
||||
|
||||
要新建表也是相当简单、智能,选中数据库连接,点击绿色+号下选择 table
|
||||
|
||||

|
||||
在新打开的窗口中,可以填写表信息
|
||||
|
||||

|
||||
我就问你看到这个窗口兴奋不兴奋!!!
|
||||
|
||||
顶部可以填写表名、表注释,中间可以点击右侧绿色+号添加列,列类型 type 也是能自动补全,default 右侧的消息框图标点击后能对列添加注释,旁边的几个 tab 可以设置索引及外键
|
||||
|
||||
所有这些操作的 DDL 都会直接在底部显示
|
||||
|
||||

|
||||
我就问你怕不怕
|
||||
|
||||
表建完后,可以点击下图中的 table 图标,打开表查看视图
|
||||
|
||||

|
||||
可以查看表的数据,也能查看 DDL 语句
|
||||
|
||||
### 数据库导出
|
||||
|
||||
这些基本功能的设计、体验,已经惊艳到我了,接下来就是数据的导出。
|
||||
|
||||
DataGrip 的导出功能也是相当强大
|
||||
|
||||
选择需要导出数据的表,右键,Dump Data To File
|
||||
|
||||

|
||||
即可以导出 insert、update 形式的 sql 语句,也能导出为 html、csv、json 格式的数据
|
||||
|
||||
也可以在查询结果视图中导出
|
||||
|
||||

|
||||
点击右上角下载图标,在弹出窗口中可以选择不同的导出方式,如 sql insert、sql update、csv 格式等
|
||||
|
||||

|
||||
|
||||
如果是导出到 csv 格式,还能控制导出的格式
|
||||
|
||||

|
||||
|
||||
导出后用 excel 打开是这种结果
|
||||
|
||||

|
||||
除了能导出数据外,还能导入数据
|
||||
|
||||
选择表,右键->Import from File,选择要导入的文件
|
||||
|
||||

|
||||
注意,导出的时候如果勾选了左侧的两个 header 选项,导入的时候如果有 header,也要勾选,不然会提示列个数不匹配
|
||||
|
||||
## 小技巧
|
||||
|
||||
### 导航+全局搜索
|
||||
|
||||
#### 关键字导航
|
||||
|
||||
当在 datagrip 的文本编辑区域编写 sql 时,按住键盘 Ctrl 键不放,同时鼠标移动到 sql 关键字上,比如表名、字段名称、或者是函数名上,鼠标会变成手型,关键字会变蓝,并加了下划线,点击,会自动定位到左侧对象树,并选中点击的对象
|
||||
|
||||

|
||||
|
||||
#### 快速导航到指定的表、视图、函数等
|
||||
|
||||
在 datagrip 中,使用 Ctrl+N 快捷键,弹出一个搜索框,输入需要导航的名称,回车即可
|
||||
|
||||

|
||||
|
||||
#### 全局搜索
|
||||
|
||||
连续两次按下 shift 键,或者鼠标点击右上角的搜索图标,弹出搜索框,搜索任何你想搜索的东西
|
||||
|
||||

|
||||
|
||||
#### 结果集搜索
|
||||
|
||||
在查询结果集视图区域点击鼠标,按下 Ctrl+F 快捷键,弹出搜索框,输入搜索内容,支持正则表达式、过滤结果
|
||||
|
||||

|
||||
|
||||
#### 导航到关联数据
|
||||
|
||||
表之间会有外检关联,查询的时候,能直接定位到关联数据,或者被关联数据,例如 user1 表有个外检字段 classroom 指向 classroom 表的主键 id,在查询 classroom 表数据的时候,可以在 id 字段上右键,go to,referencing data
|
||||
|
||||

|
||||
选择要显示第一条数据还是显示所有数据
|
||||
|
||||

|
||||
会自动打开关联表的数据
|
||||
|
||||

|
||||
相反,查询字表的数据时,也能自动定位到父表
|
||||
|
||||
### 数据转换
|
||||
|
||||
#### 结果集数据过滤
|
||||
|
||||
对于使用 table edit(对象树中选中表,右键->table editor)打开的结果集,可以使用条件继续过滤结果集,如下图所示,可以在结果集左上角输入款中输入 where 条件过滤
|
||||
|
||||

|
||||
也可以对着需要过滤数据的列右键,filter by 过滤
|
||||
|
||||

|
||||
|
||||
#### 行转列
|
||||
|
||||
对于字段比较多的表,查看数据要左右推动,可以切换成列显示,在结果集视图区域使用 Ctrl+Q 快捷键
|
||||
|
||||

|
||||
|
||||
#### 变量重命名
|
||||
|
||||
鼠标点击需要重命名的变量,按下 Shift+F6 快捷键,弹出重命名对话框,输入新的名称
|
||||
|
||||

|
||||
|
||||
#### 自动检测无法解析的对象
|
||||
|
||||
如果表名、字段名不存在,datagrip 会自动提示,此时对着有问题的表名或字段名,按下 Alt+Enter,会自动提示是否创建表或添加字段
|
||||
|
||||

|
||||
|
||||
#### 权限定字段名
|
||||
|
||||
对于查询使用表别名的,而字段中没有使用别名前缀的,datagrip 能自动添加前缀,鼠标停留在需要添加别名前缀的字段上,使用 Alt+Enter 快捷键
|
||||
|
||||

|
||||
|
||||
### 格式化
|
||||
|
||||
#### \*通配符自动展开
|
||||
|
||||
查询的时候我们会使用 select *查询所有列,这是不好的习惯,datagrip 能快速展开列,光标定位到*后面,按下 Alt+Enter 快捷键
|
||||
|
||||

|
||||
|
||||
#### 大写自动转换
|
||||
|
||||
sql 使用大写形式是个好的习惯,如果使用了小写,可以将光标停留在需要转换的字段或表名上,使用 Ctrl+shift+U 快捷键自动转换
|
||||
|
||||
#### sql 格式化
|
||||
|
||||
选中需要格式化的 sql 代码,使用 Ctrl+Alt+L 快捷键
|
||||
|
||||
datagrip 提供了一个功能强大的编辑器,实现了 notepad++的列编辑模式
|
||||
|
||||
### 列编辑
|
||||
|
||||
#### 多光标模式
|
||||
|
||||
在编辑 sql 的时候,可能需要同时输入或同时删除一些字符,按下 alt+shift,同时鼠标在不同的位置点击,会出现多个光标
|
||||
|
||||

|
||||
|
||||
#### 代码注释
|
||||
|
||||
选中要注释的代码,按下 Ctrl+/或 Ctrl+shift+/快捷键,能注释代码,或取消注释
|
||||
|
||||

|
||||
|
||||
#### 列编辑
|
||||
|
||||
按住键盘 Alt 键,同时按下鼠标左键拖动,能选择多列,拷贝黏贴等操作
|
||||
|
||||

|
||||
|
||||
### 历史记录
|
||||
|
||||
#### 代码历史
|
||||
|
||||
在文本编辑器中,邮件,local history,show history,可以查看使用过的 sql 历史
|
||||
|
||||

|
||||
|
||||
#### 命令历史
|
||||
|
||||

|
@ -1,105 +0,0 @@
|
||||
---
|
||||
title: CHINER:干掉 PowerDesigner,这个国产数据库建模工具很强!
|
||||
category: 数据库
|
||||
tag:
|
||||
- 开发工具
|
||||
---
|
||||
|
||||
大家好,我是 Guide!
|
||||
|
||||
今天给小伙伴们分享一个我平时经常使用的国产数据库建模工具,非常好用!
|
||||
|
||||
这个数据库建模工具的名字叫做 **CHINER** [kaɪˈnər] 。可能大部分小伙伴都没有听过这个工具,不过,相信大部分小伙伴应该都听说过 CHINER 的前身 **PDMan**。
|
||||
|
||||
CHINER 是 CHINESE Entity Relation 的缩写,翻译过来就是国产实体关系图工具,中文名称为:**元数建模**,也作:"**CHINER[元数建模]**"公开使用。
|
||||
|
||||
CHINER 对 PDMan 的架构设计进行了大幅改善,并对 PDMan 做到高度兼容。
|
||||
|
||||
CHINER 的界面简单,功能简洁,非常容易上手。并且,可以直接导入 PowerDesigner 文件、PDMan 文件,还可以直接从数据库或者 DDL 语句直接导入。
|
||||
|
||||

|
||||
|
||||
CHINER 的技术栈:React+Electron+Java 。
|
||||
|
||||
* Gitee 地址:https://gitee.com/robergroup/chiner 。
|
||||
* 操作手册: https://www.yuque.com/chiner/docs/manual 。
|
||||
|
||||
## 快速体验
|
||||
|
||||
### 下载安装
|
||||
|
||||
CHINER 提供了 **Windows** 、**Mac** 、**Linux** 下的一键安装包,我们直接下载即可。
|
||||
|
||||
> 下载地址:https://gitee.com/robergroup/chiner/releases
|
||||
|
||||
需要注意的是:如果你当前使用的 Chrome 浏览器的话,无法直接点击链接下载。你可以更换浏览器下载或者右键链接选择链接存储为...。
|
||||
|
||||

|
||||
|
||||
打开软件之后,界面如下图所示。
|
||||
|
||||

|
||||
|
||||
我这里以电商项目参考模板来演示 CHINER 的基本操作。
|
||||
|
||||
### 模块化管理
|
||||
|
||||
电商项目比较复杂,我们可以将其拆分为一个一个独立的模块(表分组),每个模块下有数据表,视图,关系图,数据字典。
|
||||
|
||||
像这个电商项目就创建了 3 个模块:消费端、商家端、平台端。
|
||||
|
||||

|
||||
|
||||
不过,对于一些比较简单的项目比如博客系统、企业管理系统直接使用简单模式即可。
|
||||
|
||||
### 数据库表管理
|
||||
|
||||
右键数据表即可创建新的数据库表,点击指定的数据库表即可对指定的数据库表进行设计。
|
||||
|
||||

|
||||
|
||||
并且,数据表字段可以直接关联数据字典。
|
||||
|
||||

|
||||
|
||||
如果需要创建视图的话,直接右键视图即可。视图是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。
|
||||
|
||||

|
||||
|
||||
数据库视图可以方便我们进行查询。不过,数据库视图会影响数据库性能,通常不建议使用。
|
||||
|
||||
### 关系图
|
||||
|
||||
我平时在项目中比较常见的 **ER 关联关系图** ,可以使用 CHINER 进行手动维护。
|
||||
|
||||
如果你需要添加新的数据库表到关系图的话,直接拖拽指定的数据库表到右边的关系图展示界面即可。另外,表与表之间的关联也需要你手动对相关联的字段进行连接。
|
||||
|
||||

|
||||
|
||||
手动进行维护,说实话还是比较麻烦的,也比较容易出错。
|
||||
|
||||
像 [Navicat Data Modeler](https://www.navicat.com.cn/products/navicat-data-modeler) 在这方面就强多了,它可以自动生成 ER 图。
|
||||
|
||||

|
||||
|
||||
### 数据库表代码模板
|
||||
|
||||
支持直接生成对应表的 SQL 代码(支持 MySQL、Oracle、SQL Server、PostgreSQL 等数据库)并且还提供了 Java 和 C# 的 JavaBean。
|
||||
|
||||

|
||||
|
||||
### 导出数据库表
|
||||
|
||||
你可以选择导出 DDL、Word 文档、数据字典 SQL、当前关系图的图片。
|
||||
|
||||

|
||||
|
||||
### 数据库逆向
|
||||
|
||||
你还可以连接数据库,逆向解析数据库。
|
||||
|
||||

|
||||
|
||||
数据库连接成功之后,我们点击右上角的菜单 `导入—> 从数据库导入` 即可。
|
||||
|
||||

|
@ -1,289 +0,0 @@
|
||||
---
|
||||
title: DataGrip:IDEA官方的这个数据库管理神器真香!
|
||||
category: 数据库
|
||||
tag:
|
||||
- 开发工具
|
||||
---
|
||||
|
||||
> Atzuge | https://www.cnblogs.com/zuge/p/7397255.html
|
||||
|
||||
DataGrip 是由 JetBrains 公司(就是那个出品 Intellij IDEA 的公司,JetBrains出品,必属精品)推出的数据库管理软件。如果你不爱折腾的话,这家公司出品的很多 IDE 都是你的最佳选择,比如你进行 Python 开发的可以选择 JetBrains 全家桶中的 PyCharm 。
|
||||
|
||||
**DataGrip 支持几乎所有主流的关系数据库产品,如 DB2、Derby、H2、MySQL、Oracle、PostgreSQL、SQL Server、SQLite 及 Sybase 等,并且提供了简单易用的界面,开发者上手几乎不会遇到任何困难。**
|
||||
|
||||
我相信,当你第一眼看到 DataGrip 以后,会有一种惊艳的感觉,就好比你第一眼看到一个姑娘,就是那么一瞥,你对自己说,就是她了!废话不多说,来看看 DataGrip 的常用功能。
|
||||
|
||||
## 下载
|
||||
|
||||
DataGrip 下载链接如下 [https://www.jetbrains.com/datagrip/download](https://www.jetbrains.com/datagrip/download)。安装过程也很简单,双击安装,下一步,中间会让你选择主题,本人选择的是经典的 Darcula,安装完成后,启动,界面如下
|
||||
|
||||

|
||||
|
||||
## 配置 Data Source
|
||||
|
||||
相信使用过 IDEA 的同学看到这个界面都会感到很亲切。`File->DataSource` :配置数据源。
|
||||
|
||||

|
||||
DataGrip 支持主流的数据库。你也可以在 Database 视图中展开绿色的+号,添加数据库连接
|
||||
|
||||

|
||||
选择需要连接的数据库类型
|
||||
|
||||

|
||||
|
||||
在面板中,左上部分列出了已经建立的数据库连接,点击各项,右侧会展示当前连接的配置信息,General 面板中,可以配置数据库连接的信息,如主机、用户名、密码等,不同数据库配置信息不完全相同,填入数据库 URL,注意,URL 后有个选项,可以选择直接填入 url,那么就不需要单独填主机名、端口等信息了。
|
||||
|
||||
Driver 部分显示数据库驱动信息,如果还没有下载过驱动,底部会有个警告,提示缺少驱动
|
||||
|
||||

|
||||
点击 Driver 后的数据库类型,会跳转到驱动下载页面,点击 download,下载完会显示驱动包
|
||||
|
||||

|
||||
|
||||

|
||||
如果下载的驱动有问题,可以手动添加本地驱动包,在试用过程中,创建 Oracle 连接时,下载的驱动包就有问题,提示缺少 class,点击右侧绿色的+号,选择本地下载好的 jar 包,通过右侧上下箭头,将导入的 jar 包移到最上位置就 OK 了
|
||||
|
||||

|
||||
|
||||
点击 Test Connection,查看配置是否正确,接下来就可以使用了。
|
||||
|
||||
## 常用设置
|
||||
|
||||
打开 DataGrip,选择 `File->Settings`,当前面板显示了常用设置项
|
||||
|
||||

|
||||
基本上默认设置就足够了,要更改设置也很简单,左侧菜单已经分类好了,第一项是数据库相关的配置,第二项是配置外观的,在这里可以修改主题,key map 修改快捷键,editor 配置编辑器相关设置,在这里可以修改编辑器字体,展开 edit 项: `Editor->Color & Fonts->Font`
|
||||
|
||||

|
||||
需要将当前主题保存一下,点击 save as,起个名,选择重命名后的主题就能修改了,这里我选择习惯的 Conurier New 字体,大小为 14 号,点击右下角的 apply,点击 OK
|
||||
|
||||

|
||||
|
||||
其他的没啥好设置的了。
|
||||
|
||||
## 数据库常用操作
|
||||
|
||||
接下来,我们来使用 DataGrip 完成数据库的常用操作,包括查询数据、修改数据,创建数据库、表等。
|
||||
|
||||

|
||||
左上区域显示了当前数据库连接,展开后会显示数据库表等信息,如果展开后没有任何信息,需要选中数据库连接,点击上面的旋转图标同步一下,下方有个 More Schema 选项,点击可以切换不同的 schema。
|
||||
|
||||
### sql 语句编写
|
||||
|
||||
右键选中的数据库连接,选择 open console,就可以在右侧的控制台中书写 sql 语句了。
|
||||
|
||||

|
||||
|
||||
**DataGrip 的智能提示非常爽,无论是标准的 sql 关键字,还是表名、字段名,甚至数据库特定的字段,都能提示,不得不感叹这智能提示太强大了,Intellij IDEA 的智能提示也是秒杀 eclipse。**
|
||||
|
||||
写完 sql 语句后,可以选中,电子左上侧绿色箭头执行
|
||||
|
||||

|
||||
也可以使用快捷键 `Ctrl+Enter`,选中情况下,会直接执行该 sql,未选中情况下,如果控制台中有多条 sql,会提示你要执行哪条 sql。
|
||||
|
||||
之前习惯了 dbvisualizer 中的操作,dbvisualizer 中光标停留在当前 sql 上(sql 以分号结尾),按下`Ctrl+.`快捷键会自动执行当前 sql,其实 DataGrip 也能设置,在 `setting->Database-General`中
|
||||
|
||||

|
||||
语句执行时默认是提示,改成 smallest statement 后,光标停留在当前语句时,按下 Ctrl+Enter 就会直接执行当前语句。
|
||||
|
||||
语句的执行结果在底部显示
|
||||
|
||||

|
||||
如果某列的宽度太窄,可以鼠标点击该列的任意一个,使用快捷键`Ctrl+Shift+左右箭头`可以调整宽度,如果要调整所有列的宽度,可以点击左上角红框部分,选择所有行,使用快捷键`Ctrl+Shift+左右箭头调整`
|
||||
|
||||
### 修改数据
|
||||
|
||||
添加行、删除行也很方便,上部的+、-按钮能直接添加行或删除选中的行,编辑列同样也很方便,双击要修改的列,输入修改后的值,鼠标在其他部分点击就完成修改了
|
||||
|
||||

|
||||
有的时候我们要把某个字段置为 null,不是空字符串"",DataGrip 也提供了渐变的操作,直接在列上右键,选择 set null
|
||||
|
||||

|
||||
对于需要多窗口查看结果的,即希望查询结果在新的 tab 中展示,可以点击 pin tab 按钮,那新查询将不会再当前 tab 中展示,而是新打开一个 tab
|
||||
|
||||

|
||||
|
||||
旁边的 output 控制台显示了执行 sql 的日志信息,能看到 sql 执行的时间等信息
|
||||
|
||||

|
||||
我就问这么吊的工具,还有谁!!!
|
||||
|
||||
### 新建表
|
||||
|
||||
要新建表也是相当简单、智能,选中数据库连接,点击绿色+号下选择 table
|
||||
|
||||

|
||||
在新打开的窗口中,可以填写表信息
|
||||
|
||||

|
||||
我就问你看到这个窗口兴奋不兴奋!!!
|
||||
|
||||
顶部可以填写表名、表注释,中间可以点击右侧绿色+号添加列,列类型 type 也是能自动补全,default 右侧的消息框图标点击后能对列添加注释,旁边的几个 tab 可以设置索引及外键
|
||||
|
||||
所有这些操作的 DDL 都会直接在底部显示
|
||||
|
||||

|
||||
我就问你怕不怕
|
||||
|
||||
表建完后,可以点击下图中的 table 图标,打开表查看视图
|
||||
|
||||

|
||||
可以查看表的数据,也能查看 DDL 语句
|
||||
|
||||
### 数据库导出
|
||||
|
||||
这些基本功能的设计、体验,已经惊艳到我了,接下来就是数据的导出。
|
||||
|
||||
DataGrip 的导出功能也是相当强大
|
||||
|
||||
选择需要导出数据的表,右键,Dump Data To File
|
||||
|
||||

|
||||
即可以导出 insert、update 形式的 sql 语句,也能导出为 html、csv、json 格式的数据
|
||||
|
||||
也可以在查询结果视图中导出
|
||||
|
||||

|
||||
点击右上角下载图标,在弹出窗口中可以选择不同的导出方式,如 sql insert、sql update、csv 格式等
|
||||
|
||||

|
||||
|
||||
如果是导出到 csv 格式,还能控制导出的格式
|
||||
|
||||

|
||||
|
||||
导出后用 excel 打开是这种结果
|
||||
|
||||

|
||||
除了能导出数据外,还能导入数据
|
||||
|
||||
选择表,右键->Import from File,选择要导入的文件
|
||||
|
||||

|
||||
注意,导出的时候如果勾选了左侧的两个 header 选项,导入的时候如果有 header,也要勾选,不然会提示列个数不匹配
|
||||
|
||||
## 小技巧
|
||||
|
||||
### 导航+全局搜索
|
||||
|
||||
#### 关键字导航
|
||||
|
||||
当在 datagrip 的文本编辑区域编写 sql 时,按住键盘 Ctrl 键不放,同时鼠标移动到 sql 关键字上,比如表名、字段名称、或者是函数名上,鼠标会变成手型,关键字会变蓝,并加了下划线,点击,会自动定位到左侧对象树,并选中点击的对象
|
||||
|
||||

|
||||
|
||||
#### 快速导航到指定的表、视图、函数等
|
||||
|
||||
在 datagrip 中,使用 Ctrl+N 快捷键,弹出一个搜索框,输入需要导航的名称,回车即可
|
||||
|
||||

|
||||
|
||||
#### 全局搜索
|
||||
|
||||
连续两次按下 shift 键,或者鼠标点击右上角的搜索图标,弹出搜索框,搜索任何你想搜索的东西
|
||||
|
||||

|
||||
|
||||
#### 结果集搜索
|
||||
|
||||
在查询结果集视图区域点击鼠标,按下 Ctrl+F 快捷键,弹出搜索框,输入搜索内容,支持正则表达式、过滤结果
|
||||
|
||||

|
||||
|
||||
#### 导航到关联数据
|
||||
|
||||
表之间会有外检关联,查询的时候,能直接定位到关联数据,或者被关联数据,例如 user1 表有个外检字段 classroom 指向 classroom 表的主键 id,在查询 classroom 表数据的时候,可以在 id 字段上右键,go to,referencing data
|
||||
|
||||

|
||||
选择要显示第一条数据还是显示所有数据
|
||||
|
||||

|
||||
会自动打开关联表的数据
|
||||
|
||||

|
||||
相反,查询字表的数据时,也能自动定位到父表
|
||||
|
||||
### 数据转换
|
||||
|
||||
#### 结果集数据过滤
|
||||
|
||||
对于使用 table edit(对象树中选中表,右键->table editor)打开的结果集,可以使用条件继续过滤结果集,如下图所示,可以在结果集左上角输入款中输入 where 条件过滤
|
||||
|
||||

|
||||
也可以对着需要过滤数据的列右键,filter by 过滤
|
||||
|
||||

|
||||
|
||||
#### 行转列
|
||||
|
||||
对于字段比较多的表,查看数据要左右推动,可以切换成列显示,在结果集视图区域使用 Ctrl+Q 快捷键
|
||||
|
||||

|
||||
|
||||
#### 变量重命名
|
||||
|
||||
鼠标点击需要重命名的变量,按下 Shift+F6 快捷键,弹出重命名对话框,输入新的名称
|
||||
|
||||

|
||||
|
||||
#### 自动检测无法解析的对象
|
||||
|
||||
如果表名、字段名不存在,datagrip 会自动提示,此时对着有问题的表名或字段名,按下 Alt+Enter,会自动提示是否创建表或添加字段
|
||||
|
||||

|
||||
|
||||
#### 权限定字段名
|
||||
|
||||
对于查询使用表别名的,而字段中没有使用别名前缀的,datagrip 能自动添加前缀,鼠标停留在需要添加别名前缀的字段上,使用 Alt+Enter 快捷键
|
||||
|
||||

|
||||
|
||||
### 格式化
|
||||
|
||||
#### \*通配符自动展开
|
||||
|
||||
查询的时候我们会使用 select *查询所有列,这是不好的习惯,datagrip 能快速展开列,光标定位到*后面,按下 Alt+Enter 快捷键
|
||||
|
||||

|
||||
|
||||
#### 大写自动转换
|
||||
|
||||
sql 使用大写形式是个好的习惯,如果使用了小写,可以将光标停留在需要转换的字段或表名上,使用 Ctrl+shift+U 快捷键自动转换
|
||||
|
||||
#### sql 格式化
|
||||
|
||||
选中需要格式化的 sql 代码,使用 Ctrl+Alt+L 快捷键
|
||||
|
||||
datagrip 提供了一个功能强大的编辑器,实现了 notepad++的列编辑模式
|
||||
|
||||
### 列编辑
|
||||
|
||||
#### 多光标模式
|
||||
|
||||
在编辑 sql 的时候,可能需要同时输入或同时删除一些字符,按下 alt+shift,同时鼠标在不同的位置点击,会出现多个光标
|
||||
|
||||

|
||||
|
||||
#### 代码注释
|
||||
|
||||
选中要注释的代码,按下 Ctrl+/或 Ctrl+shift+/快捷键,能注释代码,或取消注释
|
||||
|
||||

|
||||
|
||||
#### 列编辑
|
||||
|
||||
按住键盘 Alt 键,同时按下鼠标左键拖动,能选择多列,拷贝黏贴等操作
|
||||
|
||||

|
||||
|
||||
### 历史记录
|
||||
|
||||
#### 代码历史
|
||||
|
||||
在文本编辑器中,邮件,local history,show history,可以查看使用过的 sql 历史
|
||||
|
||||

|
||||
|
||||
#### 命令历史
|
||||
|
||||

|
@ -1,92 +0,0 @@
|
||||
---
|
||||
title: DBeaver:开源数据库管理工具
|
||||
category: 数据库
|
||||
tag:
|
||||
- 开发工具
|
||||
---
|
||||
|
||||
# DBeaver:开源数据库管理工具。
|
||||
|
||||
[《再见,Navicat!同事安利的这个IDEA的兄弟,真香!》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247489523&idx=1&sn=4e96972842bdcea2e05cb267d17c5e8e&chksm=cea25838f9d5d12e45a9939370eccf2bff7177038e70437ea0e01d64030118852ee66ae72284&token=2000865596&lang=zh_CN#rd) 这篇文章发了之后很多人抱怨Datagrip 的占用内存太大,很多人推荐了 DBeaver 这款开源免费的数据库管理工具。于是,我昨夜简单体验了一下 DBeaver ,然后写了这篇文章。
|
||||
|
||||
## DBeaver 概览
|
||||
|
||||
DBeaver 是一个基于 Java 开发 ,并且支持几乎所有的数据库产品的开源数据库管理工具。
|
||||
|
||||
DBeaver 社区版不光支持关系型数据库比如MySQL、PostgreSQL、MariaDB、SQLite、Oracle、Db2、SQL Server,还比如 SQLite、H2这些内嵌数据库。还支持常见的全文搜索引擎比如 Elasticsearch 和 Solr、大数据相关的工具比如Hive和 Spark。
|
||||
|
||||

|
||||
|
||||
甚至说,DBeaver 的商业版本还支持各种 NoSQL 数据库。
|
||||
|
||||

|
||||
|
||||
## 使用
|
||||
|
||||
**DBeaver 虽然小巧,但是功能还是十分强大的。基本的表设计、SQL执行、ER图、数据导入导出等等常用功能都不在话下。**
|
||||
|
||||
**我下面只简单演示一下基本的数据库的创建以及表的创建。**
|
||||
|
||||
### 下载安装
|
||||
|
||||
官方网提供的下载地址:https://dbeaver.io/download/ ,你可以根据自己的操作系统选择合适的版本进行下载安装。
|
||||
|
||||
比较简单,这里就不演示了。
|
||||
|
||||
### 连接数据库
|
||||
|
||||
**1.选择自己想要的连接的数据库,然后点击下一步即可(第一次连接可能需要下载相关驱动)。**
|
||||
|
||||
我这里以MySQL为例。
|
||||
|
||||

|
||||
|
||||
**2.输入数据库的地址、用户名和密码等信息,然后点击完成即可连接**
|
||||
|
||||
点击完成之前,你可以先通过左下方的测试连接来看一下数据库是否可以被成功连接上。
|
||||
|
||||

|
||||
|
||||
### 新建数据库
|
||||
|
||||
右键-> 新建数据库(MySQL 用户记得使用 utf8mb4而不是 utf8)
|
||||
|
||||

|
||||
|
||||
### 数据库表相关操作
|
||||
|
||||
#### 新建表
|
||||
|
||||

|
||||
|
||||
#### 新建列
|
||||
|
||||

|
||||
|
||||
#### 创建约束(主键、唯一键)
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
#### 插入数据
|
||||
|
||||
我们通过 SQL 编辑器插入数据:
|
||||
|
||||

|
||||
|
||||
```java
|
||||
INSERT into user(id,name,phone,password) values ('A00001','guide哥','181631312315','123456');
|
||||
INSERT into user(id,name,phone,password) values ('A00002','guide哥2','181631312313','123456');
|
||||
INSERT into user(id,name,phone,password) values ('A00003','guide哥3','181631312312','123456');
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
总的来说,简单体验之后感觉还是很不错的,占用内存也确实比 DataGrip 确实要小很多。
|
||||
|
||||
各位小伙伴可以自行体验一下。毕竟免费并且开源,还是很香的!
|
||||
|
||||
|
||||
|
||||
|
@ -1,301 +0,0 @@
|
||||
---
|
||||
title: screw:一键生成数据库文档,堪称数据库界的Swagger
|
||||
category: 数据库
|
||||
tag:
|
||||
- 开发工具
|
||||
---
|
||||
|
||||
在项目中,我们经常需要整理数据库表结构文档。
|
||||
|
||||
一般情况下,我们都是手动整理数据库表结构文档,当表结构有变动的时候,自己手动进行维护。
|
||||
|
||||
数据库表少的时候还好,数据库表多了之后,手动整理和维护数据库表结构文档简直不要太麻烦,而且,还非常容易出错!
|
||||
|
||||
**有没有什么好用的工具帮助我们自动生成数据库表结构文档呢?**
|
||||
|
||||
当然有!Github 上就有一位朋友开源了一款数据库表结构文档自动生成工具—— **screw** 。
|
||||
|
||||
项目地址: https://github.com/pingfangushi/screw 。
|
||||
|
||||

|
||||
|
||||
screw 翻译过来的意思就是螺丝钉,作者希望这个工具能够像螺丝钉一样切实地帮助到我们的开发工作。
|
||||
|
||||
目前的话,screw 已经支持市面上大部分常见的数据库比如 MySQL、MariaDB、Oracle、SqlServer、PostgreSQL、TiDB。
|
||||
|
||||
另外,screw 使用起来也非常简单,根据官网提示,不用 10 分钟就能成功在本地使用起来!
|
||||
|
||||
## 快速入门
|
||||
|
||||
为了验证 screw 自动生成数据库表结构文档的效果,我们首先创建一个简单的存放博客数据的数据库表。
|
||||
|
||||
```sql
|
||||
CREATE TABLE `blog` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`title` varchar(255) NOT NULL COMMENT '博客标题',
|
||||
`content` longtext NOT NULL COMMENT '博客内容',
|
||||
`description` varchar(255) DEFAULT NULL COMMENT '博客简介',
|
||||
`cover` varchar(255) DEFAULT NULL COMMENT '博客封面图片地址',
|
||||
`views` int(11) NOT NULL DEFAULT '0' COMMENT '博客阅读次数',
|
||||
`user_id` bigint(20) DEFAULT '0' COMMENT '发表博客的用户ID',
|
||||
`channel_id` bigint(20) NOT NULL COMMENT '博客分类ID',
|
||||
`recommend` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否推荐',
|
||||
`top` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否置顶',
|
||||
`comment` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否开启评论',
|
||||
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='博客';
|
||||
```
|
||||
|
||||
### 基于 Java 代码
|
||||
|
||||
#### 引入依赖
|
||||
|
||||
创建一个普通的 Maven 项目即可!然后引入 screw、HikariCP、MySQL 这 3 个依赖。
|
||||
|
||||
```xml
|
||||
<!--screw-->
|
||||
<dependency>
|
||||
<groupId>cn.smallbun.screw</groupId>
|
||||
<artifactId>screw-core</artifactId>
|
||||
<version>1.0.5</version>
|
||||
</dependency>
|
||||
<!-- HikariCP -->
|
||||
<dependency>
|
||||
<groupId>com.zaxxer</groupId>
|
||||
<artifactId>HikariCP</artifactId>
|
||||
<version>3.4.5</version>
|
||||
</dependency>
|
||||
<!--MySQL-->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>8.0.20</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
你可以通过下面的地址在 mvnrepository 获取最新版本的 screw。
|
||||
|
||||
> https://mvnrepository.com/artifact/cn.smallbun.screw/screw-core
|
||||
|
||||
#### 编写代码
|
||||
|
||||
生成数据库文档的代码的整个代码逻辑还是比较简单的,我们只需要经过下面 5 步即可:
|
||||
|
||||
```java
|
||||
// 1.获取数据源
|
||||
DataSource dataSource = getDataSource();
|
||||
// 2.获取数据库文档生成配置(文件路径、文件类型)
|
||||
EngineConfig engineConfig = getEngineConfig();
|
||||
// 3.获取数据库表的处理配置,可忽略
|
||||
ProcessConfig processConfig = getProcessConfig();
|
||||
// 4.Screw 完整配置
|
||||
Configuration config = getScrewConfig(dataSource, engineConfig, processConfig);
|
||||
// 5.执行生成数据库文档
|
||||
new DocumentationExecute(config).execute();
|
||||
```
|
||||
|
||||
**1、获取数据库源**
|
||||
|
||||
对数据库以及数据库连接池进行相关配置。务必将数据库相关的配置修改成你自己的。
|
||||
|
||||
```java
|
||||
/**
|
||||
* 获取数据库源
|
||||
*/
|
||||
private static DataSource getDataSource() {
|
||||
//数据源
|
||||
HikariConfig hikariConfig = new HikariConfig();
|
||||
hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
|
||||
hikariConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/javaguide-blog");
|
||||
hikariConfig.setUsername("root");
|
||||
hikariConfig.setPassword("123456");
|
||||
//设置可以获取tables remarks信息
|
||||
hikariConfig.addDataSourceProperty("useInformationSchema", "true");
|
||||
hikariConfig.setMinimumIdle(2);
|
||||
hikariConfig.setMaximumPoolSize(5);
|
||||
return new HikariDataSource(hikariConfig);
|
||||
}
|
||||
```
|
||||
|
||||
**2、获取文件生成配置**
|
||||
|
||||
这一步会指定数据库文档生成的位置、文件类型以及文件名称。
|
||||
|
||||
```java
|
||||
/**
|
||||
* 获取文件生成配置
|
||||
*/
|
||||
private static EngineConfig getEngineConfig() {
|
||||
//生成配置
|
||||
return EngineConfig.builder()
|
||||
//生成文件路径
|
||||
.fileOutputDir("/Users/guide/Documents/代码示例/screw-demo/doc")
|
||||
//打开目录
|
||||
.openOutputDir(true)
|
||||
//文件类型
|
||||
.fileType(EngineFileType.HTML)
|
||||
//生成模板实现
|
||||
.produceType(EngineTemplateType.freemarker)
|
||||
//自定义文件名称
|
||||
.fileName("数据库结构文档").build();
|
||||
}
|
||||
```
|
||||
|
||||
如果不配置生成文件路径的话,默认也会存放在项目的 `doc` 目录下。
|
||||
|
||||
另外,我们这里指定生成的文件格式为 HTML。除了 HTML 之外,screw 还支持 Word 、Markdown 这两种文件格式。
|
||||
|
||||
不太建议生成 Word 格式,比较推荐 Markdown 格式。
|
||||
|
||||
**3、获取数据库表的处理配置**
|
||||
|
||||
这一步你可以指定只生成哪些表:
|
||||
|
||||
```java
|
||||
/**
|
||||
* 获取数据库表的处理配置,可忽略
|
||||
*/
|
||||
private static ProcessConfig getProcessConfig() {
|
||||
return ProcessConfig.builder()
|
||||
// 指定只生成 blog 表
|
||||
.designatedTableName(new ArrayList<>(Collections.singletonList("blog")))
|
||||
.build();
|
||||
}
|
||||
```
|
||||
|
||||
还可以指定忽略生成哪些表:
|
||||
|
||||
```java
|
||||
private static ProcessConfig getProcessConfig() {
|
||||
ArrayList<String> ignoreTableName = new ArrayList<>();
|
||||
ignoreTableName.add("test_user");
|
||||
ignoreTableName.add("test_group");
|
||||
ArrayList<String> ignorePrefix = new ArrayList<>();
|
||||
ignorePrefix.add("test_");
|
||||
ArrayList<String> ignoreSuffix = new ArrayList<>();
|
||||
ignoreSuffix.add("_test");
|
||||
return ProcessConfig.builder()
|
||||
//忽略表名
|
||||
.ignoreTableName(ignoreTableName)
|
||||
//忽略表前缀
|
||||
.ignoreTablePrefix(ignorePrefix)
|
||||
//忽略表后缀
|
||||
.ignoreTableSuffix(ignoreSuffix)
|
||||
.build();
|
||||
}
|
||||
```
|
||||
|
||||
这一步也可以省略。如果不指定 `ProcessConfig` 的话,就会按照默认配置来!
|
||||
|
||||
**4、生成 screw 完整配置**
|
||||
|
||||
根据前面 3 步,生成 screw 完整配置。
|
||||
|
||||
```java
|
||||
private static Configuration getScrewConfig(DataSource dataSource, EngineConfig engineConfig, ProcessConfig processConfig) {
|
||||
return Configuration.builder()
|
||||
//版本
|
||||
.version("1.0.0")
|
||||
//描述
|
||||
.description("数据库设计文档生成")
|
||||
//数据源
|
||||
.dataSource(dataSource)
|
||||
//生成配置
|
||||
.engineConfig(engineConfig)
|
||||
//生成配置
|
||||
.produceConfig(processConfig)
|
||||
.build();
|
||||
}
|
||||
```
|
||||
|
||||
**5、执行生成数据库文档**
|
||||
|
||||

|
||||
|
||||
下图就是生成的 HTML 格式的数据库设计文档。
|
||||
|
||||

|
||||
|
||||
### 基于 Maven 插件
|
||||
|
||||
除了基于 Java 代码这种方式之外,你还可以通过 screw 提供的 Maven 插件来生成数据库文档。方法也非常简单!
|
||||
|
||||
**1、配置 Maven 插件**
|
||||
|
||||
务必将数据库相关的配置修改成你自己的。
|
||||
|
||||
```xml
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>cn.smallbun.screw</groupId>
|
||||
<artifactId>screw-maven-plugin</artifactId>
|
||||
<version>1.0.5</version>
|
||||
<dependencies>
|
||||
<!-- HikariCP -->
|
||||
<dependency>
|
||||
<groupId>com.zaxxer</groupId>
|
||||
<artifactId>HikariCP</artifactId>
|
||||
<version>3.4.5</version>
|
||||
</dependency>
|
||||
<!--mysql driver-->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>8.0.20</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<configuration>
|
||||
<!--username-->
|
||||
<username>root</username>
|
||||
<!--password-->
|
||||
<password>123456</password>
|
||||
<!--driver-->
|
||||
<driverClassName>com.mysql.cj.jdbc.Driver</driverClassName>
|
||||
<!--jdbc url-->
|
||||
<jdbcUrl>jdbc:mysql://127.0.0.1:3306/javaguide-blog</jdbcUrl>
|
||||
<!--生成文件类型-->
|
||||
<fileType>MD</fileType>
|
||||
<!--打开文件输出目录-->
|
||||
<openOutputDir>true</openOutputDir>
|
||||
<!--生成模板-->
|
||||
<produceType>freemarker</produceType>
|
||||
<!--文档名称 为空时:将采用[数据库名称-描述-版本号]作为文档名称-->
|
||||
<fileName>数据库结构文档</fileName>
|
||||
<!--描述-->
|
||||
<description>数据库设计文档生成</description>
|
||||
<!--版本-->
|
||||
<version>${project.version}</version>
|
||||
<!--标题-->
|
||||
<title>数据库文档</title>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>compile</phase>
|
||||
<goals>
|
||||
<goal>run</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
```
|
||||
|
||||
**2、手动执行生成数据库文档**
|
||||
|
||||

|
||||
|
||||
我们这里指定生成的是 Markdown 格式。
|
||||
|
||||

|
||||
|
||||
下图就是生成的 Markdown 格式的数据库设计文档,效果还是非常不错的!
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
@ -1,4 +1,9 @@
|
||||
# Docker从入门到上手干事
|
||||
---
|
||||
title: Docker从入门到上手干事
|
||||
category: 开发工具
|
||||
tag:
|
||||
- Docker
|
||||
---
|
||||
|
||||
## Docker介绍
|
||||
|
||||
|
@ -1,4 +1,9 @@
|
||||
# Docker 基本概念解读
|
||||
---
|
||||
title: Docker 基本概念解读
|
||||
category: 开发工具
|
||||
tag:
|
||||
- Docker
|
||||
---
|
||||
|
||||
**本文只是对 Docker 的概念做了较为详细的介绍,并不涉及一些像 Docker 环境的安装以及 Docker 的一些常见操作和命令。**
|
||||
|
||||
|
@ -1,110 +0,0 @@
|
||||
---
|
||||
title: jadx:一款强大的反编译工具!
|
||||
category: 开发工具
|
||||
tag:
|
||||
- Java
|
||||
---
|
||||
|
||||
在[第二期开源项目推荐](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247515981&idx=1&sn=e4b9c06af65f739bdcdf76bdc35d59f6&chksm=cea1f086f9d679908bd6604b1c42d67580160d9789951f3707ad2f5de4d97aa72121d8fe777e&scene=178&cur_album_id=1345382825083895808#rd)中,我推荐了一款强大的反编译工具,我在文中提到说要写一篇专门来介绍这个神器,今天这篇文章就来了。稍有迟到,抱歉(。・_・。)ノ
|
||||
|
||||

|
||||
|
||||
jadx 是一款功能强大的反编译工具,使用起来简单方便(拖拽式操作),不光提供了命令行程序,还提供了 GUI 程序。一般情况下,我们直接使用 GUI 程序就可以了。
|
||||
|
||||
jadx 支持 Windows、Linux、 macOS,能够帮我们打开`.apk`, `.dex`, `.jar`,`.zip`等格式的文件
|
||||
|
||||
就比如说我们需要反编译一个 jar 包查看其源码的话,直接将 jar 包拖入到 jadx 中就可以了。效果如下:
|
||||
|
||||

|
||||
|
||||
再比如说我们想看看某个 apk 的源码,我们拿到 apk 之后直接拖入进 jadx 中就可以了。效果如下:
|
||||
|
||||

|
||||
|
||||
## jadx 安装
|
||||
|
||||
jadx 是一款开源软件,是可以免费使用的。我们可以在 jadx 的项目主页下载 jadx 最新版。
|
||||
|
||||
- 项目地址:https://github.com/skylot/jadx
|
||||
- 下载地址:https://github.com/skylot/jadx/releases/tag/v1.3.1
|
||||
|
||||
我们直接下载第一个即可。
|
||||
|
||||

|
||||
|
||||
下载之后,解压下载好的 jadx 压缩文件后进入 `bin` 目录即可找到可执。
|
||||
|
||||

|
||||
|
||||
- jadx:命令行版本
|
||||
- jadx-gui:图形操作界面版本
|
||||
|
||||
你也可以自己克隆源码,本地编译,这也是我比较推荐的方式。
|
||||
|
||||
```bash
|
||||
git clone https://github.com/skylot/jadx.git
|
||||
```
|
||||
|
||||
jadx 由 Java 语言编写,使用 Gradle 进行构建。克隆到本地之后,你可以直接使用 Gradle 命令进行构建:
|
||||
|
||||
```bash
|
||||
cd jadx
|
||||
# Windows 平台使用 gradlew.bat 而不是 ./gradlew
|
||||
./gradlew dist
|
||||
```
|
||||
|
||||
你也可以直接使用 IDE 打开,然后像运行普通 Java 程序那样使用它:
|
||||
|
||||

|
||||
|
||||
## jadx 使用
|
||||
|
||||
### 反编译文件
|
||||
|
||||
通过 File -> Open files... 打开需要反编译的文件或者直接将文件拖拽进 jadx 中就可以了。
|
||||
|
||||

|
||||
|
||||
从上图可以看出,jadx 支持`.apk`, `.dex`, `.jar`,`.zip`,`.class`等格式的文件。
|
||||
|
||||
### 搜索功能
|
||||
|
||||
jadx 自带强大的搜索功能,支持多种匹配模式。
|
||||
|
||||
通过 `Navigation` 即可打开搜索功能,我们可以选择搜索指定的类,方法,属性,代码,文件,甚至是注释。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### 查看类,变量或者方法使用情况
|
||||
|
||||
对于某个类、变量或者方法,我们还可以查看哪些地方使用了它。
|
||||
|
||||
直接选中对应的类、变量或者方法,然后点击右键选择 Find Usage 即可。
|
||||
|
||||

|
||||
|
||||
很快,jadx 就会帮你找出整个项目有哪些地方使用了它。
|
||||
|
||||

|
||||
|
||||
### 添加注释
|
||||
|
||||
我们还可以自定义注释到源代码中。
|
||||
|
||||
选中对应的位置之后,点击右键选择 Comment 即可。
|
||||
|
||||

|
||||
|
||||
### 反混淆
|
||||
|
||||
一般情况下,为了项目的安全,我们在打包发布一个 apk 之前都会对其代码进行混淆加密比如用无意义的短变量去重命名类、变量、方法,以免代码被轻易破解泄露。
|
||||
|
||||
经过混淆的代码在功能上是没有变化的,但是去掉了部分名称中的语义信息。
|
||||
|
||||
为了代码的易读性,我们可以对代码进行反混淆。
|
||||
|
||||
在 jadx 中,我们通过 Tools -> Deobfuscation 即可开启反混淆功能。
|
||||
|
||||

|