StringBuilder 拼接 SQL/HTML 的核心是预估容量、分段构建、安全转义与复用实例:需预设足够初始容量减少扩容,按逻辑拆分拼接块,变量必须转义或参数化,复杂结构应分层封装方法。

用 StringBuilder 拼接 SQL 或 HTML 时,核心是避免字符串重复创建、预估容量、分段构建、安全处理变量——不是简单调用 append() 就完事。
预分配足够容量,减少扩容开销
每次扩容会触发数组复制,对长报文影响明显。比如拼接 2000 字符的 SQL,初始容量设太小(如默认 16)可能扩容 5~6 次。
- 粗略估算总长度:SQL 关键字 + 字段名 + 表名 + 条件值长度之和,再加 20% 余量
- 构造时直接指定:`new StringBuilder(4096)` 比 `new StringBuilder()` 更稳
- HTML 报文可按模板结构估算:比如 ``,提前算好标签和内容占比
- ` + N 个 `
- xxx ` + `
用链式 append 避免中间 String 对象
别写 `sb.append("WHERE id = ").append(id).append(" AND status = '").append(status).append("'")` 这种易错又难读的长链;拆成逻辑块更可控:
- 先拼基础部分:
sb.append("SELECT * FROM user WHERE 1=1") - 条件动态追加:
if (id != null) sb.append(" AND id = ").append(id) - 字段值统一转义或参数化(见下一点),不直接拼接用户输入
变量插入必须做转义或占位,严禁直拼
StringBuilder 不负责安全,它只拼字符串。SQL 注入和 XSS 都源于未过滤的原始变量。
立即学习“Java免费学习笔记(深入)”;
- SQL 场景:优先用
PreparedStatement,StringBuilder只用于拼接固定结构(如字段列表、表名、ORDER BY),参数用 ? 占位 - 若必须拼值(如生成静态脚本),对数字类型直接
append(id);字符串类型用append(escapeSqlString(name)),例如单引号替换成两个单引号 - HTML 场景:所有动态内容过
StringEscapeUtils.escapeHtml4()或手动替换<→、<code>"→"等
复杂 HTML 建议分层构建,别一股脑 append
一个含表格、循环项、嵌套 div 的报文,硬写成一行 append 很难维护。
- 为每类结构封装方法:`buildTableRow(String name, int age)` 返回
StringBuilder或字符串 - 主流程只做组装:
sb.append("<table>").append(buildTableHeader()).append(buildTableBody(items)).append("</table>") - 避免在循环里反复新建
StringBuilder,复用同一个实例,或用局部变量后一次性append()



















