nutz 自定義sql的使用


雖然提供了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);
        
        ...
    }

然后,就可以開始繼續寫代碼了。

 


免責聲明!

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



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