一种利用注释让Java支持多行字符串的方法

(2018.1.21注:本文已过时,又找到一种好一点的利用注释支持多行字符串的方法,见[url]https://my.oschina.net/drinkjava2/blog/1611028[/url] )

从BeetlSql项目将SQL全放在Beetl模板里得到启发,又想到一个比较偏门的用法。以下代码实测通过,详见jSqlBox项目的test\examples\multipleLineSQL\SqlTemplateDemo.java源程序,此示例特殊点在于:运行时必须将此源程序拷贝一份在类根目录(或Maven管理的Resource目录下), 并将后缀".java"改为".sql"

public class SqlTemplateDemo extends TestBase {

//@formatter:off
public static class InsertUser extends SqlTemplate {
public InsertUser(Object name, Object address, Object age){
/* insert into
users
(username, address, age) */ empty(name,address,age);
/* values (?,?,?)*/
}
}

public static class FindUsers extends SqlTemplate {
public FindUsers(Object name, Object age){
/* select count(*)
from
users
where */
/* username=? */empty(name);
/* and age>? */empty(age);
/* order by username */
}
}

public static class GetUserCount extends SqlTemplate {
/* select count(*)
from users */
}

public static class SqlTemplateEndTag{}

@Test
public void doTest() {
Dao.executeInsert(new InsertUser("Tom","BeiJing",10).toString());
Dao.executeInsert(new InsertUser("Sam","ShangHai",20).toString());
Assert.assertEquals((Integer) 1, Dao.queryForInteger(new FindUsers("Sam",15).toString()));
Assert.assertEquals((Integer) 2, Dao.queryForInteger(new GetUserCount().toString()));
}
}

以上代码是利用Java源程序作为模板文件来统一放置SQL,以便于DBA管理。其优点在于:

1)没有引入第三方模板,直接用Java作为模板文件
2)支持多行字符串, 且没有引入IDE插件或Maven编译插件等,通用性好。
3)支持Java方法和模板混用,模板负责存储SQL,Java负责赋值(利用ThreadLocal),互不干拢。
4)public static class的类名即为SQL ID,便于重命名重构和SQL的快速定位(Ctrl+鼠标左键即可),这是文本方式模板无法做到的,后者必须用文本搜索功能才能定位SQL。
缺点是:
1)每次模板更改后,还必须手工拷贝一份同样的文件放在类根目录作为资源文件
2)因为SQL写在注释中, 所以必须利用标记 //@formatter:off 来关闭IDE(我用Eclipse)的格式化功能,防止IDE误格式化。
3)从SQL管理角度出发,模板文件中要注意不要放入过多除SQL以外的无关代码。

以上方法主要应用于SQL模板,但是其它场合如需要用到Java支持多行字符串的,也可以借签。

注:2017.5.17再更新一下,以下是一个通用的支持多行字符串的基类,实现了在开发阶段从源码读取(TextSupport类或其子类在getJavaSrcFolder方法返回值中要给出源码目录),布署阶段从资源文件读取(布署时改一下getJavaSrcFolder方法使其返回空值并拷贝Java模板到类根目类,并改为.txt后缀):

package util;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

/**
* TextSupport is base class for Java text(multiple line Strings) template.
*/
public class TextSupport {

public String getJavaSrcFolder() {
return "F:/your_project_folder/src/test/java/";
}

@Override
public String toString() {
try {
if (StringUtils.isEmpty(getJavaSrcFolder()))
return extractTextFromComments(getTextFromResourceFile());
else
return extractTextFromComments(getTextFromJavaFile());
} catch (IOException e) {
throw new RuntimeException(e);
}
}

private String extractTextFromComments(String templateText) {
String thisPublicStaticClassName = this.getClass().getSimpleName();
String classText = StringUtils.substringBetween(templateText,
"public static class " + thisPublicStaticClassName, "*/}");
if (StringUtils.isEmpty(classText))
throw new RuntimeException("Can not find text between \"public static class " + thisPublicStaticClassName
+ " and end tag \"*/}\"");
StringBuilder sb = new StringBuilder();
for (String str : StringUtils.substringsBetween(classText + "*/", "/*", "*/"))
sb.append(str);
return sb.toString();
}

private String getTextFromJavaFile() throws IOException {
String className = this.getClass().getName(); // aaa.bbb.CCC$DDD
String fileName = getJavaSrcFolder()
+ StringUtils.replace(StringUtils.substringBeforeLast(className, "$"), ".", "/") + ".java";
return FileUtils.readFileToString(new File(fileName));
}

private String getTextFromResourceFile() throws IOException {
String className = StringUtils.substringAfterLast("." + this.getClass().getName(), ".");// CCC$DDD
String resFile = StringUtils.substringBefore(className, "$") + ".txt";// CCC.txt
URL url = this.getClass().getResource("/" + resFile);
if (url == null)
throw new RuntimeException("Can not find resource file \"" + resFile + "\"");
return FileUtils.readFileToString(new File(url.getFile()));
}

public static void main(String[] args) {
System.out.println("Text=" + new DemoString());
}

//@formatter:off
public static class DemoString extends TextSupport{
/*
Hello,
This is multiple line strings demo
*/}
}
/*和/ *的差异?为什么不支持嵌套注释?注释/*和//的起源?为什么注释不能在字符或者字符串中?丰富多彩的注释形式? / 最早是BCPL作为单行注释,后来C++也以它作为单行注释,C89并未用它,直到C99标准才吸纳//. 需要注意,编程语言理论上可以选择任何不冲突的字符作为注释符,C系语言延续/*和//只是为了兼容和省事。 阅读详情

相关推荐

Java11语法:多行字符串【三个双引号(“““)用于表示多行字符串】| Lambda基于mapToInt的变量求和

在Java中,三个双引号(“”")用于表示多行字符串。这种语法在Java 11中引入,主要是为了解决在Java中创建多行字符串时写起来太复杂的问题。使用三个双引号可以方便地创建多行字符串,不需要进行换行和拼接操作,从而提高了程序的可读性和可维护性‌。关系表方便扩展:例如一个账号对应多个微信号。例:查询主表的信息以及对应的明细记录数。

专注于计算机研发知识和资讯分享 1418

Java 多行字符串

在本文中,我们来说说 Java 的多行字符串(multiline strings )。从 JDK 15 开始,Java 提供了一个称为 Text Blocks 的语法,你可以在代码中直接使用这个功能,如果你安装这个版本的 JDK 的话,那么需要使用一些特定方法实现这个目标。在本文中,我们还讨论使用其他方法的实现。...

HONEY MOOSE 7263

别再纠结Dify了!实测对比RAGFlow和Dify,聊聊企业知识库到底该怎么选

本文深度对比了RAGFlow和Dify在企业知识库选型中的实际表现,从技术架构、性能指标、部署成本等多维度进行分析。RAGFlow在复杂文档处理和准确率方面表现突出,适合有专职技术团队的企业;而Dify则以低门槛和快速部署见长。文章提供了六维度评估法,帮助企业根据文档复杂度、准确率要求等技术指标做出明智选择。

weixin_30897233的博客 674

Java双引号“““来定义多行字符串

请注意,这个特性在Java 15中是预览特性,可能在将来的版本中有所变化。如果你使用的是Java 15或更高版本,并且启用了预览特性,就可以使用这种多行字符串的语法。如果你使用的是Java 14或更早的版本,那么你需要继续使用。来定义多行字符串,这个特性被称为“文本块”(Text Blocks)。不需要转义,它们会被Java编译器识别为字符串内容的一部分。来换行,文本块会自动保留换行符。同时,文本块中的引号。ava 15引入了一个预览特性,允许使用双引号。包围了多行字符串,每一行的末尾不需要加。

似水_逆行的博客 716

小红书分享链接失效?教你永久保存笔记的2种方法(含API调用技巧)

本文详细解析了小红书笔记链接失效的原因,并提供了两种永久保存笔记的方法,包括短链接转换API调用技巧和本地归档技术。通过Python代码示例和工具推荐,帮助用户实现笔记内容的高效保存和管理,确保珍贵内容不再丢失。

gin88的博客 2769

别再只当代码阅读器了!手把手教你用Understand的实体定位器和信息浏览器,5分钟精准定位代码逻辑

本文深入解析Understand代码分析工具的高级功能,重点介绍实体定位器和信息浏览器的实战应用。通过5分钟快速定位代码逻辑的技巧,帮助开发者从代码阅读者升级为逻辑侦探,提升大型代码库的分析效率。文章包含过滤搜索、调用链追踪等实用方法,是掌握Understand核心功能的必备指南。

weixin_28745821的博客 293

带有 Java 文本块的多行字符串文本

但是,对于一个将在2021年9月Java 17发布后投入生产的绿地项目,使用Java 14开始开发可能是一个好主意。在本文中,向您展示新的 Java 文本块如何帮助您提高 JPQL、SQL 查询或 JSON 字符串值的可读性。Java 文本块真正有用的另一个地方是当您需要在 Java 代码中表示 JSON、XML 或 HTML 时。从 Java 13 开始,您可以使用文本块,甚至不必手动将旧版多行串联转换为新的多行文本块格式。使用 Java 文本块时,SQL 查询更具可读性。的培训材料,结果非常壮观。

allway2的博客 1288

偏差平方和说明什么_共同方法偏差检验之潜在误差变量控制法的Amos操作

潜在误差变量控制法是在结构方程模型中,将共同方法偏差作为一个潜变量加入模型,如果在包含方法偏差潜变量情况下模型的显著拟合度优于不包含共同方法偏差潜变量的情况,那么共同方法偏差效应就得到了检验,包含共同方法偏差潜在变量的模型,对于预测与效标变量关系的估计则控制了共同方法偏差。具体操作如下:因为这个过程也是基于因子分析的基础上进行的,关于绘制模型以及运行等过程不再介绍,请参考前面关于“合成信度 ”的相...

weixin_28730927的博客 2367

(一)基于IDEA的JAVA基础4

单行注释://开头放在代码前面,对少部分。多行注释:快捷方式ctrl+shift+/,对段落代码注 释。文档注释:/**……**/,用于声明作者或创作时 间。文档注释如何设置,首先找到File中的setting然后是Includes下的File Header 输入截图中内容,点击Apply应用OK即可。作者那一栏你们当然打自己的名字。然后以后每次新建都会自动生成文件头。

2401_82863547的博客 741

从零开始:用ADS 2023手把手教你设计2.4GHz Wi-Fi LNA(基于ATF-54143,附模型文件)

本文详细介绍了如何使用ADS 2023软件设计2.4GHz Wi-Fi频段的低噪声放大器(LNA),基于ATF-54143晶体管。内容涵盖模型导入、直流工作点确定、稳定性优化、噪声匹配等关键步骤,并提供可下载的模型文件包,帮助工程师快速掌握LNA设计技巧。

weixin_42531128的博客 323

大模型越狱指令数据集全解析:从AdvBench到HarmBench

本文全面解析了AdvBench、HarmBench等主流大模型越狱指令数据集。AdvBench作为基础测试集,用于快速评估模型安全基线;HarmBench则以其全面的文本、多模态及对抗性攻击评估,成为当前权威的深度安全审计工具。文章还介绍了MaliciousInstruct、JailbreakBench等特色数据集,并提供了根据实际场景选择与使用这些数据集的具体实战指南。

weixin_29327525的博客 621

java 字符串 多行_一种利用JAVA注释支持多行字符串的方法

从BeetlSql项目将SQL全放在Beetl模板里得到启发,又想到一个比较偏门的用法。以下代码实测通过,详见jSqlBox项目的test\examples\multipleLineSQL\SqlTemplateDemo.java源程序,此示例特殊点在于:运行时必须将此源程序拷贝一份在类根目录(或Maven管理的Resource目录下), 并将后缀".java"改为".sql"public cla...

weixin_35825858的博客 602

谷歌A2A协议入门指南:附简易Python代码示例

继"关税"之后,当下最热门的词汇当属AI智能体——这种基于人工智能的软件能够执行复杂任务、实现工作流自动化并提升生产效率。但迄今为止,大多数智能体都处于各自为政的状态,难以顺畅协作。就像团队执行重大项目时,成员之间却无法交流!对于技术人员而言,一个可能遇到的典型场景是:假设你需要协调四个不同的AI服务——处理用户查询的Gemini智能体、在向量数据库进行搜索的AI应用、基于Claude的摘要生成器,以及运行专业领域逻辑的Python智能体。

独立开发,substack顶级编辑 800

一种利用JAVA注释支持多行字符串的方法

(2018.1.21注:本文已过时,又找到一种好一点的利用注释支持多行字符串的方法,见 再谈让Java支持多行文本 ) 从BeetlSql项目将SQL全放在Beetl模板里得到启发,又想到一个比较偏门的用法。以下代码实测通过,详见jSqlBox项目的test\examples\multipl...

chuanxia1039的博客 396

【OpenClaw从入门到精通】第35篇:电商“龙虾”掘金记——用OpenClaw实现小红书/抖音/淘宝全自动矩阵运营(2026实测版)

2026年,OpenClaw智能体已成为电商运营的“效率革命工具”,其多平台自动化能力让单人可完成传统3-5人的工作量。本文基于真实商业案例(来源:海报新闻、阿里云开发者社区等),系统拆解OpenClaw在小红书、抖音、淘宝的全链路运营方案:从阿里云部署搭建基础环境,到三大平台核心技能安装配置,再到跨平台矩阵工作流落地;同时揭秘代部署、模板售卖、轻定制、内容套利四大变现模式,并详解Token成本控制、安全风险规避等关键问题。文中所有代码均经过2026年3月实测验证,提供完整可复现的技术方案,帮助读者快速搭建

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2080

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java编写字符串连接程序注释_一种利用JAVA注释支持多行字符串的方法

从BeetlSql项目将SQL全放在Beetl模板里得到启发,又想到一个比较偏门的用法。以下代码实测通过,详见jSqlBox项目的test\examples\multipleLineSQL\SqlTemplateDemo.java源程序,此示例特殊点在于:运行时必须将此源程序拷贝一份在类根目录(或Maven管理的Resource目录下), 并将后缀".java"改为".sql"public cla...

weixin_33488806的博客 261

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java 中的注释方法

和。其中,文档注释是功能最丰富的一种,专门用于生成 API 文档和详细说明代码功能。

墨阳的博客 499

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

注释规范:单行与多行注释

注释是编程中的一门艺术,平衡解释与简洁至关重要。单行注释适合简短说明,而多行注释用于详细描述。通过遵循规范、使用工具如Mermaid图表和文档生成器,你可以提升代码质量。记住,好的注释不是重复代码,而是阐明意图和原因。在团队中,制定并遵守注释规范,定期审查,以确保代码库的长期健康。如果你对注释规范有更多疑问,可以探索W3Schools 的注释指南获取语言特定示例。🚀 记住,清晰的注释是给未来自己和同事的礼物。

always_TT的博客 629

高效编码从注释开始,VSCode中Ctrl+/多行注释的5大实战技巧

掌握VSCode多行注释Ctrl+/,提升编码效率。本文详解批量注释、嵌套语言支持、跨平台兼容等5大实用技巧,覆盖前端开发、配置调试等高频场景。告别手动操作,实现精准快速编辑,值得收藏。

ByteShoal的博客 700

掌握这3个设置,让你的VSCode Ctrl+/多行注释秒变专业

掌握VSCode多行注释技巧,提升代码整洁度与协作效率。通过修改语言关联、启用自动闭合和自定义快捷键,让Ctrl+/在不同文件中智能生成专业格式的多行注释,适配前端、Python等开发场景,操作简单高效,值得收藏。

ProceGlow的博客 1017

代码注释编写指南:单行注释、多行注释与文档注释规范

应包含参数说明、返回值、异常等结构化标签。推荐使用工具如Doxygen、Javadoc、Sphinx等自动生成文档。作为前缀,注释内容与符号之间保留一个空格。注释应位于代码上方或行尾,但需保持对齐。避免嵌套多行注释,某些语言如Python不支持此语法。,每行以星号开头并保持对齐。专业IDE通常支持快捷键生成标准格式。单行注释通常用于简短说明代码功能或临时禁用代码。多行注释适用于复杂逻辑说明或临时屏蔽代码块。注释应聚焦于代码的"为什么"而非"做什么"。避免过度注释显而易见的代码,如。

zeqqyvpe2017的博客 583

为什么我的python程序编译器没有行代号_为什么Python没有多行注释?

为什么Python没有多行注释?好的,我知道三引号字符串可以作为多行注释。 例如,"""Hello, I am amultiline comment"""和'''Hello, I am amultiline comment'''但从技术上讲这些都是字符串,对吗?我用谷歌搜索并阅读了Python风格指南,但我无法找到技术答案,为什么没有正式实现多行,/ * * /类型的评论。 我使用三引号没有问题,...

weixin_39879665的博客 237

【VSCode高效编码必备技巧】:你不知道的多行注释Ctrl+/隐藏用法揭秘

掌握VSCode高效编码技巧,轻松解决多行注释难题。通过Ctrl+/快速切换单行与多行注释,适用于JavaScript、Python等多种语言,提升代码整洁度与编辑效率。操作简单,一键生效,值得收藏。

ProceSeed的博客 905

Python 注释块

注释是计算机程序中的一段文本,可提供有关所编写源代码的更多信息。与其他所有编程语言一样,Python 具有三种不同类型的注释:单行注释、多行注释和文档字符串。

Aai1624的博客 2740

文本块(Text Blocks)处理多行字符串

无论是编写复杂的SQL查询语句、格式化的JSON字符串、HTML邮件模板,还是多行日志、接口说明,传统方式都需要手动拼接字符串、添加换行符、转义特殊字符,不仅代码冗长杂乱,还极易出现语法错误,后期维护更是举步维艰。始终保持「起始标记、结束标记缩进一致」,且与代码块的缩进对齐(如在方法内部,与方法体的缩进保持一致),这样能最大程度保证文本块的格式整洁,避免出现不必要的缩进混乱。对于复杂的接口说明、方法注释,文本块可保留换行和格式,比传统的多行注释(/* */)更灵活,也可用于生成接口文档的描述信息。

。。。 904
上一篇: jDialects:一个从Hibernate抽取的支持70多种数据库方言的原生SQL分页工具
下一篇: 总结一下Java中SQL的九种写法
Drinkjava2
博客等级 码龄11年 9粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值