您的位置:首页 > 数据库

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

2016-04-15 18:27 495 查看
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 List<User>getUserBySql(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());

Entity<User>entity = 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<Pet> 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<Pet> 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<Pet> entity =dao.getEntity(Pet.class);
sql.setEntity(entity).setCondition(Cnd.wrap("id=15"));
dao.execute(sql);
returnsql.getObject(Pet.class);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: