一種利用JAVA注釋支持多行字符串的方法


從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模板,但是其它場合如需要用到Java支持多行字符串的,也可以借簽。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM