雖然提供了Cnd,但是用起來是覺得有點不方便,然后就直接編寫Sql語句。nutz提供了一些方法。
Nutz.Dao 的自定義 SQL 部分的解決方案是:
// 不推薦使用
用戶可以硬編碼 SQL 語句,比如:
Sql sql = Sqls.create("DELETE FROM t_abc WHERE name='Peter'");
// 可以。防注入。不過太多字符串了,要拼接。
支持占位符的書寫方式,比如:
Sql sql = Sqls.create("DELETE FROM $table WHERE name=@name");
sql.vars().set("table","t_abc");
sql.params().set("name","Peter");
$table 將會被替換成 t_abc
@name 將會被替換成 ?,用來創建 PreparedStatement
// 這種方法不錯,代碼顯得好看點,而且,方便CV操作
用戶可以將所有的 SQL 語句存放在一個或者多個文件中,語句的間隔可以通過注釋,比如:
/* delete.data */
DELETE FROM $table WHERE name LIKE @name
/* update.data */
UPDATE FROM $table SET name=@name WHERE id=@id
在你的 Java 代碼中:
Sql sql = dao.sqls().create("delete.data");
你可以為你的 SQL 任意定制回調,后面會有詳細講解
根據nutz的文檔,最終主要采用將sql語句放置在多個文件中來管理的方法比較容易管理代碼。
使用方法如下,初始化時,讓dao載入.sqls文件。有兩種方法。
第一種,構造時加載。路徑你也可以用文件夾,這樣會加載文件夾下所有.sqls文件
Dao dao = new NutDao(datasource,new FileSqlManager("demo/sqls/all.sqls")); System.out.println(dao.sqls().count());
或者在dao.js寫好,用ioc加載
var ioc = { conf : { ... }, dataSource : { ... }, sqlSource:{ type:"org.nutz.dao.impl.FileSqlManager", args:["sql"] }, dao : { type : "org.nutz.dao.impl.NutDao", args : [{refer:"dataSource"},{refer:"sqlSource"}] } };
第二種,在構造后加載
Dao dao = new NutDao(datasource); ((NutDao)dao).setSqlManager(new FileSqlManager("demo/sqls/all.sqls")); System.out.println(dao.sqls().count());
PS:.sqls 文件必須是 UTF-8編碼
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
好了,前期工作完成。該弄弄怎么使用了。首先,寫好你自己的.sqls文件。
1.通過 dao.sqls().create(""); 加載對應的sql語句。
2.替換相應的占位符。
3.設置回調函數,回調函數中,通過 invoke 函數你進行后續操作。
4.執行dao.execute(sql)。這里是同步,會等待結束,直至失敗,或者回調函數執行完畢才會繼續執行。
@At @Ok("jsp:jsp.test.getMenuDi") public void getMenuByIoc(HttpSession session) { Sql sql = dao.sqls().create("getMenu.data"); sql.params().set("id", 1); sql.setCallback(new SqlCallback() { public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException { ..... while (rs.next()){ .... m.setName(rs.getString("menu_name")); .... } System.out.println("callback end"); return myMenu; } }); dao.execute(sql); System.out.println("execute end"); MyMenu myMenu = sql.getObject(MyMenu.class); ... }
然后,就可以開始繼續寫代碼了。
