|
Posted on 2017-01-10 10:48 ZhouFeng 阅读(3060) 评论(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>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 行 退出命令行状态 重新进入命令行方式,进行数据验证 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
|