NutzDao-自定义SQL语句进行复杂查询

NutzDao-自定义SQL语句进行复杂查询

       Nutz.Dao提供了大多数简单的操作,在80%以上的情况下,你并不需要编写 SQL,因为 Nutz.Dao会自动替你生成可以使用的SQL。但是,在某些特殊的情况下,尤其是考虑到效率等问题,直接写SQL 仍然是程序员们的一个杀手锏,有了这个杀手锏,程序员们永远可以针对任何数据库做他们想要的任何操作。

 

自定义SQL语句

       NutzDao可以采取直接编写SQL语句的方式来构建自己的SQL语句,从而可以进行对数据的操作,当然在Nutz中自定义SQL语句也支持占位符的方式构建动态SQL语句。在Nutz中创建自定义SQL语句中比较特殊的一种方式是可以将多个SQL语句存放到一个或多个文件中,语句间通过注释来分隔,在程序中想要用该文件中的SQL语句通过相应的方法去加载。

1.普通的自定义SQL语句

       Nutz中通过org.nutz.dao.sql.Sql接口的实现类org.nutz.dao.Sqls来创建自定义SQL语句。代码如下:

    Sql sql =Sqls.create("DELETE FROM t_abc WHERE name='Peter'");

2.支持占位符的自定义SQL语句

    Nutz中同样可以通过占位符的方式来构建动态的SQL语句。代码如下:

    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表示字段名,用Peter替换,@表示参数占位符

· 还有一个特殊的占位符,$condition

    它的用法如下:

    Sql sql= Sqls.create("SELECT name FROM t_pet $condition");

    sql.setCondition(Cnd.where("id", ">", 35));

    如下:

voiddemoCondition2(Dao dao){
    Sql sql = Sqls.create("UPDATE t_pet SETmasterid=@masterId $condition");
    sql.params().set("masterId", 45);
    sql.setCondition(Cnd.wrap("id>35"));
    dao.execute(sql);
}

 

SQL文件形式的自定义SQL语句

    一个应用通常由很多 SQL 语句构成,如何管理这些语句呢?用户可以将所有的 SQL 语句存放在一个或者多个文件中,语句的间隔可以通过注释,这是一种非    常简单的纯文本文件,文件里只包含三种信息:

      · SQL语句

      · SQL语句的名称 (或者说是键值)。你的程序可以通过语句的名称获取到某一条或几条 SQL 语句

      · 注释 (通常包括在 /*  */ 之间)

    注意:你的 SQL 文件必须为UTF-8编码

   下面是一个SQL文件的例子,test.sqls文件:

/* insertUser */

insert into tbl_user (uname,uage) values (@uname, @uage)

/* deleteUser */

delete from tbl_user where uname=@uname

将这个文件以.sqls为后缀,添加到src类路径之中。

之后就是加载SQL文件,只要得到Dao的对象,可以使用dao.sqls()方法获得

org.nutz.dao.SqlManager 接口,从这个接口中你就可以获得你预先定义好的Sql对象了。

    对于 Dao 接口的默认实现,NutDao,提供两个方法,一个是通过构造函数,另一个是 setter 函数

· 通过构造函数的方式

Dao dao = newNutDao(datasource,new FileSqlManager("test.sqls"));

System.out.println(dao.sqls().count());

· 通过setter方法

Dao dao = new NutDao(datasource);

((NutDao)dao).setSqlManager(new FileSqlManager("test.sqls"));

System.out.println(dao.sqls().count());

加载SQL文件完成之后,怎样同时执行多条SQL语句呢?这就用到了ComboSQL(组合SQL语句),代码如下:

    // 组合SQL语句(Combo SQL

    Sql sql = dao.sqls().createCombo("insertUser","deleteUser");

    sql.params().set("uname""yan").set("uage", 33).set("uname""jim");

    // 同时执行多条SQL语句

    dao.execute(sql);

关于 ComboSql,你还需要知道的是:

    · ComboSql 也是一种 Sql,它也实现了 org.nutz.dao.sql.Sql 接口。

    · 函数 createCombo 接受数目可变的字符串型参数,代表 SQL  key

    · 一个 ComboSql 被执行的顺序同你给定的 key 的顺序相同。

    · 函数 createCombo 如果没有接受到参数,那么将会包括所有你文件中所有的 SQL 

 

执行自定义SQL语句

    有了自定义的SQL语句,那么怎么执行SQL语句呢?

当你顺利的创建了一个 Sql 对象,执行它就相当简单了,比如:

void demoSql(Dao dao){

    Sql sql =Sqls.create("SELECT name FROM t_abc WHERE name LIKE @name");

    sql.params().set("name","A%");

    dao.execute(sql);

}

 

执行完自定义的SQL语句怎样获得返回的结果

    SELECT 是需要返回结果的,但是 Nutz.Dao 也不太清楚怎样为你自定义的 SELECT 语句返回结果,于是,就需要你设置回调

    一个查询多条数据的自定义SQL语句,代码如下:

public ListgetUserBySql(User user)

{

       ……

       Dao dao = new NutDao(ds);

      

       Sql sql =Sqls.create("select * from tbl_userwhere uage>@uage");

       sql.params().set("uage",user.getUage());

       // 返回多个

       sql.setCallback(Sqls.callback.entities());

      

       Entityentity = dao.getEntity(User.class);

       sql.setEntity(entity);

       dao.execute(sql);

      

       return sql.getList(User.class);

}

 

在自定义的SQL语句中使用Entity

Nutz.Dao 会将你的POJO(普通JavaBean) 预先处理,处理的结果就是 Entity。可以通

过Dao接口的getEntity() 方法 获取。

如果你不设置 Entity,那么你的 Condition 的 toString(Entity) 参数就是 null。

你可以通过 Dao 接口随时获取任何一个 POJO 的Entity,但是如何设置给你的 Condition呢,答案是,通过 Sql 对象。

其代码如下:

void demoEntityCondition(Daodao) {
Sql sql =Sqls.create("UPDATE t_pet SET masterid=@masterId $condition");
Entity entity =dao.getEntity(Pet.class);
sql.setEntity(entity).setCondition(new Condition() {
public String toString(Entity entity) {
        return String.format("%s LIKE 'Y%'",entity.getField("name").getColumnName());
    }
});
dao.execute(sql);
}


    如下:

    Pet demoEntityQuery(Dao dao) {

    Sql sql =Sqls.create("SELECT * FROM t_pet $condition");

    sql.setCallback(Sqls.callback.entity());

    Entity entity =dao.getEntity(Pet.class);

    sql.setEntity(entity).setCondition(Cnd.wrap("id=15"));

    dao.execute(sql);

    return sql.getObject(Pet.class);

}

为了方便起见,你可以直接使用 Sqls.fetch 来创建你的 Sql 对象,这个函数会自动为你的 Sql 设置获取实体的回调

Pet demoEntityQuery(Dao dao) {

    Sql sql = Sqls.fetchEntity("SELECT * FROM t_pet$condition");

    Entity entity =dao.getEntity(Pet.class);

    sql.setEntity(entity).setCondition(Cnd.wrap("id=15"));

    dao.execute(sql);

    returnsql.getObject(Pet.class);

}

你可能感兴趣的:(Nutz)