Hello JavaDB

    长久以来,由于大量(甚至几乎所有)的 Java 应用都依赖于数据库,如何使用 Java 语言高效、可靠、简洁地访问数据库一直是程序员们津津乐道的话题。新发布的 Java SE 6 也在这方面更上层楼,为编程人员提供了许多好用的新特性。其中最显著的,莫过于 Java SE 6 拥有了一个内嵌的 100% 用 Java 语言编写的数据库系统。并且,Java 6 开始支持 JDBC 4.0 的一系列新功能和属性。这样,Java SE 在对持久数据的访问上就显得更为易用和强大了。

Java DB:Java 6 里的数据库

    新安装了 JDK 6 的程序员们也许会发现,除了传统的 bin、jre 等目录,JDK 6 新增了一个名为 db 的目录。这便是 Java 6 的新成员:Java DB。这是一个纯 Java 实现、开源的数据库管理系统(DBMS),源于 Apache 软件基金会(ASF)名下的项目 Derby。它只有 2MB 大小,对比动辄上 G 的数据库来说可谓袖珍。但这并不妨碍 Derby 功能齐备,支持几乎大部分的数据库应用所需要的特性。更难能可贵的是,依托于 ASF 强大的社区力量,Derby 得到了包括 IBM 和 Sun 等大公司以及全世界优秀程序员们的支持。这也难怪 Sun 公司会选择其 10.2.2 版本纳入到 JDK 6 中,作为内嵌的数据库。这就好像为 JDK 注入了一股全新的活力:Java 程序员不再需要耗费大量精力安装和配置数据库,就能进行安全、易用、标准、并且免费的数据库编程。在这一章中,我们将初窥 Java DB 的世界,来探究如何使用它编写出功能丰富的程序。

Hello, Java DB:内嵌模式的 Derby

    有了内嵌(embedded)的数据库,就让我们从一个简单的范例开始,试着使用它。这个程序做了大多数据库应用都可能会做的操作:在 DBMS 中创建了一个名为 helloDB 的数据库;创建了一张数据表,取名为 hellotable;向表内插入了两条数据;然后,查询数据并将结果打印在控制台上;最后,删除表和数据库,释放资源。

清单 1. HelloJavaDB 的代码

public class HelloJavaDB { 

    public static void main(String[] args) { 

        try {

            // 加载数据库驱动

            Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance(); 

            System.out.println("Load the embedded driver"); 

            Connection conn = null; 

            Properties props = new Properties(); 

            props.put("user", "user1");  props.put("password", "user1"); 

           //建立并连接 helloDB  

            conn=DriverManager.getConnection("jdbc:derby:helloDB;create=true", props); 

            System.out.println("create and connect to helloDB"); 

            conn.setAutoCommit(false);  //要进一步学清楚的

 

            // 建立一个表以及两项记录

            Statement s = conn.createStatement(); 

            s.execute("create table hellotable(name varchar(40), score int)"); 

            System.out.println("Created table hellotable"); 

            s.execute("insert into hellotable values('Ruth Cao', 86)"); 

            s.execute("insert into hellotable values ('Flora Shi', 92)"); 

            // 列出两个项目

            ResultSet rs = s.executeQuery( 

                "SELECT name, score FROM hellotable ORDER BY score"); 

            System.out.println("name/t/tscore"); 

            while(rs.next()) { 

                StringBuilder builder = new StringBuilder(rs.getString(1)); 

                builder.append("/t"); 

                builder.append(rs.getInt(2)); 

                System.out.println(builder.toString()); 

            } 

            // 删除表

            s.execute("drop table hellotable"); 

            System.out.println("Dropped table hellotable"); 

             

            rs.close(); 

            s.close(); 

            System.out.println("Closed result set and statement"); 

            conn.commit(); 

            conn.close(); 

            System.out.println("Committed transaction and closed connection"); 

             

            try { // perform a clean shutdown  

                DriverManager.getConnection("jdbc:derby:;shutdown=true"); 

            } catch (SQLException se) { 

                System.out.println("Database shut down normally"); 

            } 

        } catch (Throwable e) { 

            // handle the exception 

        } 

        System.out.println("SimpleApp finished"); 

    } 

}

随后,在命令行下键入以下命令:

清单 2. 运行 HelloJavaDB 命令

java –cp .;%JAVA_HOME%/db/lib/derby.jar HelloJavaDB

      上述的程序和以往没什么区别。不同的是我们不需要再为 DBMS 的配置而劳神,因为 Derby 已经自动地在当前目录下新建了一个名为 helloDB 的目录,来物理地存储数据和日志。需要做的只是注意命名问题:在内嵌模式下驱动的名字应为 org.apache.derby.jdbc.EmbeddedDriver;创建一个新数据库时需要在协议后加入 create=true。另外,关闭所有数据库以及 Derby 的引擎可以使用以下代码:

清单 3. 关闭所有数据库及 Derby 引擎

DriverManager.getConnection("jdbc:derby:;shutdown=true");

如果只想关闭一个数据库,那么则可以调用:

清单 4. 关闭一个数据库

DriverManager.getConnection("jdbc:derby:helloDB;shutdown=true ");

这样,使用嵌入模式的 Derby 维护和管理数据库的成本接近于 0。这对于希望专心写代码的人来说不失为一个好消息。

内嵌模式的局限

    在使用内嵌模式时,Derby 本身并不会在一个独立的进程中,而是和应用程序一起在同一个 Java 虚拟机(JVM)里运行。因此,Derby 如同应用所使用的其它 jar 文件一样变成了应用的一部分。这就不难理解为什么在 classpath 中加入 derby 的 jar 文件,我们的示例程序就能够顺利运行了。这也说明了只有一个 JVM 能够启动数据库:而两个跑在不同 JVM 实例里的应用自然就不能够访问同一个数据库了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值