ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【数据库编程】Derby数据库的摆设与验证【用 ij 工具创建数据库】 [打印本页]

作者: 灌篮少年    时间: 2024-7-25 11:56
标题: 【数据库编程】Derby数据库的摆设与验证【用 ij 工具创建数据库】
Java有一个内置的Derby数据库,是一个完全用Java语言编写的、功能强盛的微型数据库,其基础引擎和内嵌的JDBC驱动总共大约2MB大小。Derby为用户提供了轻量的标准数据库引擎,它可以紧密地嵌入到任何基于Java的办理方案中。
Derby的特性令人惊奇,它可以支持关系数据库中的全部企业级的特性,包罗崩溃恢复、事务回滚和提交、行/表级锁、视图、主键/外键束缚、触发器、子查询表达式,等等。
Derby数据库可以有两种摆设方式:
1,嵌入式:Derby数据库提供了嵌入式的JDBC驱动,因此可把Derby数据库嵌入到Java应用步调内。这种模式的Derby数据库实用于单个用户的Java应用步调,Derby和应用步调运行在同一个JVM中。
2,服务器模式:网络数据库模式,这是标准的数据库服务器(服务器/客户端)模式,是全部的数据库产品都支持的模式。
用 Apache Derby 的数据库工具 ij 创建数据库情况
在使用数据库之前,必须先举行数据库摆设。
建表实例,如果有需求要处理银行账户,有二个建表的需求,如下所示:


如果是 Microsoft Windows® 系统,我们要把数据库创建在D:/DB/embed/BankDB目次。我们可以编写一个创建数据库这二张表的SQL脚本,bankDB_CrtDBemb.sql如下:
  1. connect 'jdbc:derby:D:/DB/embed/BankDB;create=true' ;  --创建数据库的连接字符串
  2. -- 创建银行账户余额表
  3. CREATE TABLE bank.actsBalance (
  4. cardNumber VARCHAR(19) PRIMARY KEY,
  5. actBalance DECIMAL(10,2) check(actBalance>=0),
  6. tradeDate TIMESTAMP
  7. ) ;
  8. -- 创建银行账户明细表
  9. CREATE TABLE bank.actsDetail (
  10. cardNumber VARCHAR(19) NOT NULL,
  11. deposit DECIMAL(10,2) check(deposit>=0),
  12. withdraw DECIMAL(10,2) check(withdraw>=0),
  13. tradeDate TIMESTAMP,
  14. FOREIGN KEY (cardNumber) REFERENCES bank.actsBalance(cardNumber)
  15. ) ;
复制代码
从JDK1.6开始Java中就集成了Derby数据库,Derby数据库驱动类相关的jar包是derby.jar,其在JDK中的位置是db目次下的lib子目次,如(jdk后面的数字编号是版本号):“C:\Program Files(x86)\Java\jdk1.7.0_79\db\lib”。但是有的情况中确实找不到Derby数据库相关的db目次。如有必要就要单独下载。下面是我上传的一个Derby数据库JAR包资源链接:
Derby数据库JAR包derby-10.14.2.0-lib.zip
Derby数据库JAR包的安装
我把derby的JAR包的安装在D:\derbydb目次,

其子目次lib中是数据库的jar包, 其子目次bin中有一些数据库管理工具,如 ij 工具、服务器模式所需的管理工具startNetworkServer和stopNetworkServer,如下图所示:

说明:
如果是Java步调中创建嵌入式Derby数据库,实际上只必要derby.jar包就可以了。
Microsoft Windows® 系统中创建嵌入式Derby数据库
如果是 Microsoft Windows® 系统,先要精确设置 DERBY_INSTALL 和 CLASSPATH 情况变量。
可用“记事本”创建一个批处理文件如setDerby.bat,脚本命令如下:
  1. set DERBY_INSTALL=D:\derbydb
  2. set CLASSPATH=%DERBY_INSTALL%/lib/derby.jar
  3. set CLASSPATH=%CLASSPATH%;%DERBY_INSTALL%/lib/derbytools.jar;.
复制代码
可以在 Microsoft Windows® 系统上“以管理员身份运行”运行CMD命令行提示符窗口,执行批处理文件setDerby.bat,设置就可生效。
注意:无论是 Windows ®还是 UNIX® 脚本文件,一定要确保精确指定安装 Derby 软件的目次。
精确设置了情况变量之后,可以运行 ij 工具运行脚本bankDB_CrtDBemb.sql来创建数据库。我的脚本bankDB_CrtDBemb.sql在D:\Temp文件夹中,因此用ij执行时命令为:run ‘D:\Temp\bankDB_CrtDBemb.sql’;
如下图,表示数据库和两个数据库表已创建完成,创建的数据库在D:\DB\embed文件夹中的BankDB。两个表中的记录数为0:

Microsoft Windows® 系统中嵌入式Derby数据库创建完毕。
linux系统中创建嵌入式Derby数据库
linux系统使用Derby 数据库摆设包中的交互工具 ij 摆设数据库服务器
如果是linux系统就必须精确设置 DERBY_INSTALL 和 CLASSPATH 情况变量。可用 vi 编辑器,将相关的 Java Archive (JAR) 文件的安装路径添加到 shell 初始化文件(好比 .bashrc 文件)中的 CLASSPATH 中,如下所示:
  1. export DERBY_INSTALL='/opt/Apache/db-derby-10.1.2.1-bin'
  2. export CLASSPATH=$DERBY_INSTALL/lib/derby.jar
  3. export CLASSPATH=$CLASSPATH:$DERBY_INSTALL/lib/derbytools.jar:.
复制代码
保存后,退出系统。然后重新登录系统,设置就可生效。
再次登录linux系统,运行建表脚本bankDB_CrtDB.sql就可创建数据库。
  1. dB$ echo $CLASSPATH
  2.         /opt/Apache/db-derby-10.1.2.1-bin/lib/derby.jar:
  3.     /opt/Apache/db-derby-10.1.2.1-bin/lib/derbytools.jar:.
  4. dB$ mkdir derbyWork
  5. dB$ cd derbyWork
  6. dB$ java org.apache.derby.tools.ij
  7.         ij version 10.1
  8. ij> run bankDB_CrtDB.sql
  9. ij> exit ;
  10. rb$ ls -l
复制代码
说明:
linux系统中由于手边没有情况,没有实测。
Microsoft Windows® 系统中创建服务器模式Derby数据库
服务器模式Derby数据库,必须摆设derby的JAR包。我把derby的JAR包摆设在D:\derbydb 目次。其他情况变量设置参照嵌入模式。情况变量生效后,我们可以开始工作了。
第一步,先开启数据库网络服务:

数据库网络服务启动后,数据库服务端口是1527
第二步,用 ij 创建数据库
说明:
创建服务器模式derby数据库的“创建数据库的连接字符串”与嵌入式的不同,因此,必要更新脚本bankDB_CrtDB.sql。把第一行更新为:
connect ‘jdbc:derby://localhost:1527/D:/DB/BankDB;create=true’ ;
预备好脚本bankDB_CrtDB.sql后,可另起一个CMD窗口,运行 ij 工具运行脚本bankDB_CrtDB.sql来创建数据库。
我的脚本bankDB_CrtDB.sql在D:\Temp文件夹中,因此用ij执行时命令为:
run ‘D:\Temp\bankDB_CrtDB.sql’;
如下图,表示数据库和两个数据库表已创建完成,创建的数据库在D:\DB文件夹中的BankDB。两个表中的记录数为0:

下面我们演示为数据库表插入数据记录
用 Apache Derby 的数据库工具 ij 为数据库表插入数据记录

  1. --脚本 InsertDatasForEmb.sql
  2. connect 'jdbc:derby:D:/DB/embed/BankDB' ;  --连接数据库
  3. INSERT INTO bank.actsBalance(cardNumber, actBalance, tradeDate)  
  4. VALUES ('6223161000568866778',156.00,'2020-01-12 08:56:30'),
  5.   ('6223161056881238',5680.00,'2020-01-13 08:16:26'),
  6.   ('6223160000568866',0.00,'2020-01-14 12:20:16');
复制代码
脚本 InsertDatasForEmb.sql 在D:\Temp文件夹中,因此用ij执行时命令为:
run ‘D:\Temp\InsertDatasForEmb.sql’;

在actsBalance表中插入了 3 行数据。

脚本内容更新后,另存为 InsertDatas.sql ,其文件内容如下:
  1. --脚本InsertDatas.sql
  2. connect 'jdbc:derby://localhost:1527/D:/DB/BankDB' ; --连接数据库
  3. INSERT INTO bank.actsBalance(cardNumber, actBalance, tradeDate)  
  4. VALUES ('6223161000568866778',156.00,'2020-01-12 08:56:30'),
  5.   ('6223161056881238',5680.00,'2020-01-13 08:16:26'),
  6.   ('6223160000568866',0.00,'2020-01-14 12:20:16');
复制代码
脚本 InsertDatas.sql 保存在D:\Temp文件夹中,因此用ij执行时命令为:
run ‘D:\Temp\InsertDatas.sql’;

在actsBalance表中插入了 3 行雷同数据记录。
查询数据库中的数据记录
在Eclipse开发平台查询数据库表记录
预备工作
必要在Eclipse平台设置构建路径如下图所示(你的也类似)。图中第一行derby.jar包含嵌入式驱动步调;图中第二行derbyclient.jar是服务器模式所需求的客户端驱动步调。


  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. public class QueryBalance {
  7.         static final String driver = "org.apache.derby.jdbc.ClientDriver";
  8.         static final String dbName = "//localhost:1527/D:/DB/BankDB";
  9.         static final String dbProtocol="jdbc:derby:"; //数据库协议
  10.         /***查询账户余额表***/
  11.         private static final String QueryBalanceSQL =
  12.                 "SELECT *  FROM bank.actsBalance " +
  13.                 "WHERE 1=1";  
  14.        
  15.         public static void main(String[] args) {
  16.                 String url = dbProtocol + dbName;
  17.                 boolean rnflg = false ;
  18.                 try{
  19.                         Class.forName(driver) ;  //加载驱动程序
  20.                         Connection con = DriverManager.getConnection( url ); //连接数据库
  21.                        
  22.                         try (Statement stmt = con.createStatement() ) { //自动关闭资源try语句
  23.                                 stmt.execute(QueryBalanceSQL) ;
  24.                                 ResultSet rs = stmt.getResultSet();
  25.                                 while(rs.next()) {
  26.                                         System.out.print("cardNumber: " + rs.getString("cardNumber")) ;
  27.                                      System.out.print("\tactBalance:  " + rs.getBigDecimal("actBalance")) ;
  28.                                      System.out.println("\ttradeDate:  " + rs.getTimestamp("tradeDate") );
  29.                                 }
  30.                         }catch (SQLException se) { se.printStackTrace() ;  }
  31.                 } catch (SQLException se) {
  32.                                 se.printStackTrace() ;
  33.                 }catch(ClassNotFoundException e){
  34.                         System.err.println("JDBC Driver " + driver + " not found in CLASSPATH") ;
  35.                 }
  36.                
  37.         }
  38. }
复制代码
查询结果:


注意事项:
嵌入式数据库查询时,如果你是通过 ij 工具创建数据库的,务须要退出CMD窗口中的 ij 工具。或者直接退出CMD窗口。由于嵌入式访问数据库只能是单用户单JVM的。若不退出 ij ,查询时由于数据库被锁住,将产生例外。
以下是嵌入式的查询步调例程源码:
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. public class QueryBalance {
  7.         //static final String driver = "org.apache.derby.jdbc.ClientDriver";
  8.         static final String driver = "org.apache.derby.jdbc.EmbeddedDriver" ;
  9.         //static final String dbName = "//localhost:1527/D:/DB/BankDB";
  10.         static final String dbName = "D:/DB/embed/BankDB";
  11.         static final String dbProtocol="jdbc:derby:"; //数据库协议
  12.         /***查询账户余额表***/
  13.         private static final String QueryBalanceSQL =
  14.                 "SELECT *  FROM bank.actsBalance " +
  15.                 "WHERE 1=1";  
  16.        
  17.         public static void main(String[] args) {
  18.                 String url = dbProtocol + dbName;
  19.                 boolean rnflg = false ;
  20.                 try{
  21.                         Class.forName(driver) ;  //加载驱动程序
  22.                         Connection con = DriverManager.getConnection( url ); //连接数据库
  23.                        
  24.                         try (Statement stmt = con.createStatement() ) { //自动关闭资源try语句
  25.                                 stmt.execute(QueryBalanceSQL) ;
  26.                                 ResultSet rs = stmt.getResultSet();
  27.                                 while(rs.next()) {
  28.                                         System.out.print("cardNumber: " + rs.getString("cardNumber")) ;
  29.                                      System.out.print("\tactBalance:  " + rs.getBigDecimal("actBalance")) ;
  30.                                      System.out.println("\ttradeDate:  " + rs.getTimestamp("tradeDate") );
  31.                                 }
  32.                         }catch (SQLException se) { se.printStackTrace() ;  }
  33.                 } catch (SQLException se) {
  34.                                 se.printStackTrace() ;
  35.                 }catch(ClassNotFoundException e){
  36.                         System.err.println("JDBC Driver " + driver + " not found in CLASSPATH") ;
  37.                 }
  38.                
  39.         }
  40. }
复制代码
嵌入式查询的结果与服务器模式的结果雷同。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4