jdk自带的数据库derby的基本使用以及注意事项(mac为例),附java demo

版权声明:本文为作者原创,转载请注明出处,联系qq:32248827 https://blog.csdn.net/dataiyangu/article/details/86751045

安装

无需安装jdk自带 (1.8好像没有)
jdk已经帮我们安装在了 ** 本机jdk的安装目录/db **下

环境变量

vi /etc/profile
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home
export DERBY_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home/db
PATH=$JAVA_HOME/bin:$DERBY_HOME:$PATH:.
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$DERBY_HOME/lib/derby.jar:$DERBY_HOME/lib/derbyclient.jar:$DERBY_HOME/lib/derbytools.jar:.
export JAVA_HOME
export PATH
export CLASSPATH
source /etc/profile

验证是否安装成功

java org.apache.derby.tools.sysinfo

输出如下说明成功

java.specification.version: 1.7
java.runtime.version: 1.7.0_60-b19
--------- Derby 信息 --------
JRE - JDBC: Java SE 7 - JDBC 4.0
[/Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home/db/lib/derby.jar] 10.8.3.2 - (1557835)
[/Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home/db/lib/derbytools.jar] 10.8.3.2 - (1557835)
[/Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home/db/lib/derbyclient.jar] 10.8.3.2 - (1557835)
------------------------------------------------------
----------------- 语言环境信息 -----------------
当前语言环境:  [中文/中国 [zh_CN]]
找到支持的语言环境:[cs]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[de_DE]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[es]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[fr]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[hu]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[it]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[ja_JP]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[ko_KR]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[pl]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[pt_BR]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[ru]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[zh_CN]
	 版本:10.8.3.2 - (1557835)
找到支持的语言环境:[zh_TW]
	 版本:10.8.3.2 - (1557835)
-------------

启动

本地启动

任意目录:

java -jar $DERBY_HOME/lib/derbyrun.jar server start
~ java -jar $DERBY_HOME/lib/derbyrun.jar server start
Sat Feb 02 16:56:12 CST 2019 : 已使用基本服务器安全策略安装了安全管理程序。
Sat Feb 02 16:56:13 CST 2019 : Apache Derby 网络服务器 - 10.8.3.2 - (1557835) 已启动并准备接受端口 1527 上的连接

如上即成功

允许远程连接的启动方式:

摘录:

derby 的用户名和密码是公开的, 允许远程连接是不安全的因素。
你用startnetworkserver 命令的时候,开启的网络服务,虽然允许多客户端多进程,但仅限本机使用
如希望使用 ip地址 远程连接,必须强制指定提供服务的IP 地址和 端口,否则仅限localhost。所以,应该做如下修改:
1. 进入derby数据库安装包下: derby/目录下的derby.drda.host=127.0.0.1改成derby.drda.host=0.0.0.0

2.进入命令行,cd到derby安装包的bin目录,执行:
NetworkServerControl start -h 10.31.23.45 -p 1527
(形式 networkservercontrol start -h %ip地址% -p %port%)

摘自:https://blog.csdn.net/qq_25337221/article/details/83240572

因为我直接用的jdk本身的derby,并没有找到方法一中的文件,所以我的真实操作如下:
在db/bin下

扫描二维码关注公众号,回复: 5295770 查看本文章
startNetworkServer(网络模式开启)(我没用这个)     在任意路径下,之后创建的数据库会在这个任意的路径下出现。

用这个就对了
如果之前用本地的方式开启的服务,先关了然后:

NetworkServerControl start -h 192.168.1.130(本机的真实ip,不是localhost也不是127.0.0.1-p 1527 (能够指定ip,修改localhost)  

在启动过程中可能遇到的错误(远程连接的时候会出现):

1

错误 08001:java.net.ConnectException:连接到端口 1527 上的服务器 10.0.4.120 时出错,消息为 Connection refused。

解决:查看对应的db服务是否开启

2

错误 XJ041DERBY SQL error: SQLCODE: -40001, SQLSTATE: XJ041, SQLERRMC: 无法创建数据库“db”,请参阅下一个异常错误,以了解详细信息。::SQLSTATE: XBM0H

这是本人遇到的错误,是因为mac中jdk的安装路径是在/下的可能没有创建的权限 通过sudo chmod -R 777 xxx 改变derby所在相关地址权限即可(比如我改的就是jdk1.7下的db目录的权限)。

连接测试,创建数据库

方法一(推荐)

任意目录

java org.apache.derby.tools.ij
➜  db java org.apache.derby.tools.ij
ij 版本 10.8

说明成功

connect 'jdbc:derby://localhost:1527/new;create=true;user=root;password=root';

注意: (此操作一定要以分号结尾)
jdbc:derby://localhost:1527/new这里的new是数据库,
create=true;没有就创建的意思
user=root;password=root用户名密码

完整操作

➜  db java org.apache.derby.tools.ij
ij 版本 10.8
ij> connect 'jdbc:derby://localhost:1527/new;create=true;user=root;password=root';
ij>

最下面出现ij>说明连接并创建数据库成功

方法二

在lib目录下建立ij.properties 文件

ij.driver=org.apache.derby.jdbc.ClientDriver

ij.protocol=jdbc:derby://localhost:1527/

#当COREJAVA数据库不存在,创建一个

ij.database=COREJAVA;create=true

在另一个命令shell中,通过执行下面的命令来运行Derby 的交互式脚本执行工具(称为ij): java -jar derby/lib/derbyrun.jar ij -p ij.properties

java demo

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cloudwise</groupId>
    <artifactId>derby</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>Maven Quick Start Archetype</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.derby/derbyclient -->
        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derbyclient</artifactId>
            <version>10.7.1.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.derby/derby -->
        <!-- <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derby</artifactId>
            <version>10.8.3.0</version>
            <scope>test</scope>
        </dependency> -->

    </dependencies>
    <properties>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <manifestEntries>
                                        <Main-Class>com.cloudwise.leesin_derby.Start</Main-Class>
                                        <Build-Number>123</Build-Number>
                                    </manifestEntries>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>


            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <classesDirectory>${project.build.directory}/classes</classesDirectory>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.cloudwise.leesin_derby.Start</mainClass>
                            <useUniqueVersions>false</useUniqueVersions>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>${basedir}/libs/derbyclient.jar</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Start.class

import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashSet;
import java.util.Properties;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Hello world!
 *
 */
public class Start extends HttpServlet{
	public  void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
        try{
            runTest();
            response.getWriter().print("success!success!success!success!success!success!success!success!");
        }catch(SQLException ex){
            for(Throwable t:ex)
                t.printStackTrace();
        }

    }
    /**
    *Runs a test by creating a table,adding a value,showing the table contents,and removing the table.
    */
    public static void runTest() throws SQLException,IOException{
        try(Connection conn = getConnection())
        {
            Statement stat = conn.createStatement();
            DatabaseMetaData meta = conn.getMetaData();
			ResultSet res = meta.getTables(null, null, null, new String[]{"TABLE"});
			HashSet<String> set=new HashSet<String>();
			while (res.next()) {
				set.add(res.getString("TABLE_NAME"));
			}
			if(set.contains("Greetings1".toUpperCase())){
				stat.executeUpdate("drop TABLE Greetings1");
			}
			if(set.contains("Greetings2".toUpperCase())){
				stat.executeUpdate("drop TABLE Greetings2");
			}
			if(set.contains("Greetings3".toUpperCase())){
				stat.executeUpdate("drop TABLE Greetings3");
			}
            
            //*******************************derby中的droop table if exists xxx 是不允许的***********************
            stat.executeUpdate("CREATE TABLE Greetings1 (Message CHAR(40))");
            stat.executeUpdate("CREATE TABLE Greetings2 (Message CHAR(40))");
            stat.executeUpdate("CREATE TABLE Greetings3 (Message CHAR(40))");
            stat.executeUpdate("INSERT INTO Greetings1 VALUES('这个语句是属于statmeny的')");
            PreparedStatement prepareStatement = conn.prepareStatement("INSERT INTO Greetings2 VALUES('这个语句是属于preparestatment的')");
            prepareStatement.execute();
            CallableStatement calls = conn.prepareCall("INSERT INTO Greetings3 VALUES('这个语句是属于callablestatement的')");
            calls.execute();
            try(ResultSet result = stat.executeQuery("SELECT * FROM Greetings1")){
                //将光标移动到下一行,初始在第一行之前
                while(result.next()) 
                    System.out.println(result.getString("Message"));
            }
            //*******************************预编译语句上不允许使用方法“executeQuery(String)”。*********************************
//            try(ResultSet result = prepareStatement.executeQuery("SELECT * FROM Greetings2")){
//                //将光标移动到下一行,初始在第一行之前
//                while(result.next()) 
//                    System.out.println(result.getString("Message"));
//            }
//            try(ResultSet result = calls.executeQuery("SELECT * FROM Greetings3")){
//                //将光标移动到下一行,初始在第一行之前
//                while(result.next()) 
//                    System.out.println(result.getString("Message"));
//            }
            try(ResultSet result = stat.executeQuery("SELECT * FROM Greetings2")){
                //将光标移动到下一行,初始在第一行之前
                while(result.next()) 
                    System.out.println(result.getString("Message"));
            }try(ResultSet result = stat.executeQuery("SELECT * FROM Greetings3")){
                //将光标移动到下一行,初始在第一行之前
                while(result.next()) 
                    System.out.println(result.getString("Message"));
            }
            stat.executeUpdate("DROP TABLE Greetings1");
            stat.executeUpdate("DROP TABLE Greetings2");
            stat.executeUpdate("DROP TABLE Greetings3");

        }
    }
    /**
    *Gets a connection from the properties specified in the file database.properties.
    *@return the database connection
    */
    public static Connection getConnection() throws SQLException,IOException{
        Properties props = new Properties();
//        try(InputStream in = Files.newInputStream(Paths.get("db.txt"))){
//            props.load(in);
//        }
        try(InputStream r = Start.class.getClassLoader().getResourceAsStream("db.txt")){
            props.load(r);
        }
        String drivers = props.getProperty("jdbc.drivers");
        
        //为了适应那些不能自动注册的数据库驱动程序
        if(drivers != null)
            //这种方式可以提供多个驱动器,使用冒号分割
            System.setProperty("jdbc.drivers",drivers);
        try{
//            Class.forName("org.apache.derby.jdbc.ClientDriver");
        	Class.forName(drivers);
        }catch(Exception ex){
            ex.printStackTrace();
        }

        String url = props.getProperty("jdbc.url");
        System.out.println(url);
        String username = props.getProperty("jdbc.username");
        //System.out.println(username);
        String password = props.getProperty("jdbc.password");
        //System.out.println(password);
       // return DriverManager.getConnection("jdbc:derby://127.0.0.1:1527/newdb","root","root");
        return DriverManager.getConnection(url,username,password);
    }



}

web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>start</servlet-name>
        <servlet-class>Start</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>start</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

db.ext


jdbc.drivers=org.apache.derby.jdbc.ClientDriver
#因为derby驱动程序将自动注册驱动类
jdbc.url=jdbc:derby://localhost:1527/new
jdbc.username=root
#可以不使用用户名和密码,默认是APP用户,因为如果使用了如此的设置在第二次创建时(第一次中途失败)会出现 #org.apache.derby.client.am.SqlException: Schema“DBUSER4”中已经存在Table/View“GREETINGS”的异常,便于方便,所以在此注释掉了。
jdbc.password=root

运行结果

[2019-02-02 05:07:02,244] Artifact derby_demo:war: Artifact is deployed successfully
[2019-02-02 05:07:02,244] Artifact derby_demo:war: Deploy took 557 milliseconds
jdbc:derby://localhost:1527/new
这个语句是属于statmeny的                        
这个语句是属于preparestatment的                 
这个语句是属于callablestatement的   

参考文章:https://blog.csdn.net/weixin_42812613/article/details/82937773

猜你喜欢

转载自blog.csdn.net/dataiyangu/article/details/86751045