在前一篇文章中,我们了解到了JDiy的Args参数对象,它专门用作查询数据库的条件参数,传入到Dao对象的rs(Args args)或ls(Args)方法中,就可以返回查询结果了。本文再来回顾一下,如何从数据库中返回单条记录。
例如我们从user_info这个数据表中,查询id=1的那条记录,我们可以使用像下面这样的代码:
Rs user = dao.rs(new Args("user_info", "id=1");
对,就这么简单的一行语句,我们就可以取得id=1的这条user_info记录了!
现在假设我们要获取的记录不存在,JDiy又会返回什么呢?例如我们设置一个“1=0”的永远不会成立的条件来进行查询测试一下:
Rs user = dao.rs(new Args("user_info", "1=0");
System.out.print(user);
我们会得到类似这样的输出结果: @user_info
可以看到,JDiy并没有返回null。这是JDiy的一个特性,即当我们通过dao.rs(Args args)方法查询不到任何记录时,JDiy会返回一个空的Rs对象(而不是返回null),这很重要,我们可以避免因程序编写不严谨而导致NullPointerException(即空指针异常)的错误;同时,也便于在更新记录时,不必先判断所查询出来的结果记录(Rs)是否存在,可以直接调用其相关的set方法设置数据后保存。
既然查不到记录,JDiy也会返回一个Rs对象,那我们怎么知道倒底有没有查询到记录呢?这时我们可以通过Rs对象的isNull方法来判断判断,当没有查到记录时,此方法将会返回true, 如:
Rs user = dao.rs(new Args("user_info", "id=1");
if(user.isNull()){
System.out.println("没有找到。");
}else{
//todo something
}
在前面我们说到,Rs对象对应于数据库中的记录。这并不表示一个Rs对象只能返回一张表中的某条记录,实际上,任何返回的查询结果,都可以映射为一个Rs对象。
例如(多表查询):
Args args = new Args("user_info u, user_type t", "u.type_id = t.id AND u.id=1", "u.*, t.name AS typeName");
Rs rs=dao.rs(args);
又如(统计):
Rs rs = dao.rs(new Args("user_info", "id>100", "count(id) AS cnt"));
(注:实际上我们有专门的统计数量的方法“dao.len(Args args)”,此处只是为了说明查询,所以才这样写。)
自JDiy-1.12及后续版本开始,JDiy还可以直接通过原生SQL语句返回单条记录,如:
Rs rs = dao.rs("select * from user_info where id=1");