|  | 
				
					
	
		
			
 			Posted on 2017-01-10 10:48 ZhouFeng  阅读(3469) 评论(0)  编辑  收藏   所属分类: 原创  、JAVA  、DataBase   在做一些小的应用系统时,用过嵌入式数据库,使用过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>ijij 版本 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 行
退出命令行状态 重新进入命令行方式,进行数据验证 G:\Java\jdk1.8.0_73\db\bin>ijij 版本 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 driverinsert 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>startNetworkServerTue 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>ijij 版本 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 driverinsert 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 
	    
    
 |