用户操作
[即时聊天] [发私信] [加为好友]
曾巧ID:numenZQ
42202次访问,排名2821,好友0人,关注者0人。
numenZQ的文章
原创 29 篇
翻译 16 篇
转载 2 篇
评论 16 篇
最近评论
xh:不推荐修改web.xml,设置java_options更好
numenZQ:补充说明一点,使用java.util.zip包时,是以UTF-8编码格式读取的文件名,因此在中文windows操作系统(Windows操作系统默认字符集为:GBK)中使用时会导致文件名解析错误,因此需要使用org.apache.tools.zip.ZipEntry和 org.apache.tools.zip.ZipOutputStream类来解决这一问题。
numenZQ:这个是需要明确知道字符串的成分,该方法只是为了满足读取不同字符集相应字符串,还是以“多哈亚运会”为例:如果字符集为GBK,截取前6个字节,结果为:“多哈亚”;当字符集为UTF-8时,截取前6个字节,结果则为:“多哈”,这是因为GBK是双字节编码,而UTF-8是三字节变长编码,如果不分字符集来读取对应长度的字串,则会出现字串内容与预期不符,长度错误等问题。
lyazure:仔细看了你的代码,作用是从一个字符串中获取指定字节数的字符,不知道你要这么做的最终目的是用来做什么。除非明确知道字符串的成分,否则这种做法很难做到完美,比如你的代码中,假如出现要从“多哈亚运会”这样的字符串中截取7个字节,最终会截得3个字符。
Alexandre:ab8e44bc75204d49bf0c9fe68a2b2176 matura foto amatoriale
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    翻译 Derby入门收藏

    新一篇: 在myeclipse下配置oc4j | 旧一篇: 在桌面应用中使用JAVA DB

    译者:曾巧(numenzq) 

    原文地址:http://www.vsj.co.uk/databases/display.asp?id=466

    源作者:Sing Li

    发布日期:2005-06-30

     

    摘要

           Derby是一个100%Java开源的关系数据库,并且你不可轻视它。

     

    正文

           一般的应用程序都需要一个简单的存储和获得数据的方法。如果你长期开发一个软件,你都需要一个关系数据库为你长期服务。然而,作为一个Java开发者,你的选择是有限的。你可能尝试使用商业的关系数据库管理系统,它们大多数不是用Java语言编写的,虽然普遍的能达到100% Java JDBC连接器。这些商业产品通常需要大量的配置,接下来需要数据库管理员对服务进行操作和调整,并且当你在每个客服端发布使用时,都需要很高的许可费。

           另一方面,你可以选择一个开源的Java基于关系数据库管理系统实现。这些产品通常是为嵌入式应用设计的。支持有限的重要的标准SQL语句,并支持关系数据库管理系统的最小特性。但是它们是自由许可的,容易管理,并且可以集成一些代码来弥补缺少的特性。

           它是一个理想的,并且开源的,100% Java编写的,容易管理的关系数据库管理系统,它可以和一些商业产品的特性进行交付。这篇文章是关注Apache Derby项目——一个两全其美的关系数据库管理系统。

     

    Derby——一个出神入化的产品周期

           图片片刻实现一个商业级软件产品的完美生命周期。最初,设计者应该开始构思;当设计师不能获得问题的答案或没有创新的解决方案时,将会丧失原有的激情。一旦产品能证明在解决问题上有自身的能力,并有一定数量的用户基础后,这个小公司将进入一个大公司的视野。使这款软件成为它们收购的目标,大公司将“handen”这个产品附加质量保证,加宽它的范畴,使之快速增长,并写出高质量的文档。一旦这款产品达到它的最高采用时,然后大公司应该支持该产品成为开源项目,有一个很好的自由许可让每个人都可以采用和修改。你,作为一个受益者可以获得这些健壮的地层代码,也可以将它加入到你的产品中,商业应用和其他的,并受益于探研地层代码的所有心血。

           当然,上面提到的理想化的软件产品生命周期听起来不会发生在资本主义自由经济下。但是有时在现实生活中,是做得到的!

           上面理想化的产品生命周期是确切的,因为它发生在Apache Derby上。Derby是一个名为Cloudscape的小公司构思的;当Cloudscape卖给Informix后,该产品得到了加强;当IBM加入时,在“big blue”期间,它的高端工程特性得到增强;现在已经成为一个有最自由的许可的开源项目而存在。

     

    广泛而深入的特性列表

           Derby的生动逼真的抚育使得它拥有一个令人惊奇的特性列表。有许多简单的高级特性不能被其他开源Java数据库利用。一部分的列表特性使Derby从其他的Java 关系数据库管理系统中分离出来,包括:

    l         100% Java实现

    l         100% Java类型4 JDBC驱动

    l         SQL92E标准支持大部分SQL 99特性

    l         ACID完全的事务独立的事务支持

    l         J2EE支持JNDI,连接池和XA

    l         视图,临时表和保存

    l         BLOBCLOB数据类型

    l         行和表锁定

    l         有价值的基本查询优化

    l         服务器端指示约束

    l         触发器和存储过程

    l         为服务器端函数,触发器或存储过程等操作在数据库里存储Java代码

    l         能排除CD-ROM里的只读数据库

    l         数据的导入和导出

    l         快速数据库加密选项

    在代码例子中,你将谈究使用指示约束,存储过程和在数据库中存储Java代码。

     

    两种灵活的使用模式

           Derby可以工作在嵌入式模式下,或在完全的客户端/服务器模式下。插图1说明在嵌入式模式下的工作原理。

    插图1:嵌入式模式

           在插图1里,你可以看到Derby引擎是嵌入在你的应用程序里的。当工作在嵌入式模式,你的应用程序访问数据库是直接和专有的。这就意味着其他应用程序不可能在同一时间访问该数据库。嵌入式模式的主要优点是不需要进行网络和服务器设置。因为你的应用程序包含了Derby引擎,使用者并不知道你使用了一个关系数据库。

           当使用Derby的嵌入式模式时,并没有复杂的配置和特殊的API需要你去学习。实际上,你仅仅需要做:

    1.         确保Derby JARs文件在你的应用程序classpath

    2.         使用嵌入式JDBC驱动

    3.         写数据库访问代码到JDBC

     

    这是正确的,Derby根本没有特殊的APIs。只需要为你的应用程序编码到JDBC,然后Derby会为你工作得很好。事实上,如果你已经有了JDBC代码,而想把代码转换到Derby嵌入式模式下运行是十分容易的。

    如果你使用过ORACLEDB2SQL ServerMySQL,你应该对网络模式(客户端/服务器模式)的工作原理相当熟悉。插图2说明了这个模型的工作原理

    插图2:客户端/服务器模式

    在插图2中,一个独立的Java进程运行作为Derby的网络服务器,通过网络监听客户端的连接。该Derby网络服务器能唯一的访问数据库存储器,并能同时接受多个客户端连接。这就允许多个用户在同一时间通过网络方式访问该关系数据库管理系统。

    当不适合使用嵌入式模式进行操作时(例如:你必须运行和管理个别的服务器进程,或许在不同的机器上),当你需要多用户访问数据库时,Derby的客户端-服务器模式能提供一个有效的解决方案。

    在插图2中,注意客户端应用程序编码到JDBC。这些不是Derby特有的APIs。事实上,这个类似于插图1里的运行在嵌入式下JDBC应用程序运行在客户端-服务器模式的最低配置下。

     

    配置Derby数据库

    为了完全体会Derby设置和使用的好处,你需要自己亲身体验它。首先,下载和安装Derby。然后,确保你的classpath环境变量包含:

    derby_installation_directory\lib\derby.jar;和derby_installation_directory\lib\derbytools.jar

     

    你也可以编辑提供给你的sp.bat文件,设置你的Derby安装目录,然后运行设置你的classpath

    一旦你设置好了classpath,就修改工作目录。数据库将被创建在这个目录里面。从db\createdb目录复制createdb.sql文件到工作目录。然后,启动命令行界面(执行ij)进入Derby

    java org.apache.derby.tools.ij

     

    你也可以使用在batch子目录下提供的ij.bat,在使用前一定要编辑该批处理文件,添加你的Derby安装目录路径。这样才能进入正确的命令行,使用嵌入式Derby引擎。你看到的提示将与下面的类似:

    ij version 10.0

    ij>

     

           你可以输入“help”;来查看可以使用的命令。要创建数据库和表来使用,仅仅需要运行createdb.sql文件。使用ij命令:

    run ‘createdb.sql’;

     

           run命令将调用一个脚本文件并执行它里面的Derby命令,类似于Windows的批处理文件。下面显示的是createdb.sql文件的内容。

    connect

                   'jdbc:derby:vsjdb;create=true';

    drop table orders;

    drop table custs;

    create table custs

                   (id char (5) not null,

                                   name char(40) not null,

                                                  primary key(id));

    create table orders

                   (id char(8) not null,

                                   custid char(5) not null,

                                                  total integer,

                                                                 primary key(id,custid));

    insert into custs values (

                   '1', 'John Smith');

    insert into custs values (

                   '2', 'Mary Todd');

    insert into orders values(

                   '0001', '1', 39999);

    insert into orders values(

                   '0002', '1', 2999);

    insert into orders values(

                   '0003', '1', 1904);

    insert into orders values(

                   '0004', '2', 3232);

    insert into orders values(

                   '0005', '2', 109900);

    在每一行都需要一个分号,这与命令行输入命令是一样的。脚本的第一行是连接命令,指明连接的嵌入式Derby驱动名字。在脚本里的连接命令为:

    connect

                  ‘jdbc:derby:vsjdb;create=true’;

     

           使用jdbc:derby说明Derby驱动是使用的JDBC协议,而vsjdb是一个数据库的名字,它能通过嵌入式驱动创建和访问。create=true属性说明如果该数据库不存在时,就创建该数据库。

           createdb.sql脚本将创建一个名为vsjdb(当它不存在时)的数据库,并在该数据库中创建custsorders表。它将在表中添加两个用户和五个定单。如果你使用过其他数据库的SQL语句,你应该相当熟悉在脚本里的SQL语句。

           你可以查看你的工作目录,现在你将看到一个vsjdb子目录。数据将保存在里面。数据库可以很简单的的进行备份,就是复制这个子目录。

     

    表格1和表格2custsorders表的信息

    Table 1: The custs table

    Field Name

    Data Type

    Note

    Id

    char(5)

    primary key

    Name

    char(40)

     

    Table 2: The orders table

    Field Name

    Data Type

    Note

    Id

    char(8)

    primary key (compound)

    Custid

    char(5)

    primary key (compound)

    Total

    int

     

     

    与关系数据库管理系统数据操作

    要查看顾客记录信息,在ij提示行后使用SQL SELECT语句:

    select * from custs;

     

    要查看定单,使用下面的命令:

    select * from orders;

     

    要删除顾客,尝试使用下面的命令:

    delete from custs where id=’1’;

     

    你可以选择custs表里的某一行,并能查看到哪个用户被删除。要删除与这个用户相关联的定单信息,使用下面的命令:

    delete from orders where custid=’1’;

     

    你现在可以查看orders表,并能看见所有关于一号顾客的定单都被删除了。

    在你离开ij前,删除数据库里的所有记录:

    delete from custs;

    delete from orders;

     

    着它将是一个空数据库,在下一部分,将写入自定义的Java代码。

    使用exit命令离开ij

    exit;

     

    自从连接URL指定了嵌入式驱动,只有ij能唯一的访问这个数据库。

     

    嵌入Derby到你的Java应用程序中

           时间加速我们的Java编译和编写某些代码。这些代码将放入Derby做一个小测试,给你一个关系数据库管理系统能处理现实世界大量数据能力的信心。

           下面是名为FillTable.java的代码,将创建1000个用户,每个用户有10条定单——总共10000条定单。在嵌入子目录下你可以找到FillTable.java的源代码。

    import java.sql.*;

    public class TableFiller {

                   Connection conn = null;

                   PreparedStatement insertCust

                                   = null;

                   PreparedStatement insertOrder

                                   = null;

     

           上面的申明是标准的JDBC申明。conn控制JDBC连接。insertCustinsertOrder将分别处理插入记录到custsorders表里的SQL语句。PreparedStatement的使用使关系数据库管理系统得到优化的可能。

           其次,下面的代码,driverName包含我们装载和使用的JDBC驱动器的类名。这是一个嵌入式驱动器。连接的URLurl值。你可以看见是使用的绝对路径定位这个数据库(注意:你必须要使用正斜线来分离路径)。如果你总是在你的工作目录运行这个程序的话,你可以仅使用”jdbc:derby:vsjdb”。也可以可以设置derby.system.home属性来改变Derby数据库文件的位置(例如:java –D derby.system.home=c:\mydbdir org.apche.derby.tools.ij)。

    String driverName =

    "org.apache.derby.jdbc.EmbeddedDriver";

    String url =

                   "jdbc:derby:c:/derby1021/vsjdb";

     

           loadDrivers()方法装载JDBC驱动类并创建获得一个DerbyJDBC连接。并准备两个插入语句。

    public void loadDrivers()

                   throws SQLException,

                   ClassNotFoundException {

                   Class.forName(driverName);

                   conn = DriverManager.getConnection(

                                   url);

                   insertCust = conn.prepareStatement(

                                   "INSERT INTO custs VALUES(

                                   ?, ?)");

                   insertOrder =

                                   conn.prepareStatement(

                                   "INSERT INTO orders VALUES(

                                   ?, ?, ?)");

    }

     

           TableFillermain()