posts - 2, comments - 27, trackbacks - 0, articles - 60
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JavaDB数据库使用笔记

Posted on 2017-01-10 10:48 ZhouFeng 阅读(3060) 评论(0)  编辑  收藏 所属分类: 原创JAVADataBase
在做一些小的应用系统时,用过嵌入式数据库,使用过HSQLDB,这个比较小巧,在做了几个应用之后觉得挺好用的,因为数据量不多,也能够满足要求,也就在嵌入式数据库这条路上越走越远了。
在JAVA里也有一个嵌入式数据库,也想尝试着用一下,便有了下面这篇日志。在安装jdk的时候会提示安装一个数据库,如果勾选的话,则会在安装Java嵌入式数据库JavaDB,在JAVA_HOME目录下多出一个db的目录(在jdk6版本里目录名为JavaDB),里面就是与数据库有关的文件了,如果安装jdk时没有选择安装,可以在官网http://db.apache.org/derby/derby_downloads.html上下载解压即可,经过了一段时间的摸索,现小结如下。

1.配置环境变量

在使用之前,需要配置环境变量DERBY_HOME指向db所在目录,本机JAVA_HOME为G:\Java\jdk1.8.0_73,则DERBY_HOME应该配置为G:\Java\jdk1.8.0_73\db,或%JAVA_HOME%\db,如果希望后面在命令行里用起来方便点,也可以将%DERBY_HOME%\db\bin添加到path里去

2.目录介绍

在DERBY_HOME目录下有两个目录bin和lib
bin:存放执行批处理文件,用于查看,启动和停止数据库的脚本
lib:存放所用到的jar包
bin目录下有几个主要的文件,有两个不同的方式,没有.bat后缀的文件为Linux平台下运行的脚本,bat文件为Windows平台使用的批处理
dblook:用于查看数据库的基本信息及DDL语句
ij:命令行客户端程序,提供与数据库的交互
NetworkServerControl:提供网络服务,主要被startNetworkServer和stopNetworkServer调用
startNetworkServer:启动网络数据库模式,开启监听
stopNetworkServer:关闭网络数据库模式,停止监听
sysinfo:查看当前系统信息,可用于检测数据库是否正确安装
几个以CP结束的批处理,主要用于在不同模式下设置CLASSPATH用的,如果把lib目录下的jar文件添加到CLASSPATH中,就可以不用通过执行批处理来设置CLASSPATH了

3.用命令行方式开启数据库

G:\Java\jdk1.8.0_73\db\bin>ij
ij 版本 10.11
ij> connect 'jdbc:derby:mydb;create=true';
加上create=true表明如果库mydb不存在,则创建,数据库文件存放位置为当前目录,接下来创建一个表,可以把三个字段定义信息写在一行里面,结束时要加分号
ij> create table stu(id int not null generated by default as identity,
> stuname varchar(20),
> email varchar(30));
已插入/更新/删除 0 行
向表中写入一条记录,并进行查询
ij> insert into stu(stuname,email) values('Tom','tom@test.com');
已插入/更新/删除 1 行
ij> select * from stu;
ID         |STUNAME             |EMAIL
---------------------------------------------------------------
1          |Tom                 |tom@test.com

已选择 1 行
退出命令行状态
ij> exit;
重新进入命令行方式,进行数据验证
G:\Java\jdk1.8.0_73\db\bin>ij
ij 版本 10.11
ij> connect 'jdbc:derby:mydb';
ij> select * from stu;
ID         |STUNAME             |EMAIL
---------------------------------------------------------------
1          |Tom                 |tom@test.com

已选择 1 行
查看当前表结构可以用describe <表名>
ij> describe stu;
COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
ID                  |INTEGER  |0   |10  |10    |GENERATED&|NULL      |NO
STUNAME             |VARCHAR  |NULL|NULL|20    |NULL      |40        |YES
EMAIL               |VARCHAR  |NULL|NULL|30    |NULL      |60        |YES

已选择 3 行
ij>
这是在命令行方式下的基本使用

4.在Java工程中使用JavaDB

在Eclipse中创建一个Java工程,导入derby.jar包,代码如下
package com.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class EmbedDB {

    private static String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    private static String protocol = "jdbc:derby:db3;create=true"; // 在工程目录下创建数据库
    
// private static String protocol = "jdbc:derby:db/db3;create=true";    //在工程目录下db目录中创建数据库
    
// private static String protocol = "jdbc:derby:D:/mydbs/db3;create=true";    //在D:/mydbs/目录下创建数据库

    public static void main(String[] args) {
        try {
            Class.forName(driver).newInstance();
            System.out.println("Loaded the appropriate driver");
            Connection conn = DriverManager.getConnection(protocol);
            Statement stmt = conn.createStatement();
            stmt.executeUpdate("create table stu(id int not null generated by default as identity,stuname varchar(20),email varchar(30))");

            for (String str : "one,two,three,four,five".split(",")) {
                String sql = "insert into stu(stuname,email) values('" + str + "','" + str + "@test.com')";
                System.out.println(sql);
                stmt.addBatch(sql);
            }
            stmt.executeBatch();
            System.out.println("insert over");
            conn.commit();

            stmt.close();
            conn.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
运行结果
Loaded the appropriate driver
insert into stu(stuname,email) values('one','one@test.com')
insert into stu(stuname,email) values('two','two@test.com')
insert into stu(stuname,email) values('three','three@test.com')
insert into stu(stuname,email) values('four','four@test.com')
insert into stu(stuname,email) values('five','five@test.com')
insert over

5.网络数据库模式

JavaDB是跑在JVM中的,如果此时再开启一个新的窗口,打开当前数据库,会报错,如果希望有多个客户端连接,如开发阶段,一边在Eclipse里运行程序,一边在命令行里查看数据记录,这种情况就可以使用JavaDB的网络启动模式
G:\Java\jdk1.8.0_73\db\bin>startNetworkServer
Tue Jan 10 09:10:54 CST 2017 : 已使用基本服务器安全策略安装了 Security Manager。
Tue Jan 10 09:11:04 CST 2017 : Apache Derby 网络服务器 - 10.11.1.2 - (1629631) 已启动并准备接受端口 1527 上的连接
表示当前窗口正在监听,即网络服务已开启
查看数据库的基本情况可以用dblook
G:\Java\jdk1.8.0_73\db\bin>dblook -d 'jdbc:derby://localhost:1527/mydb'
-- 时间戳记:2017-01-10 09:18:30.232
-- 源数据库为:mydb
-- 连接 URL 为:jdbc:derby://localhost:1527/mydb
-- appendLogs: false

-- ----------------------------------------------
-- 表的 DDL 语句
-- ----------------------------------------------

CREATE TABLE "APP"."STU" ("ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), "STUNAME" VARCHAR(20), "EMAIL" VARCHAR(30));
以命令行方式进行数据库连接并测试
G:\Java\jdk1.8.0_73\db\bin>ij
ij 版本 10.11
ij> connect 'jdbc:derby://localhost:1527/mydb'
ij> show tables in app;
TABLE_SCHEM         |TABLE_NAME                    |REMARKS
------------------------------------------------------------------------
APP                 |STU                           |

已选择 1 行
ij> select * from stu;
ID         |STUNAME             |EMAIL
---------------------------------------------------------------
1          |Tom                 |tom@test.com

已选择 1 行
ij>
此时也可以在Eclipse中使用Java程序进行数据库访问,需要加载derbyclient.jar包,代码如下
package com.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class ClientDB {

    private static String driver = "org.apache.derby.jdbc.ClientDriver";
    private static String protocol = "jdbc:derby://localhost:1527/mydb";

    public static void main(String[] args) {
        try {
            Class.forName(driver).newInstance();
            System.out.println("Loaded the appropriate driver");
            Connection conn = DriverManager.getConnection(protocol);
            Statement stmt = conn.createStatement();
            for (int i = 1; i < 10; i++) {
                String sql = "insert into stu(stuname,email) values('user" + i + "','user" + i + "@test.com')";
                System.out.println(sql);
                stmt.addBatch(sql);
            }
            stmt.executeBatch();
            System.out.println("insert over");
            conn.commit();

            stmt.close();
            conn.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
控制以输出结果为
Loaded the appropriate driver
insert into stu(stuname,email) values('user1','user1@test.com')
insert into stu(stuname,email) values('user2','user2@test.com')
insert into stu(stuname,email) values('user3','user3@test.com')
insert into stu(stuname,email) values('user4','user4@test.com')
insert into stu(stuname,email) values('user5','user5@test.com')
insert into stu(stuname,email) values('user6','user6@test.com')
insert into stu(stuname,email) values('user7','user7@test.com')
insert into stu(stuname,email) values('user8','user8@test.com')
insert into stu(stuname,email) values('user9','user9@test.com')
insert over
此时查看数据库内容为
ij> select * from stu;
ID         |STUNAME             |EMAIL
---------------------------------------------------------------
1          |Tom                 |tom@test.com
2          |user1               |user1@test.com
3          |user2               |user2@test.com
4          |user3               |user3@test.com
5          |user4               |user4@test.com
6          |user5               |user5@test.com
7          |user6               |user6@test.com
8          |user7               |user7@test.com
9          |user8               |user8@test.com
10         |user9               |user9@test.com

已选择 10 行
ij>

小结

终于学习了JavaDB,又尝试了一种嵌入式数据库,在做一些小项目或是应用演示时很方便。在了解过JavaDB后,觉得JavaDB也是个不错的选择,很多操作都做成了批处理方式,在HSQLDB中也可以自己构造批处理,在HSQLDB中有个图形界面可以用,相对直观一些,对于体积来说,HSQLDB好像更小巧点,他们都支持内存数据库,目前在数据库性能上没有做比较。总的来说,JavaDB是个不错的选择,使用起来比较方便。此文仅做简单介绍,如果希望了解得更多,可参考官方文档http://db.apache.org/derby/manuals/index.html#latest
有几个不同部分的文档,与SQL相关的部分如创建删除表的SQL怎么写,可以参考其中的《Derby Reference Manual》
另外在学习JavaDB里找了一些资料,下面这一篇我觉得还不错,一并附上
参考资料:http://www.codejava.net/java-se/jdbc/connect-to-apache-derby-java-db-via-jdbc

只有注册用户登录后才能发表评论。


网站导航: