03-application.yml逐行解读-端口-H2-JPA配置
大家好,我是黒漂技术佬。上篇讲完 pom.xml,本篇逐行啃application.yml——这是 URM Ultra 后端的唯一配置文件(没有 application.properties)。工程能不能连上库、监听哪个端口、Swagger 在哪开,全在这一个文件里。
先说个新手常识:Spring Boot 同时支持.properties(老式key=value)和.yml(树形缩进)两种格式。URM Ultra 用 yml,因为它层级清晰、可读性强,写复杂配置不累。
一、yml 的语法铁律(先避坑)
动手读之前,必须记住 yml 的两个雷:
| 规则 | 说明 | 反例 |
|---|---|---|
| 缩进用空格,不用 Tab | yml 靠缩进表达层级,Tab 会解析失败 | 用 Tab 缩进 |
| 冒号后必须有空格 | key: value的:后至少一个空格 | port:8080(错) |
记住这俩,你 90% 的 yml 报错都没了。
二、完整配置一览(项目源码)
server:port:8080spring:application:name:urm-server# ===== 演示环境:H2 内存库(零外部依赖,可直接运行)=====datasource:url:jdbc:h2:mem:urm_ultra;MODE=MySQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;DB_CLOSE_DELAY=-1driver-class-name:org.h2.Driverusername:sapassword:""h2:console:enabled:truepath:/h2-consolejpa:hibernate:ddl-auto:updateopen-in-view:falseshow-sql:falseproperties:hibernate:format_sql:true# 兼容 H2 与 MySQL 表名default_schema:PUBLIC# ===== 生产环境切换 MySQL(取消注释并改为真实配置)=====# datasource:# url: jdbc:mysql://127.0.0.1:3306/urm_ultra?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false# driver-class-name: com.mysql.cj.jdbc.Driver# username: root# password: rootspringdoc:swagger-ui:path:/swagger-ui.htmltags-sorter:alphaapi-docs:path:/v3/api-docsmanagement:endpoints:web:exposure:include:health,info# 业务自定义配置urm:# 微信支付分免密支付(Demo 使用 Mock,接入真实微信时在此配置)wechat-pay:enabled:falsemch-id:""app-id:""service-id:""# 微信支付分服务 IDapi-v3-key:""# APIv3 密钥(生产禁止提交真实密钥)# 视觉识别(Demo 使用 Mock,接入三方算法时配置)vision:provider:mock# mock / third-partyendpoint:""api-key:""下面逐段拆。
三、server:服务监听端口
server:port:8080| 项 | 含义 |
|---|---|
server.port | 内嵌 Tomcat 监听的端口,默认就是 8080 |
为什么常用 8080?它是 HTTP 代理常用的「备选端口」,避开 80(需管理员权限)又不冲突。想换端口,比如 9090,直接改这里就行。联调时前端访问http://localhost:8080就对应这个端口。
四、spring.application.name:应用名
spring:application:name:urm-server给应用起个名字,注册到服务发现、或在日志/监控里区分应用时用。URM Ultra 后端就叫urm-server。
五、datasource:H2 内存库(本篇重点)
datasource:url:jdbc:h2:mem:urm_ultra;MODE=MySQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;DB_CLOSE_DELAY=-1driver-class-name:org.h2.Driverusername:sapassword:""5.1 为什么是 H2 内存库
H2 是个纯 Java 写的嵌入式数据库,可以跑在内存里(mem:),不写磁盘文件、不用装服务。对 Demo 来说简直完美:克隆工程 → 启动 → 自动建表灌数据 → 直接玩。
5.2 那串 URL 参数是啥(逐个翻译)
很多新手被这一长串吓到,其实每个分号隔开的就是一个开关:
| 参数片段 | 含义 |
|---|---|
jdbc:h2:mem:urm_ultra | 用 H2 的「内存模式」,库名urm_ultra |
MODE=MySQL | 关键:让 H2 的 SQL 语法兼容 MySQL 模式。这样你写 MySQL 风格的 SQL,H2 也能跑,将来切 MySQL 几乎无缝 |
DATABASE_TO_LOWER=TRUE | 把数据库名、表名转小写,避免大小写差异导致的建表异常 |
CASE_INSENSITIVE_IDENTIFIERS=TRUE | 标识符(表名/列名)大小写不敏感,进一步兼容 MySQL 习惯 |
DB_CLOSE_DELAY=-1 | 关键:VM 存活期间不关闭内存库。默认 H2 在「没有连接」时会清空内存数据,设-1防止你关掉一个连接后数据全没了 |
一句话总结:这套参数组合,是为了让「内存里的 H2」表现得像一个「小号 MySQL」,最大化降低 Demo 与生产环境的差异。
5.3 账号与驱动
| 项 | 值 | 说明 |
|---|---|---|
driver-class-name | org.h2.Driver | H2 的 JDBC 驱动类 |
username | sa | H2 默认超级管理员账号 |
password | 空 | 演示库无密码 |
六、h2.console:可视化看数据库
h2:console:enabled:truepath:/h2-console| 项 | 含义 |
|---|---|
enabled | 是否开启 H2 自带的控制台(Web 界面) |
path | 访问路径 |
开启后,浏览器访问http://localhost:8080/h2-console就能用图形界面看表、写 SQL。登录时 JDBC URL 填上面那段jdbc:h2:mem:urm_ultra;...,用户名sa、密码空即可进去。联调时查「为什么这条数据没存进去」非常方便。
七、jpa:对象怎么落库(本篇另一重点)
jpa:hibernate:ddl-auto:updateopen-in-view:falseshow-sql:falseproperties:hibernate:format_sql:truedefault_schema:PUBLIC7.1 ddl-auto:自动建表策略
hibernate.ddl-auto决定「Java 实体类」和「数据库表」怎么同步:
| 取值 | 行为 | 适用 |
|---|---|---|
create | 每次启动删表重建 | 纯测试,数据会没 |
create-drop | 启动建、关闭删 | 单元测试 |
update | 启动时按实体改表结构,不删数据 | 开发(URM Ultra 用的就是这个) |
none | 完全不管表 | 生产(表由 DBA 管) |
validate | 只校验实体与表是否一致 | 生产保守 |
URM Ultra 用update:你加个字段,重启它就自动给表加列,已有数据还在。对 Demo 和开发最省心。
7.2 open-in-view:关掉「视图层还开着事务」
open-in-view: false是个性能与规范相关的开关。
- 默认
true时,Spring 会在整个请求(从 Controller 到页面渲染)期间一直开着 Hibernate 的 Session,方便模板里懒加载。 - 但副作用明显:事务被拉长、容易触发经典的「N+1 查询」性能坑、数据库连接占用久。
URM Ultra 显式设false,逼着你在 Service 层就把数据查全、查好,事务边界干净。这是有经验的团队都会这么做的最佳实践。
7.3 show-sql / format_sql
| 项 | 值 | 含义 |
|---|---|---|
show-sql | false | 是否把执行的 SQL 打到控制台(生产关掉,避免刷屏) |
format_sql | true | 把 SQL 格式化(缩进换行),配合 show-sql 看更清楚 |
注意show-sql在 yml 顶层jpa下,而format_sql在jpa.properties.hibernate下(直接透传给 Hibernate 原生属性)。两者层级不同但都生效。
7.4 default_schema:默认 schema
default_schema: PUBLIC指定表默认落在PUBLIC这个 schema 下。写它主要是为了同时兼容 H2 和 MySQL 的表名解析,避免切换数据库后找不到表。
八、生产切换 MySQL(注释里藏着)
# datasource:# url: jdbc:mysql://127.0.0.1:3306/urm_ultra?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false# driver-class-name: com.mysql.cj.jdbc.Driver# username: root# password: root这段是注释掉的。上线时把上面 H2 的datasource注释掉、把这段放开即可。代码一行不用改,靠 JPA 的数据库无关性平滑切换。源码注释特别强调「生产禁止提交真实密钥」——密码别写进仓库。
九、springdoc:接口文档
springdoc:swagger-ui:path:/swagger-ui.htmltags-sorter:alphaapi-docs:path:/v3/api-docs| 项 | 值 | 含义 |
|---|---|---|
swagger-ui.path | /swagger-ui.html | 文档界面地址 |
tags-sorter | alpha | 文档里按标签字母排序 |
api-docs.path | /v3/api-docs | OpenAPI JSON 文档地址 |
联调时打开http://localhost:8080/swagger-ui.html,每个接口都能直接填参数点「Try it out」试调,比 Postman 还顺手。
十、management:健康检查
management:endpoints:web:exposure:include:health,infoActuator 有一堆端点,但默认只暴露health和info,避免把内部信息(如所有 Bean、环境变量)暴露出去造成安全风险。访问http://localhost:8080/actuator/health返回{"status":"UP"}即健康。
十一、urm:业务自定义前缀(重点概念)
urm:wechat-pay:enabled:falsemch-id:""app-id:""service-id:""api-v3-key:""vision:provider:mockendpoint:""api-key:""这是 URM Ultra自己定义的配置前缀。约定:业务私有配置用项目代号urm开头,避免和 Spring 自带配置撞名。
| 前缀 | 用途 | 当前值含义 |
|---|---|---|
urm.wechat-pay.* | 微信支付分免密支付配置 | enabled: false→ 走 Mock 支付 |
urm.vision.* | 视觉识别配置 | provider: mock→ 走 Mock 识别 |
这两个模块现在都是Mock(模拟)实现:不接真实微信、不跑真实视觉算法,但留好了接口和配置位。将来接真实服务,只需实现对应接口、把enabled/provider改成非 mock、填好密钥即可,业务代码无感切换。这叫「策略可插拔」,是 URM Ultra 架构上很讲究的一点。
十二、本篇小结
- yml 用空格缩进、冒号后留空格,别用 Tab。
- 端口默认
8080;应用名urm-server。 - H2 内存库那串 URL 用
MODE=MySQL+DB_CLOSE_DELAY=-1等参数,让它假装成一个小 MySQL。 - JPA 用
ddl-auto: update(自动建表不丢数据)、open-in-view: false(干掉长事务坑)。 - Swagger 在
/swagger-ui.html;Actuator 只暴露 health/info。 - 自定义
urm.wechat-pay/urm.vision前缀,目前都走 Mock。
下一篇我们回到启动类UltraApplication,把@SpringBootApplication这个「魔法注解」拆成三个注解讲清楚。