问题:
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语句都是经过预编译的。