文章阅读
Dao对象的save方法是如何判断insert还是update的?
文章类别: JDiy常见问题解答  更新日期: 2013-06-24 21:50:18.0  点击次数:8966

问题:

JDiy框架,插入(insert)和更新(update)数据,都用dao.save(rs) 这一个方法吗?那它如何区分insert还是update?

查询出来的rs对象,重新set字段后,直接save更新,还是要重新构建一个rs对象才能save更新呢?

回答:

1. insert和update都是调用的save方法。

2. save方法将根据表的主键来确定是要insert还是update。

事实上,这个save方法是非常智能的,在数据表定义了主键(PRIMARY KEY)的情况下,无论Rs对象是通过dao.rs, dao.ls等方法查询出来的,还是通过new关键字构造出来的, JDiy都能够自动识别它的主键信息,并根据主键字段来确定是insert还是update(因为主键值都是唯一的)。

而如果表并未定义主键(这比较特殊,也比较少见),那么调用save方法之前,就必须先通过setPK(String .. pks)方法人为地设置一个(或多个)具有“唯一特性”的字段来作为insert或update的条件依据,例如,下面代码演示了在表tb未定义主键的情况下,通过field1和field2两个字段来确定insert还是update:

Rs rs = new Rs("tb");
//...相关代码略...
rs.set("field1", "aaa");
rs.set("field2", "bbb");
rs.set("field3", "ccc");
rs.set("field4", "ddd");
rs.setPK("field1", "field2");
dao.save(rs);//保存数据

如果我们把以上代码翻译成SQL语句,它就类似于下面这样子:

select field1,field2,field3,field4 from tb where field1='aaa' and field2='bbb';
-- 如果上面的select语句能查询到数据,则执行:
update tb set field3='ccc', field4='ddd' where field1='aaa' and field2='bbb';
-- 如果上面的select语句不能查询到数据,则执行:
insert into tb (field1,field2,field3,field4) values ('aaa','bbb','ccc','ddd');

3. save方法会自动扫描Rs对象中被更改过的字段进行更新,对于未更改过的字段,将不作处理。

例如某个表x, 共有10个字段fd1, fd2, ... fd10,而通过dao对象的相关方法只查询出来了其中4个字段,并且只对这4个字段中的两个进行了更改,则调用save方法保存数据时,JDiy只会更新这两个修改过的字段(而不是10个),这大大的节省了SQL语句执行的效率,且不会对现有其它字段造成影响。

示例代码片段:

Rs rs = dao.rs(new Args("x", "id=1", "fd1,fd2,fd9,fd10"));
if(!rs.isNull()){//判断数据存在时才执行更新
    rs.set("fd1", 1);
    rs.set("fd2","aaa");
    // save方法保存数据。调用save方法后执行的SQL语句将是:
    // update x set fd1=1, fd2='aaa' where id=1;
    // 从这儿可以看出,它仅更新修改过的字段值,不会影响其它字段.
    dao.save(rs);
}

附注:为便于说明,本文上面的示例代码直接给出了SQL语句,JDiy实际的操作中,相应的SQL语句都是经过预编译的。

[ 上一篇 登录JDiy建站平台提示"对不起,开发账号在…   下一篇 为何web.xml中的welcome-file-list不能是Act… ]
鄂ICP备18006629号-1 鄂ICP备18006629号-2       鄂公网安备 42050302000160号


技术支持QQ:39886616 QQ群:7759217
联系JDiy作者: ziquee java/javascript WEB编程
E-mail:ziquee@abcbcd.com http://189.cn
*尊姓大名:

*电子邮箱:

*QQ号码:

*留言内容:
提交留言
取消
loading...
注:带"*"的为必填项。请如实填写您的E-mail或QQ号码以便我们能与您取得联系。