文章目录
安装
无需安装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下
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
错误 XJ041:DERBY 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