文章阅读
合理使用JDiy的主键生成器
文章类别: JDiy框架教程  更新日期: 2012-04-25 20:05:17.0  点击次数:5275
  数据库中的表,都应该拥有主键字段,以方便我们对这些数据进行删改查。而对主键的定义和生成方式有许多种。主键可以定义为单一的某个字段(绝大多数情况都是如此),也可以是由多个字段组成的“联合主键”。单一主键的生成方式,通常定义为“自动增长”的数值,也可以是由用户自己维护的任意类型的字段,相信大家对这些都有很深的了解,那么本文所要讲解的正是与这些有关的内容。同时,教大家合理地使用JDiy的主键生成器,来提高您的开发效率。
一、“自动增长”类型的主键
  首先,我们来看一下大家通常的做法,通常情况下,主键被定义为“自动增长”类型的数值,对于不同的数据库类型,会提供不同的用于维护这些“自动增长”的信息(例如Oracle的Sequence, SQL Server的identity等)。
  这种做法是最简单方便的,我们不必自己去维护主键,同时,它的效率也比较高。但是,这种方式最大的缺点也是显而易见的,相信大家都遇到过,其一,信息在写入到数据库之前,我们并不知道主键值是多少;其二,对于不同的数据库,即使信息被insert到了数据库中,仍然难以立即正确获取到刚写入数据库的记录的主键值。(当然,并不是说不能获取到主键值,只是针对还不太了解JDBC的新手来说,或多或少有一定的难度)。
二、自己维护主键
  我们可以通过程序算法,自己来生成和管理主键,只要保证生成的主键具有唯一性,不会因主键重复而出现程序错误就可以了。自己生成主键的好处是,信息在写入到数据库之前,我们便可以取到其值,而在写入数据库时,主键可以像普通字段那样update。
  自己维护主键的缺点就是,由于需要我们自己去编写程序算法来生成主键,又要保证生成的主键值不重复,这样增大了开发成本,同时,由于主键算法的原因,其性能比数据库本身的“自动增长”效率要慢得多。
三、JDiy推荐的主键管理方式
  JDiy并不单方面的去推荐大家使用哪种主键生成方式,只是具体问题具体分析罢了。找出一种最符合您需要的才是王道。
1. “自增”型主键:
  例如您建了一个名为table1的表,设置的主键字段名为id,定义为整型“自动增长”,利用JDiy可以方便的向这个表添加数据,并且在将信息写入到数据库后,您可以立即获取到这条信息的主键值,非常方便,如下面示例性的代码:
Rs rs = new Rs("table1");
rs.set("name", "张三");
dao.save(rs);//信息写入到数据库
System.out.println(rs.get("id"));//可以直接返回刚添加到数据库中的记录的自增主键值
  从上面示例性的代码可以看出,在JDiy开发中,我们无需担心无法获取刚写入数据库的记录的主键值,非常方便。
2. 自己维护主键(使用JDiy主键生成器)
  JDiy提供自己维护主键的方法,在很多种情况下,使用下面的方式,将有助于您更加快速的进行开发。
  JDiy的Rs对象有一个名叫newId()的静态方法,它就是JDiy的主键生成器,所生成的主键是一个具有10个字符长度的定长字符串。您每次调用newId()方法,都将产生唯一的ID值!
  例如您新建了一个名为table2的表,其中包含一个名为"id"的字段,请将其定义为“char(10)”字符类型,并标识为主键即可。下面的代码显示了JDiy的主键生成器的用法:
Rs rs = new Rs("table2");
rs.set("id", Rs.newId());
rs.set("name", "李四");
dao.save(rs);
  看到了吗?我们通过Rs.newId()生成了一个ID,然后像普通字段一样set到rs对象中,最后调用dao.save方法写入到数据库中即可。
  注意,在save到数据库之前,我们就已经知道ID值了,很方便。由于每次调用Rs.newId()都将产生一个新的不重复的ID值,因此,如果您都使用此方法来维护表主键,这些主键将具有“整库唯一”的特性(即在整个数据库中都是唯一的,这一点很重要!而我们前面使用的“自增”型主键,只能保证在该表唯一)。
  使用JDiy来为您生成主键有很大的好处。例如您正在做一个有关“公司产品展示”相关的网站后台系统,在后台中要管理产品(数据库中有一个产品表),而与产品相关的还有诸如“缩略图”,“产品大图”等等文件类型的数据(在这里我们统称为“附件”)。这些附件要与产品关联,有的人在产品表中添加对应的字段来记录其“文件存放路径”,甚至还有的人直接将这些附件以blob二进制的方式写入到表中,无论您使用哪一种方式,都需要在表中增加一些额外的数据列,而一但以后还后要增加“附件”,又得在表中去增加相应的列,还有可能要修改之前写好的代码,非常麻烦不说,而且效率极其低下。现在,如果这个“产品”表的主键值是通过JDiy的主键生成器来生成的,那么您将非常方便的来管理这些“附件”数据,而且不需要向表中额外增加任何字段!同时,如果以后要再增加”附件“,您无需修改之前写好的代码,我们来看看,通过JDiy主键生成器管理的数据表,如何存储这些”附件“数据(假设上传了两个附件文件,file1和file2):
File file1=new File("在此指定文件路径");
File file2=new File("在此指定文件路径");
Rs rs = new Rs("product");
//todo ...设置rs的普通字段
rs.setF("pic1", file1);
rs.setF("pic2", file2);
dao.save(rs);
  注意,上面的setF中的pic1,pic2这些,是您随意取的名字(不要与数据库字段名重名即可),这些名字不需要在表中去定义!JDiy会自动以一定的规则,将这些”附件“数据,存储到服务器的相应目录中去。下面代码演示了,如何通过Rs对象获取相关的文件附件:
Rs rs = dao.rs(new Args("product", "id='y0r6tug7hfud' ")); //查询出产品
File file1 = rs.getFile("pic1");//还有个getF方法,是取文件的路径地址的(详情参见JDiy API)
File file2 = rs.getFile("pic2");
  通过这些方法,我们无需去关心文件附件怎么存储,因为JDiy已经为您处理好一切啦。如果您查阅了JDiy的API开发文档,您会了解到,我们还提供了对XML字段数据的读取和写入方法(如getX, setX)。唯一需要您注意的就是,要在Rs对象上使用getFile, setFile, getF, setF, getX, setX这些方法,您必须保证该Rs的主键ID是“整库唯一”的(Rs.newId()生成的主键具有整库唯一特性)。
四、关于JDiy主键生成器的一些说明
  针对某个表,如果需要额外的关联一些图片/文件/XML等数据,可以使用JDiy主键生成器生成主键,这样您无需去关心附件怎么存储和读取,怎么与某个记录关联,将极大的简化您的开发;
  针对某个表,如果在同一时间内,需要向该表插入大量的数据(例如调用一个for循环一次写入几百条,几千条,甚至上万条的数据,通常这样的表不涉及到“附件”),您应该使用数据库的“自增”主键,而不要使用JDiy的主键生成器,在同一时间多次调用Rs.newId(),并写入到数据库,将带来性能上的瓶颈。
  在JDiy开发平台中,在家会经常见到“File文件字段”,“XML字段”等信息,正是那些表使用了“JDiy的主键生成器”,才使我们更加方便的读取这些“附件”数据。
[ 上一篇 利用JDiy删除数据库中的记录   下一篇 如何在JDiy中使用freemarker和JsonObject ]
鄂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号码以便我们能与您取得联系。