Java 15 正式引入文本块,以三重双引号包裹多行字符串,提升SQL和JSON的可读性与可维护性,支持IDE高亮与格式化,但需注意其编译期常量特性及Java 15+版本要求。

Java 15 正式引入文本块(Text Blocks),它让多行字符串的编写更直观、可读性更强,特别适合嵌入 SQL 查询和 JSON 数据。关键在于:避免手动拼接、减少转义、保留缩进逻辑、与 IDE 友好协作。
SQL 多行书写:保持可读性与执行正确性
传统用 + 拼接或单行字符串写复杂 SQL,易出错且难维护。文本块天然适配 SQL 的结构化换行与缩进习惯。
- 用三重双引号
"""包裹,首尾换行自动去除,内部缩进按实际空格保留 - SQL 关键字大写、字段对齐、WHERE 条件分行,视觉上接近数据库客户端体验
- 变量注入建议统一用
String.format()或 PreparedStatement 占位符,不混用%s和文本块内插值(Java 不支持文本块内表达式求值)
示例:
String query = """
SELECT u.id, u.name, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.status = ?
AND u.created_at >= ?
GROUP BY u.id, u.name
ORDER BY order_count DESC
LIMIT ?""";
配合 PreparedStatement 使用即可,安全又清晰。
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
JSON 构建:告别转义地狱,贴近真实格式
过去写 JSON 字符串需大量 \" 转义、拼接换行符,极易漏掉引号或反斜杠。文本块彻底解决这个问题。
- 直接按标准 JSON 格式缩进书写,双引号无需转义
- 注意:文本块会保留首行末尾与末行开头的空白,建议首行
"""后立刻换行,末行"""前不留内容 - 若需动态字段,先用文本块写模板,再用
String.replace()或Map + ObjectMapper注入(推荐后者用于生产)
示例(静态配置):
String configJson = """
{
"timeout": 3000,
"retries": 3,
"endpoints": [
{"name": "auth", "url": "https://api.example.com/v1/auth"},
{"name": "data", "url": "https://api.example.com/v1/data"}
]
}""";
与工具链协同:IDE、Linter 与序列化库
文本块不是“语法糖”而是语言级特性,主流工具已良好支持。
- IntelliJ / Eclipse 支持文本块高亮、自动缩进对齐、格式化(Ctrl+Alt+L 默认启用)
- Checkstyle / PMD 可配置检查文本块缩进一致性(如禁止首行缩进、限制最大行宽)
- 搭配 Jackson 或 Gson 时,直接传入文本块字符串解析完全可行:
mapper.readValue(jsonString, MyDto.class) - 单元测试中,用文本块写期望 JSON,断言更直观,diff 差异一目了然
避坑提醒:常见误用与兼容性边界
文本块强大但有明确约束,忽略会导致编译失败或语义偏差。
- 最低 Java 版本为 15(如需兼容 JDK 8–14,可用
String.join("\n", ...)模拟,但无缩进智能处理) - 文本块内容在编译期确定,不能含运行时变量——不要试图在其中写
${x}或#{y}(那是模板引擎的事) - 缩进以结束三引号所在行的空白为基准:若末行是
""",则所有行前导空白会被裁掉最多 4 个空格 - SQL 中慎用文本块拼接表名/列名(可能引发 SQL 注入),必须动态时请走白名单校验或元数据查询

















