1.案例解读|高盛 Goldman Sachs 如何做数据库变更
2.idea格式化代码设置(idea的源码格式化)
案例解读|高盛 Goldman Sachs 如何做数据库变更
本文重点
近年,高盛采用了标准的源码 SDLC 来构建和部署应用程序。这包括管理新系统和现有系统的源码数据库 schema ,这比管理应用程序代码更加困难。源码在本文中,源码我们将描述我们最近开源的源码由反码求源码数据库部署工具 Obevo 是如何帮助高盛的企业级应用程序的数据库纳入 SDLC 管控的。
企业的源码数据库部署的问题
将数据库定义引入到标准的 SDLC 流程中是具有挑战性的,尤其是源码考虑到数据库的状态以及执行增量迁移的需求。因此,源码许多应用程序没有自动化或流畅的源码数据库部署过程。我们的源码目标是将数据库 schema 管理纳入与应用程序相同的 SDLC 中:通过将所有定义提交到版本控制系统 (VCS) 并通过标准的构建/发布机制部署。
这项工作由我们实际数据库系统使用案例的源码多样性而变得复杂:
无论使用何种案例,由于大量分布各地的源码开发人员都在进行变更,SDLC 本身都有复杂之处。源码
虽然现有的源码开源工具可以处理简单的案例,它们无法处理我们一些现有系统的规模和复杂度。但是我们不能放任这些现有系统没有适当的 SDLC:它们是正在开发和发布的关键系统。
因此,我们开发了 Obevo,一个能处理所有此类使用案例的工具。Obevo 的关键差异化因素在于能够 按文件维护数据库对象(类似于更常见的 按文件存储类定义),同时仍管理增量部署。
在本文中,我们将讨论数据库部署问题,然后演示基于对象的项目结构如何帮助我们优雅地管理各种对象和环境类型的上百上千个 schema 对象。
数据库对象类型(有状态 vs 无状态)
首先,我们来回顾一下不同数据库对象类型的部署语义,因为这会影响工具的设计。
有状态对象(例如:表) 需要增量修改其定义,而不是完全的定义替换。以下是添加两列到 MyTable 中的示例:
理想情况下,我们可以通过一个 SQL 语句来把数据库带到终态,该 SQL 定义了一个具有四列的表。不过 SQL 其实无法提供可行的解决方案:
相反,关系型数据库管理系统 (RDBMS) 允许用户使用 ALTER 语句来修改现有表。
某些列更新可能需要进行数据迁移,例如从一个表中移动列数据到另一个表中。
因此,每个对象都是应用多个脚本片段的结果;初始脚本片段创建对象,后续脚本片段修改对象。
无状态对象(例如:视图,存储过程) 可以通过指定其完整对象定义来创建和修改。
我们也将静态数据文件(代码或参考数据表)视为无状态对象。虽然它涉及到表数据,但是这些数据在你的脚本中已经完全定义,并且可以通过批量 delete + insert 或选择性 insert + update + delete 操作部署到表中。
数据库部署工具原则
Martin Fowler 的 Evolutionary Database Design 对基于源头控制的数据库部署工具遵循的主要原则进行了精彩阐述,下面是其中一些具体相关的要点。
基于 UI 的管理可能适用于非技术用户,但我们建议开发团队将其数据库脚本片段存储在源代码控制中(和对待其它应用程序一样),萝莉社源码并以自动化方式调用部署。
在我们看来,在企业环境中,例如在当前数据库表状态和代码完整视图之间自动计算迁移是有风险的。
数据库部署工具要求
我们根据以下需求评估数据库部署工具的处理能力:
A) 将增量更改部署到现有数据库中 这是数据库部署工具的主要功能;大多数生产环境都是通过此方式执行的。在一些非生产环境中,尤其是在发布到生产之前的 QA 环境中进行测试时,也会使用此方法。
B) 将完整 schema 部署到空白数据库中 开发人员可能希望将其部署到一个空白沙盒数据库以进行以下操作:
这可以通过以下几种方式来完成:
C) 易于维护和阅读 在我们进行数据库部署改进之前,我们看到一些团队为每个数据库对象维护一个文件,其中包含对象的定义,尽管这些文件并未用于部署。
这似乎没有意义,但我们获得了一些见解:
通用数据库部署工具设计主要部署算法
根据上述原则,大多数基于源代码控制的数据库部署工具(包括 Obevo)的工作方式如下:
有状态和无状态对象部署语义
对象类型对变更集计算语义会产生影响。
为了演示有状态用例,我们将 deploy 部署包 v1 以获取右侧表。
假设有人修改了 M3 并重命名了列,然后我们进行重新部署。我们期望会发生什么?
工具检测到不匹配:
因此,一般规则是:有状态对象脚本一旦部署就不能修改。
某些选择性功能可以让我们在需要时绕过这个问题,例如:
数据库部署工具的实现选择
考虑到它们的底层算法相似,部署工具因几个实现要点而异。
1)如何将脚本片段组织成文件
有如下几种方式将脚本片段进行分组:
2)如何排序部署要部署的脚本片段
需要考虑:
接下来,我们将详细介绍 Obevo 是如何解决这两个问题的。
Obevo 设计:基于对象的脚本组织
我们主要的数据库部署问题是如何管理 schema 中大量对象的开发、维护和部署。同时,还有开发人员在编写应用程序时处理他们的数据库对象。
因此,我们希望提供一种对开发人员来说易于理解的体验,这导致了我们根据对象名称组织脚本。在本节中,我们将深入探讨这些详细信息。(该结构增加了一些排序方面的挑战,下一节详细介绍)
项目结构基础
我们根据适用于那些对象的脚本片段来组织,以下是一个示例。
文件结构根据对象是否具有状态而不同。
分析:无状态对象处理
基于对象的结构对于无状态对象方便很多,因为完整的无状态对象定义可以在文件中维护,并且可以就地修改。
作为比较,在增量有状态的方式中,技术上可以处理无状态对象部署,例如作为持久化多个版本的增量脚本。然而,这会导致数据库脚本存在冗余,因为对象在多个版本中发生变化。恒歌数码源码
分析:可读性
从维护的角度来看,这个项目结构有一些优势:
为了进行比较,可以拿一个项目结构的例子来说明,其中一个文件与迁移或发布相关联,因为许多工具都支持这种方式。这可能会导致一些问题:
从代码审查/发布审查角度来看:面向对象的结构意味着特定版本中所有更改都会分散在文件中。乍一看,似乎很难审核要部署到下一个版本的脚本片段。但是,我们仍然可以通过比较 VCS 历史记录和标签来审核发布的代码 - 就像处理应用程序代码一样。
分析:对于开发者的好处
使用 Obevo 项目结构,开发人员也好处多多。
由于对象的脚本片段放置在单个文件中,我们可以轻松地在测试中部署单个对象,这对于像在内存数据库中进行数据访问 API 的单元测试等情况非常有用。
开发人员也可以利用 ORM 工具从应用程序生成 DDL,并与迁移脚本进行协调。简洁起见,这里我们不深入讨论,但你可以在文档中了解更多。
Obevo 设计: 通过依赖性分析进行排序
虽然选择基于对象的项目组织方式提供了上一节中提到的许多好处,但它也使排序变得更加复杂。
对象可以互相依赖,随着我们把 schema 扩展到数百或数千个对象,手动指定顺序变得越来越困难。
让我们描述一下我们是如何克服这些挑战的。
排序算法
不是所有的脚本片段都互相依赖,因此我们在对象依赖声明的明显约束下是有一些灵活性的。
因此,我们使用一个简单的图算法来设计解决方案。
比如以下示例语句:
注意以下几点:
这适合使用有向图表示,其中图节点是脚本片段,边是顺序依赖关系。
我们现在可以使用拓扑排序算法得出一个可接受的顺序,以保持这些顺序约束并成功部署我们的数据库。
拓扑排序可以产生许多可接受的顺序,但是我们会调整算法使用方式以给出单一一致的顺序,以便在各个环境中具有一致性。
现在最后一个细节:如何在脚本片段中声明依赖关系?
依赖声明和发现
我们发现最简单的方法是在脚本中声明依赖项。请参见下面 TABLE_B.fkA 脚本片段中的dependencies 属性。
然而,对于大型数据库来说这并不友好(想象一下注释数百或数千个对象),因此我们需要一种自动检测依赖关系的方式,同时仍允许开发者覆盖。
我们使用两种策略来推断依赖关系:
有状态迁移的内部对象依赖关系:
我们允许有状态的对象定义多个脚本。很自然地,我们认为在同一个文件中编写的迁移按照它们编写的顺序进行部署,因此我们推断出这样的依赖关系(下图)。
通过文本搜索实现跨对象依赖关系
为检测跨对象的go远控源码依赖关系,我们需要搜索脚本内容以查找相关对象。
从技术上讲,理想的方法是解析 SQL 以查找这些对象。然而,这非常困难,因为我们必须理解所有支持的 DBMS 类型的 SQL 语法。
相反,Obevo 采用简单的方法:在你的项目中选择通过字符串搜索发现的对象名称,并假定它们是依赖项。
实现说明:
以下是我们先前示例的算法结果:
如果出现误报匹配(例如由于注释)或假阴,开发人员可以根据需要指定排除或包含覆盖。
乍一看,可能很难想象这适用于实际用例,但我们已经成功地使用了这种技术来部署许多复杂的 schema ,其中一些跨越数千个对象,如表、存储过程、视图等。
想看实例的话请查看我们的 kata 课程,该课程是个通过一个大型数据库 schema 反向工程的示例。
跨多个表处理数据迁移
我们快速过一下这种用法(即将数据从旧列移动到新列,然后删除旧列),因为最开始将基于对象的文件结构概念应用于此听起来更复杂。
Obevo 可以处理这个问题 - 简而言之,我们提供了「迁移」对象的概念来帮助解决此问题,它:
如需更多信息,请查看 文档。
现有数据库 schema 的逆向工程
希望我们成功展示了你可以使用 Obevo 部署复杂的数据库 schema 。但是,为了让现有系统真正加入到 Obevo 中,我们必须使开发人员能够轻松地对现有数据库进行逆向工程。
解决这个问题并不容易,因为不幸的是,在不同的 DBMS 类型之间没有一个完美的统一 API
因此,我们选择与供应商提供的反向工程工具集成(见下表)。一些工具只需将完整架构输出到单个文件中即可,但我们提供了一个实用程序,可以将这些文件转换为 Obevo 基于对象结构,并利用简单字符串解析和正则表达式技术。相比 Java API,我们认为这种技术更可靠于现有系统中,特别是核心供应商工具最懂得他们自己架构。
数据库管理系统
结论
虽然有许多开源工具可用于数据库部署,但我们认为更复杂的使用情况需要更强大的工具支持。
通过 Obevo,我们旨在支持所有类型的系统;无论是通过测试功能和易于基于对象维护来增强现代系统的生产力,还是通过促进长期存在但以前没有 SDLC 管控的系统加入管控重获新生。
这里还有更多未涉及到的特性和数据库部署活动(例如回滚、分阶段部署、赞呗支付源码内存 DB 测试、多 schema 管理)。欢迎访问我们的 Github,文档和 Kata 课程,了解更多关于 Obevo 以及如何将该工具应用到你的系统中。
Bytebase 团队的读后感
通过解读高盛如何变更数据库的案例,我们可以一窥企业级数据库变更的复杂度。这篇文章的精华在于当中对于数据库变更工具设计方案选择的亮点归纳:
Obevo 相比于业界其他的工具,在这两点上都选择了非主流,但是可以更加自动化的方案:
对于高盛来说这是可行的,因为在一个单一组织内,可以通过各种约束,保证操作的一致性,然后基于这样的统一,提高自动化。但是如果要作为一个对外输出的方案,就未必能应付不同组织不同的操作习惯。 Bytebase 团队接触到 Obevo 也是一个潜在客户在调研各种方案时聊起的。相比于 Obevo 而言,Bytebase 提供的是数据库变更,查询,安全,治理一体化方案,而且还提供了可视化界面。
你可以访问 官网,免费注册云账号,立即体验 Bytebase。
idea格式化代码设置(idea的格式化)
1. idea的格式化
代码保存成文件 需要经过预处理,编译,汇编,链接
一:预处理
预处理主要是处理源代码中以#开始的预编译指令,比如#include,#define
将所有的#define删除,展开宏定义
处理所有的条件编译指令#if,#ifdef,#elif,#else,#endif
处理#include预编译指令,将被包含的头文件插入该预编译指令的位置,是个递归的过程
删除所有的注释 //与/**/
添加行号与文件名表示,用于调试符号与编译错误或警告报错
保留#pragma编译指令,改指令 编译器需要使用
二:编译
编译过程就是把预编译生成的文件进行一系列词法分析(也叫扫描),语法分析,语义分析,源代码优化,汇编代码生成,目标代码优化
词法分析:根据分隔符,将代码分割成一系列的记号
比如: int a = (a+3)*(2+5);
将会 变成以下记号: int,a,=,(,a,+,3,),(,2,+,5,)
词法分析产生的记号可以分为:关键字,标识符,字面量(数字,字符串,即常量),特殊符号(加号,等号等),在识别记号时,会将标识符放入符号表,字面量放入文字表
语法分析:根据记号进行语法分析,产生语法树,整个分析过程采用上下文无关语法(语法树就是以表达式为节点的树),仅仅是完成对表达式的语法层面进行分析
语义分析:语义分析对语法树中的表达式标识类型,对于类型不匹配,编译器将会报错,如果有些类型需要做隐式转换,将会在语法树中插入对应的节点
源代码优化生成汇编代码:int a = (a+3)*(2+5); 将会被优化为int a = (a+3)*(7)
三:汇编
汇编即根据汇编指令翻译为机器指令
四:链接
链接主要包含 地址和空间分配,符号决议,重定位
2. idea如何调整代码格式
java源代码是txt格式的.java文件,用记事本就可以打开。 用eclipse打开java文件的方式是: 如果java文件是一个eclipse工程(根目录带有.project文件),用file/import/general/exist java project/(大概是)然后找到你的目录。 否则需要自己新建一个工程file/new/java project 然后把java文件拷贝到.src目录下。
.class文件是直接的编译好的文件,可以用jad把.class文件反编译成java文件,不过反编译的代码和原来的代码不一定完全一样。
3. idea中如何格式化代码
IntelliJ Idea 常用快捷键列表
Alt+Insert,可以新建文件、生成构造器、生成Getter/Setter等
Shift+F6,重构 – 重命名
Ctrl+X,剪切行
Ctrl+D,复制行
Ctrl+Alt+V,可以引入变量。例如:new String(); 自动导入变量定义
Ctrl+P,可以显示参数信息
Ctrl+F,可以显示当前文件的结构
Ctrl+Alt+T,可以把代码包在一个块内,例如:try/catch
Ctrl+Alt+L,格式化代码
Ctrl+Alt+O,优化导入的类和包
Ctrl+Shift+Space,自动补全代码
Ctrl+空格,代码提示(与系统输入法快捷键冲突)
Alt+Shift+Up/Down,上/下移一行
Ctrl+/或Ctrl+Shift+/,注释(//或者/**/)
Ctrl+J,自动代码(例如:serr)
Ctrl+H,显示类结构图(类的继承层次)
Ctrl+Q,显示注释文档
Alt+F1,查找代码所在位置
Alt+1,快速打开或隐藏工程面板
Ctrl+Alt+left/right,返回至上次浏览的位置
Alt+left/right,切换代码视图
Alt+Up/Down,在方法间快速移动定位
Ctrl+Shift+Up/Down,向上/下移动语句
F2 或 Shift+F2,高亮错误或警告快速定位
Tab,代码标签输入完成后,按 Tab,生成代码
Ctrl+Shift+F7,高亮显示所有该文本,按 Esc 高亮消失
Alt+F3,逐个往下查找相同文本,并高亮显示
Ctrl+Up/Down,光标中转到第一行或最后一行下
Ctrl+B/Ctrl+Click,快速打开光标处的类或方法(跳转到定义处)
Ctrl+Alt+B,跳转到方法实现处
Ctrl+Shift+Backspace,跳转到上次编辑的地方
Ctrl+O,重写方法
Ctrl+Alt+Space,类名自动完成
Ctrl+Alt+Up/Down,快速跳转搜索结果
Ctrl+Shift+J,整合两行
Alt+F8,计算变量值
Ctrl+Shift+V,可以将最近使用的剪贴板内容选择插入到文本
Ctrl+Alt+Shift+V,简单粘贴
Shift+Esc,不仅可以把焦点移到编辑器上,而且还可以隐藏当前(或最后活动的)工具窗口
F,把焦点从编辑器移到最近使用的工具窗口
Shift+F1,要打开编辑器光标字符处使用的类或者方法 Java 文档的浏览器
Ctrl+W,可以选择单词记忆语句继续行继而函数
Ctrl+Shift+W,取消选择光标所在词
Alt+F7,查找整个工程中使用的某一个类、方法或者变量的位置
Ctrl+I,实现方法
Ctrl+Shift+U,大小写转化
Ctrl+Y,删除当前行
Shift+Enter,向下插入新行
psvm/sout,main/System.out.println(); Ctrl+J,查看更多
Ctrl+Shift+F,全局查找
Ctrl+F,查找/Shift+F3,向上查找/F3,向下查找
Ctrl+Shift+S,高级搜索
Ctrl+U,转到父类
Ctrl+Alt+S,打开设置对话框
Alt+Shift+Inert,开启/关闭列选择模式
Ctrl+Alt+Shift+S,打开当前项目/模块属性
Ctrl+G,定位行
Alt+Home,跳转到导航栏
Ctrl+Enter,上插一行
Ctrl+Backspace,按单词删除
Ctrl+”+/-”,当前方法展开、折叠
Ctrl+Shift+”+/-”,全部展开、折叠
调试部分、编译
Ctrl+F2,停止
Alt+Shift+F9,选择 Debug
Alt+Shift+F,选择 Run
Ctrl+Shift+F9,编译
Ctrl+Shift+F,运行
Ctrl+Shift+F8,查看断点
F8,不过
F7,步入
Shift+F7,智能步入
Shift+F8,步出
Alt+Shift+F8,强制步过
Alt+Shift+F7,强制步入
Alt+F9,运行至光标处
Ctrl+Alt+F9,强制运行至光标处
F9,恢复程序
Alt+F,定位到断点
Ctrl+F8,切换行断点
Ctrl+F9,生成项目
Alt+1,项目
Alt+2,收藏
Alt+6,TODO
Alt+7,结构
Ctrl+Shift+C,复制路径
Ctrl+Alt+Shift+C,复制引用,必须选择类名
Ctrl+Alt+Y,同步
Ctrl+~,快速切换方案(界面外观、代码风格、快捷键映射等菜单)
Shift+F,还原默认布局
Ctrl+Shift+F,隐藏/恢复所有窗口
Ctrl+F4,关闭
Ctrl+Shift+F4,关闭活动选项卡
Ctrl+Tab,转到下一个拆分器
Ctrl+Shift+Tab,转到上一个拆分器
重构
Ctrl+Alt+Shift+T,弹出重构菜单
Shift+F6,重命名
F6,移动
F5,复制
Alt+Delete,安全删除
Ctrl+Alt+N,内联
查找
Ctrl+F,查找
Ctrl+R,替换
F3,查找下一个
Shift+F3,查找上一个
Ctrl+Shift+F,在路径中查找
Ctrl+Shift+R,在路径中替换
Ctrl+Shift+S,搜索结构
Ctrl+Shift+M,替换结构
Alt+F7,查找用法
Ctrl+Alt+F7,显示用法
Ctrl+F7,在文件中查找用法
Ctrl+Shift+F7,在文件中高亮显示用法
4. idea 格式化代码
1、编辑
Ctrl + Space 基本的代码完成(类、方法、属性)
Ctrl + Alt + Space 快速导入任意类
Ctrl + Shift + Enter 语句完成
Ctrl + P 参数信息(在方法中调用参数)
Ctrl + Q 快速查看文档
F1 外部文档
Shift + F1 外部文档,进入web文档主页
Ctrl + Shift + Z --> Redo 重做
Ctrl + 鼠标 简介/进入代码定义
Ctrl + F1 显示错误描述或警告信息
Alt + Insert 自动生成代码
Ctrl + O 重新方法
Ctrl + Alt + T 选中
Ctrl + / 行注释/取消行注释
Ctrl + Shift + / 块注释
Ctrl + W 选中增加的代码块
Ctrl + Shift + W 回到之前状态
Ctrl + Shift + ]/[ 选定代码块结束、开始
Alt + Enter 快速修正
Ctrl + Alt + L 代码格式化
Ctrl + Alt + O 优化导入
Ctrl + Alt + I 自动缩进
Tab / Shift + Tab 缩进、不缩进当前行
Ctrl+X/Shift+Delete 剪切当前行或选定的代码块到剪贴板
Ctrl+C/Ctrl+Insert 复制当前行或选定的代码块到剪贴板
Ctrl+V/Shift+Insert 从剪贴板粘贴
Ctrl + Shift + V 从最近的缓冲区粘贴
Ctrl + D 复制选定的区域或行
Ctrl + Y 删除选定的行
Ctrl + Shift + J 添加智能线
Ctrl + Enter 智能线切割
Shift + Enter 另起一行
Ctrl + Shift + U 在选定的区域或代码块间切换
Ctrl + Delete 删除到字符结束
Ctrl + Backspace 删除到字符开始
Ctrl + Numpad+/- 展开/折叠代码块(当前位置的:函数,注释等)
Ctrl + shift + Numpad+/- 展开/折叠所有代码块
Ctrl + F4 关闭运行的选项卡
2、查找/替换(Search/Replace)
F3 下一个
Shift + F3 前一个
Ctrl + R 替换
Ctrl + Shift + F 或者连续2次敲击shift 全局查找{ 可以在整个项目中查找某个字符串什么的,如查找某个函数名字符串看之前是怎么使用这个函数的}
Ctrl + Shift + R 全局替换
3、运行(Running)
Alt + Shift + F 运行模式配置
Alt + Shift + F9 调试模式配置
Shift + F 运行
Shift + F9 调试
Ctrl + Shift + F 运行编辑器配置
Ctrl + Alt + R 运行manage.py任务
4、调试(Debugging)
F8 跳过
F7 进入
Shift + F8 退出
Alt + F9 运行游标
Alt + F8 验证表达式
Ctrl + Alt + F8 快速验证表达式
F9 恢复程序
Ctrl + F8 断点开关
Ctrl + Shift + F8 查看断点
5、导航(Navigation)
Ctrl + N 跳转到类
Ctrl + Shift + N 跳转到符号
Alt + Right/Left 跳转到下一个、前一个编辑的选项卡
F 回到先前的工具窗口
Esc 从工具窗口回到编辑窗口
Shift + Esc 隐藏运行的、最近运行的窗口
Ctrl + Shift + F4 关闭主动运行的选项卡
Ctrl + G 查看当前行号、字符号
Ctrl + E 当前文件弹出,打开最近使用的文件列表
Ctrl+Alt+Left/Right 后退、前进
Ctrl+Shift+Backspace 导航到最近编辑区域
Alt + F1 查找当前文件或标识
Ctrl+B / Ctrl+Click 跳转到声明
Ctrl + Alt + B 跳转到实现
Ctrl + Shift + I 查看快速定义
Ctrl + Shift + B 跳转到类型声明
Ctrl + U 跳转到父方法、父类
Alt + Up/Down 跳转到上一个、下一个方法
Ctrl + ]/[ 跳转到代码块结束、开始
Ctrl + F 弹出文件结构
Ctrl + H 类型层次结构
Ctrl + Shift + H 方法层次结构
Ctrl + Alt + H 调用层次结构
F2 / Shift + F2 下一条、前一条高亮的错误
F4 / Ctrl + Enter 编辑资源、查看资源
Alt + Home 显示导航条F书签开关
Ctrl + Shift + F 书签助记开关
Ctrl + #[0-9] 跳转到标识的书签
Shift + F 显示书签
6、搜索相关(Usage Search)
Alt + F7/Ctrl + F7 文件中查询用法
Ctrl + Shift + F7 文件中用法高亮显示
Ctrl + Alt + F7 显示用法
7、重构(Refactoring)
F5复制F6剪切
Alt + Delete 安全删除
Shift + F6 重命名
Ctrl + F6 更改签名
Ctrl + Alt + N 内联
Ctrl + Alt + M 提取方法
Ctrl + Alt + V 提取属性
Ctrl + Alt + F 提取字段
Ctrl + Alt + C 提取常量
Ctrl + Alt + P 提取参数
8、控制VCS/Local History
Ctrl + K 提交项目
Ctrl + T 更新项目
Alt + Shift + C 查看最近的变化
Alt + BackQuote(’)VCS 快速弹出
9、模版(Live Templates)
Ctrl + Alt + J 当前行使用模版
Ctrl +J 插入模版
、基本(General)
Alt + #[0-9] 打开相应的工具窗口
Ctrl + Alt + Y 同步
Ctrl + Shift + F 最大化编辑开关
Alt + Shift + F 添加到最喜欢
Alt + Shift + I 根据配置检查当前文件
Ctrl + BackQuote(’) 快速切换当前计划
Ctrl + Alt + S 打开设置页
Ctrl + Shift + A 查找编辑器里所有的动作
Ctrl + Tab 在窗口间进行切换
Mac快捷键大全
Mac键盘符号和修饰键说明
CommandShiftOptionControlReturn/EnterDelete向前删除键(Fn+Delete)↑ 上箭头
↓ 下箭头
← 左箭头
→ 右箭头
Page Up(Fn+↑)Page Down(Fn+↓)Home Fn + ←
End Fn + →
右制表符(Tab键)左制表符(Shift+Tab)Escape (Esc)Editing(编辑)
Space 基本的代码补全(补全任何类、方法、变量)Space 智能代码补全(过滤器方法列表和变量的预期类型)自动结束代码,行末自动添加分号P 显示方法的参数信息J, Mid. button click 快速查看文档F1 查看外部文档(在某些代码上会触发打开浏览器显示相关文档)+鼠标放在代码上 显示代码简要信息F1 在错误或警告处显示具体描述信息N, N 生成代码(getter、setter、构造函数、hashCode/equals,toString)O 覆盖方法(重写父类方法)I 实现方法(实现接口中的方法)T 包围代码(使用if.else, try.catch, for, synchronized等包围选中的代码)/ 注释/取消注释与行注释/ 注释/取消注释与块注释↑ 连续选中代码块↓ 减少当前选中的代码块Q 显示上下文信息显示意向动作和快速修复代码L 格式化代码O 优化importI 自动缩进线/ ? 缩进代码 / 反缩进代码X 剪切当前行或选定的块到剪贴板C 复制当前行或选定的块到剪贴板V 从剪贴板粘贴V 从最近的缓冲区粘贴D 复制当前行或选定的块删除当前行或选定的块的行J 智能的将代码拼接成一行智能的拆分拼接的行开始新的一行U 大小写切换] / ?[ 选择直到代码块结束/开始删除到单词的末尾(?键为Fn+Delete)删除到单词的开头+ / ?- 展开 / 折叠代码块+ 展开所以代码块- 折叠所有代码块W 关闭活动的编辑器选项卡Search/Replace(查询/替换)
Double ? 查询任何东西
F 文件内查找G 查找模式下,向下查找G 查找模式下,向上查找R 文件内替换F 全局查找(根据路径)R 全局替换(根据路径)S 查询结构(Ultimate Edition 版专用,需要在Keymap中设置)M 替换结构(Ultimate Edition 版专用,需要在Keymap中设置)Usage Search(使用查询)
F7 / ?F7 在文件中查找用法 / 在类中查找用法F7 在文件中突出显示的用法F7 显示用法Compile and Run(编译和运行)
F9 编译ProjectF9 编译选择的文件、包或模块R 弹出 Run 的可选择菜单D 弹出 Debug 的可选择菜单R 运行D 调试R, ?D 从编辑器运行上下文环境配置Debugging(调试)
F8 进入下一步,如果当前行断点是一个方法,则不进入当前方法体内
F7 进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果该方法体还有方法,则不会进入该内嵌的方法中
F7 智能步入,断点所在行上有多个方法调用,会弹出进入哪个方法F8 跳出F9 运行到光标处,如果光标前有其他断点会进入到该断点F8 计算表达式(可以更改变量值使其生效)R 恢复程序运行,如果该断点下面代码还有断点则停在下一个断点上F8 切换断点(若光标当前行有断点则取消断点,没有则加上断点)F8 查看断点信息Navigation(导航)
O 查找类文件O 查找所有类型文件、打开文件、打开目录,打开目录需要在输入的内容前面或后面加一个反斜杠/O 前往指定的变量 / 方法← / ?→ 左右切换打开的编辑tab页F 返回到前一个工具窗口
从工具窗口进入代码文件窗口隐藏当前或最后一个活动的窗口,且光标进入代码文件窗口F4 关闭活动run/messages/find/… tabL 在当前文件跳转到某一行的指定处E 显示最近打开的文件记录列表← / ?→ 退回 / 前进到上一个操作的地方跳转到最后一个编辑的地方F1 显示当前文件选择目标弹出层,弹出层中有很多目标可以进行选择(如在代码编辑窗口可以选择显示该文件的Finder)B / ? 鼠标点击 进入光标所在的方法/变量的接口或是定义处B 跳转到实现处,在某个调用的方法名上使用会跳到具体的实现处,可以跳过接口Space, ?Y 快速打开光标所在方法、类的定义B 跳转到类型声明处U 前往当前光标所在方法的父类的方法 / 接口定义↓ / ?↑ 当前光标跳转到当前文件的前一个/后一个方法名位置] / ?[ 移动光标到当前所在代码的花括号开始/结束位置F 弹出当前文件结构层,可以在弹出的层上直接输入进行筛选(可用于搜索类中的方法)H 显示当前类的层次结构H 显示方法层次结构H 显示调用层次结构F2 / ?F2 跳转到下一个/上一个突出错误或警告的位置
F4 / ?↓ 编辑/查看代码源
Home 显示到当前文件的导航条F3选中文件/文件夹/代码行,添加/取消书签
F3 选中文件/文件夹/代码行,使用助记符添加/取消书签0.9 定位到对应数值的书签位置F3 显示所有书签Refactoring(重构)
F5 复制文件到指定目录
F6 移动文件到指定目录
在文件上为安全删除文件,弹出确认框F6 重命名文件F6 更改签名N 一致性M 将选中的代码提取为方法V 提取变量F 提取字段C 提取常量P 提取参数VCS/Local History(版本控制/本地历史记录)
K 提交代码到版本控制器T 从版本控制器更新代码C 查看最近的变更记录C 快速弹出版本控制器操作面板Live Templates(动态代码模板)
J 弹出模板选择窗口,将选定的代码使用动态模板包住J 插入自定义动态代码模板General(通用)
1.9 打开相应编号的工具窗口S 保存所有Y 同步、刷新F 切换全屏模式F 切换最大化编辑器F 添加到收藏夹I 检查当前文件与当前的配置文件`§ “ 快速切换当前的scheme(切换主题、代码样式等)
打开IDEA系统设置打开项目结构对话框A 查找动作(可设置相关选项)编辑窗口标签和工具窗口之间切换(如果在切换的过程加按上delete,则是关闭对应选中的窗口)Other(一些官方文档上没有体现的快捷键)
8 竖编辑模式导航
O 查找类文件 Ctrl + NO 前往指定的变量 / 方法 Ctrl + Shift + Alt + N← / ?→ 左右切换打开的编辑tab页Alt←/Alt→从工具窗口进入代码文件窗口 ESCL 在当前文件跳转到某一行的指定处 Ctrl + GE 显示最近打开的文件记录列表 Ctrl + E←/ ?→退回 / 前进到上一个操作的地方 Ctrl + Alt + ←/Ctrl + Alt + →跳转到最后一个编辑的地方 ?H 显示当前类的层次结构Ctrl + HH 显示方法层次结构H 显示调用层次结构 F4 /↓ 编辑/查看代码源U 显示类UML图J 查看注释编辑
删除到单词的末尾(?键为Fn+Delete)删除到单词的开头+ /?- 展开 / 折叠代码块F1 在错误或警告处显示具体描述信息L 格式化代码O 优化import开始新的一行自动结束代码,行末自动添加分号I 实现方法(实现接口中的方法)F6 重命名文件或者变量N,N 生成代码(getter、setter、构造函数、hashCode/equals,toString)P 显示方法的参数信息查找
Double? 查找任何东西
F 全局查找(根据路径)F 文件内查找G 查找模式下,向下查找G 查找模式下,向上查找导航
B 跳转到接口的实现 ?U 查看接口定义← /?→ 退回 / 前进到上一个操作的地方B /? 鼠标点击 进入光标所在的方法/变量的接口或是定义处B 跳转到类型声明处Space,Y 快速打开光标所在方法、类的定义O 查找类文件O 查找所有类型文件、打开文件、打开目录,打开目录需要在输入的内容前面或后面加一个反斜杠/F 返回到前一个工具窗口 ? 从工具窗口进入代码文件窗口
隐藏当前或最后一个活动的窗口,且光标进入代码文件窗口F3选中文件/文件夹/代码行,添加/取消书签
F3 选中文件/文件夹/代码行,使用助记符添加/取消书签0…?9 定位到对应数值的书签位置F3 显示所有书签F1 显示当前文件选择目标弹出层,弹出层中有很多目标可以进行选择(如在代码编辑窗口可以选择显示该文件的Finder)F 弹出当前文件结构层,可以在弹出的层上直接输入进行筛选(可用于搜索类中的方法)通用
F 切换全屏模式5. idea如何代码格式化
idea代码全在一行,使用快捷键Ctrl+Alt+L格式化代码,也可以将代码全部复制粘贴到特定的格式化代码网站进行格式化。
6. idea 格式化代码 配置
idea eslint可通过点击设置中我的进行自动格式化
7. 代码格式化 idea
idea软件是一款专业级的数据恢复软件,idea这款软件算法精湛,功能强大,支持多种情况下的文件丢失,分区丢失恢复,支持文件预览,支持扇区编辑,raid恢复等等高级数据恢复功能,软件功能全面,安全可靠,分区管理创建分区,删除分区,格式化分区等等。
8. idea设置代码自动格式化
IDEA的快捷键 Ctrl + Alt + L,就可以格式化SQL