鲁春利的工作笔记,谁说程序员不能有文艺范?



很多年没有使用过Derby了,由于工作原因需要再次使用,之前使用时从未记录,忽然不知道该如何使用了,这次再使用得抓紧记录一下了。。。


Apache Derby是完全使用Java实现的开放源码数据库,下载地址:http://db.apache.org/derby/

Apache Derby有四种不同的发布版本供下载:

bin distribution - contains the documentation, javadoc, and jar files for Derby.
lib distribution - contains only the jar files for Derby.
lib-debug distribution - contains jar files for Derby with source line numbers.
src distribution - contains the Derby source tree at the point which the binaries were built.

wKiom1ZUCdyy9_xWAAAq42yf7jA181.png


解压后的目录结构如下

wKiom1ZUC47Bd8FrAACqp02UWR8799.png


Apache Derby提供了两种基本的安装部署形式:Embedded形式和Derby Network Server形式。

Embedded形式

    又称内嵌模式,Derby数据库与应用程序共享同一个JVM,通常由应用程序负责启动和停止,对除启动它的应用程序外的其它应用程序不可见。

Derby Network Server形式

    又称网络模式,Derby数据库独占一个JVM,做为服务器上的一个独立进程运行。在这种模式下,允许有多个应用程序来访问同一个Derby数据库。


配置环境变量

    配置环境变量的目的是为了简化操作,否则每次执行脚本都需要切换或指定derby的全路径。

建立DERBY_HOME,值:E:\mvtech\db-derby-10.11.1.1
在Path加入:%DERBY_HOME%\bin

    说明:环境变量配置并不是必须的。


验证配置

# 配置后就可以在任意位置执行derby安装目录bin下面的脚本了
C:\Users>sysinfo.bat
------------------ Java 信息 ------------------
Java 版本:        1.7.0_79
Java 供应商:      Oracle Corporation
Java 主目录:      C:\Java\jdk1.7.0_79\jre
Java 类路径:      .;C:\Java\jdk1.7.0_79\lib\dt.jar;C:\Java\jdk1.7.0_79\lib\tools.jar;E:\mvtech\db-derby-10.11.1.1/lib/derby.jar;E:\mvtech\d
b-derby-10.11.1.1/lib/derbynet.jar;E:\mvtech\db-derby-10.11.1.1/lib/derbyclient.jar;E:\mvtech\db-derby-10.11.1.1/lib/derbytools.jar
OS 名:            Windows 7
OS 体系结构:      amd64
OS 版本:          6.1
Java 用户名:      Administrator
Java 用户主目录:C:\Users\Administrator.ZGC-20130427XQA
Java 用户目录:    C:\Users
java.specification.name: Java Platform API Specification
java.specification.version: 1.7
java.runtime.version: 1.7.0_79-b15
--------- Derby 信息 --------
[E:\mvtech\db-derby-10.11.1.1\lib\derby.jar] 10.11.1.1 - (1616546)
[E:\mvtech\db-derby-10.11.1.1\lib\derbytools.jar] 10.11.1.1 - (1616546)
[E:\mvtech\db-derby-10.11.1.1\lib\derbynet.jar] 10.11.1.1 - (1616546)
[E:\mvtech\db-derby-10.11.1.1\lib\derbyclient.jar] 10.11.1.1 - (1616546)
------------------------------------------------------


Apache Derby使用

Embedded形式

# 切换到${DERBY_HOME}\bin目录下执行ij.bat文件

ij 版本 10.11
# 查看帮助
ij> help;

# CRUD操作 
ij> connect 'jdbc:derby:Stu;create=true';
ij> create table student(sno int, sname varchar(20));
已插入/更新/删除 0 行
ij> describe student;
COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
SNO                 |INTEGER  |0   |10  |10    |NULL      |NULL      |YES
SNAME               |VARCHAR  |NULL|NULL|20    |NULL      |40        |YES

已选择 2 行

ij> insert into student(sno, sname) values(100, 'luchunli');
已插入/更新/删除 1 行
ij> insert into student(sno, sname) values(101, 'zhangsan');
已插入/更新/删除 1 行
ij> select * from student;
SNO        |SNAME
--------------------------------
100        |luchunli
101        |zhangsan

已选择 2 行

ij> show tables in APP;
TABLE_SCHEM         |TABLE_NAME                    |REMARKS
----------------------------------------------------------------------
APP                 |STUDENT                       |

已选择 1 行
ij>

    说明:在${DERBY_HOME}\bin目录下执行ij.bat文件,并进行数据库连接,此时会在${DERBY_HOME}\bin目录下创建名为Stu的数据库。

wKioL1ZUFivB835tAABnQn5jOlY050.png

     Stu数据库的文件存储格式如下图:

wKiom1ZUFkPBKomHAAHsCSqCocI568.jpg

   如果Stu数据库已经存储了一部分数据,当在其他目录调用了ij.bat,查询数据时:

C:\Users>ij.bat
ij 版本 10.11
ij> connect 'jdbc:derby:Stu';
错误XJ004:数据库“Stu”未找到。
ij>
# 连之前创建的数据库都不见了,这就是Derby的Embedded模式存在的问题。

    如果此时再启动一个ij.bat程序,尝试连接Stu数据库是无法连接的:

ij 版本 10.11
ij> connect 'jdbc:derby:Stu;create=true';
错误XJ040:无法使用类加载程序 sun.misc.Launcher$AppClassLoader@6150818a 启动数据库 'Stu',
请参阅下一个异常错误,以了解详细信息。
错误XSDB6:Derby 的另一个实例可能已引导数据库 E:\mvtech\db-derby-10.11.1.1\bin\Stu。


Derby Network Server形式

    通过startNetworkServer.bat命令启动Derby Server。

wKiom1ZUGpOA0619AAE2RHPuFtc596.jpg

    通过ij.bat工具进行操作

C:\Users>ij.bat
ij 版本 10.11
ij> connect 'jdbc:derby://localhost:1527/mywork;create=true';
ij> show tables in app;
TABLE_SCHEM         |TABLE_NAME                    |REMARKS
------------------------------------------------------------------------

已选择 0 行
ij> create table student(sno int, sname varchar(20));
已插入/更新/删除 0 行
ij> show tables in app;
TABLE_SCHEM         |TABLE_NAME                    |REMARKS
------------------------------------------------------------------------
APP                 |STUDENT                       |

已选择 1 行
ij> insert into student values(100, 'luchunli');
已插入/更新/删除 1 行
ij> insert into student values (101, 'zhangsan');
已插入/更新/删除 1 行
ij> commit;
ij> select * from student;
SNO        |SNAME
--------------------------------
100        |luchunli
101        |zhangsan

已选择 2 行
ij>

    此时再次调用ij.bat并连接Derby Server同样是可以访问的

E:\mvtech\db-derby-10.11.1.1>ij.bat
ij 版本 10.11
ij> connect 'jdbc:derby://localhost:1527/mywork;create=true';
ij> show tables in app;
TABLE_SCHEM         |TABLE_NAME                    |REMARKS
------------------------------------------------------------------------
APP                 |STUDENT                       |

已选择 1 行
ij> select * from student;
SNO        |SNAME
--------------------------------
100        |luchunli
101        |zhangsan

已选择 2 行
ij>

    生成的数据库文件仍然会默认存放在${DERBY_HOME}\bin目录下:

wKiom1ZUG6GimeDYAAGwxpuHUvQ668.jpg


Derby安装目录的lib下提供了开发和使用derby所有jar文件,主要有:

wKiom1ZfuMSyBJLcAAE4U_dq8G4329.jpg

wKiom1ZfuN7TkXRYAAE-Vh811QY553.jpg

wKioL1ZfuWfBXNtAAAC4EilimQQ369.jpg

wKiom1ZfuRLSRQKMAACpC44YtJ8759.jpg

wKioL1ZfuYuDftKaAAJB0Ra5R_8012.jpg


使用Java访问Derby库

Embedded Mode

package com.lucl.derby;

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

import org.apache.log4j.Logger;

/**
 * @author luchunli
 * @description 以Embedded Mode运行
 */
public class EmbeddedModeMain {

    private static final Logger logger = Logger.getLogger(EmbeddedModeMain.class);
    
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        String driver = "org.apache.derby.jdbc.EmbeddedDriver";
        // 在当前项目目录下创建DemoDB
        // String dbName="DemoDB";
        // 指定目录下创建DemoDB
        String dbName="F:\\ftpfile\\DemoDB";
        String connectionURL = "jdbc:derby:" + dbName + ";create=true";
        
        Class.forName(driver);
        Connection connection = DriverManager.getConnection(connectionURL);
        
        Statement st = connection.createStatement();
        st.execute("CREATE TABLE t_sample (id bigint, name varchar(30), in_blacklist boolean)");
        st.close();
        
        st = connection.createStatement();
        st.execute("INSERT INTO t_sample (id, name, in_blacklist) values (" + System.currentTimeMillis() + ", 'luchunli', false)");
        
        st = connection.createStatement();
        ResultSet rs = st.executeQuery("SELECT id, name, in_blacklist FROM t_sample");
        while (rs.next()) {
            logger.info(rs.getLong("id"));
            logger.info(rs.getString("name"));
            logger.info(rs.getBoolean("in_blacklist"));
        }
        connection.close();
    }

}

NetWork Server Mode

package com.lucl.derby;

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

import org.apache.log4j.Logger;

/**
 * @author luchunli
 * @description 以NetWork Server Mode运行
 */
public class NetWorkServerModeMain {
    
    private static final Logger logger = Logger.getLogger(NetWorkServerModeMain.class);

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        String driver = "org.apache.derby.jdbc.ClientDriver";
        
        String dbName="//localhost:1527/DemoDB";
        String connectionURL = "jdbc:derby:" + dbName + ";create=true";
        
        Class.forName(driver);
        Connection connection = DriverManager.getConnection(connectionURL, "user", "passwd");
        
        Statement st = connection.createStatement();
        st.execute("CREATE TABLE t_sample (id bigint, name varchar(30), in_blacklist boolean)");
        st.close();
        
        st = connection.createStatement();
        st.execute("INSERT INTO t_sample (id, name, in_blacklist) values (" + System.currentTimeMillis() + ", 'luchunli', false)");
        
        st = connection.createStatement();
        ResultSet rs = st.executeQuery("SELECT id, name, in_blacklist FROM t_sample");
        while (rs.next()) {
            logger.info(rs.getLong("id"));
            logger.info(rs.getString("name"));
            logger.info(rs.getBoolean("in_blacklist"));
        }
        
        connection.close();
    }

}