☰
application.yml逐行解读-端口-H2-JPA配置
2026/10/14 5:27:47 网站建设 项目流程

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 的两个雷:

规则说明反例
缩进用空格,不用 Tabyml 靠缩进表达层级,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-nameorg.h2.DriverH2 的 JDBC 驱动类
usernamesaH2 默认超级管理员账号
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:PUBLIC

7.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-sqlfalse是否把执行的 SQL 打到控制台(生产关掉,避免刷屏)
format_sqltrue把 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-sorteralpha文档里按标签字母排序
api-docs.path/v3/api-docsOpenAPI JSON 文档地址

联调时打开http://localhost:8080/swagger-ui.html,每个接口都能直接填参数点「Try it out」试调,比 Postman 还顺手。


十、management:健康检查

management:endpoints:web:exposure:include:health,info

Actuator 有一堆端点,但默认只暴露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这个「魔法注解」拆成三个注解讲清楚。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询