<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to you under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<html>
<title>Welcome to Apache Derby</title>
<body>
<center><a href="http://db.apache.org/derby/">
        <img src="docs/html/images/logowithtext.jpg" border="0"/></a><br/>
<h2>Contents</h2>
<a href="#new">New to Derby?</a><br/>
<a href="#using">Using Derby</a><br/>
<a href="#thisDistribution">This Distribution</a><br/>
<a href="#resources">More Resources</a><br/>
</center>
<br/>
<a name="new"/><h3>New to Derby?</h3>
<p>If this is your first time using Derby, please look at the <a href="docs/html/getstart/index.html">Getting Started Guide</a> <a href="docs/html/getstart/getstart-single.html">[HTML Book]</a> <a href="docs/pdf/getstart/getstartderby.pdf">[PDF]</a> for assistance configuring your environment, creating a new database, and executing SQL statements.</p>
<p>Interested in seeing some code that makes use of Derby? There are also some <a href="demo/programs/readme.html">simple demo applications</a> included to help you understand how to start using Derby in your application.</p>
<p>Derby includes some tools to help you get started working with Derby databases. Additional information about these tools can be found in the <a href="docs/html/tools/index.html">Derby Tools and Utilities Guide</a> <a href="docs/html/tools/tools-single.html">[HTML Book]</a> <a href="docs/pdf/tools/derbytools.pdf">[PDF]</a>.</p>
<p>If you need more help getting started, the Apache Derby website has a <a href="http://db.apache.org/derby/quick_start.html">Quick Start page</a> with links to tutorials, more demo applications, and instructions on how to use Derby with a variety of different IDEs, tools, and web application servers.</p>
<p>If you need additional help, the Apache Derby Users mailing list can be helpful if you have specific questions regarding setting up and using Derby. For information on how to subscribe and post to the Apache Derby Users mailing list, please read the <a href="http://db.apache.org/derby/derby_mail.html">mailing lists page</a> on the Apache Derby website.</p>
<br/>
<a name="using"/><h3>Using Derby</h3>
<p>
For information on developing and deploying an application with Derby, see the <a href="docs/html/devguide/index.html"/>Derby Developer's Guide</a> <a href="docs/html/devguide/devguide-single.html">[HTML Book]</a> <a href="docs/pdf/devguide/derbydev.pdf"/>[PDF]</a>. A complete reference to Derby's use of JDBC and SQL can be found in the <a href="docs/html/ref/index.html">Derby Reference Manual</a> <a href="docs/html/ref/ref-single.html">[HTML Book]</a> <a href="docs/pdf/ref/refderby.pdf">[PDF]</a>.<br/>
</p>
<p>
Derby's JDBC API is documented in two sets of javadoc:
</p>
<ul>
<li><a href="javadoc/jdbc3/index.html">JDBC 3.0 Public API</a> - Consult
this javadoc if your application runs on
J2SE 1.4, or J2SE 5.0. Also consult this javadoc if your
application runs with the Java ME CDC/Foundation 1.1 Profile (JSR-169).</li>
<li><a href="javadoc/jdbc4/index.html">JDBC 4.0 Public API</a> - Consult this
javadoc if your application runs on Java SE 6.</li>
</ul>
<p>
For information on setting up and using the Derby Network Server, which provides a client/server access model for Derby databases on machines connected over a network, please read the <a href="docs/html/adminguide/index.html">Derby Server and Administration Guide</a> <a href="docs/html/adminguide/adminguide-single.html">[HTML Book]</a> <a href="docs/pdf/adminguide/derbyadmin.pdf">[PDF]</a>.
</p>
<p>
Information on how to tune Derby for your specific needs can be found in <a href="docs/html/tuning/index.html">Tuning Derby</a> <a href="docs/html/tuning/tuning-single.html">[HTML Book]</a> <a href="docs/pdf/tuning/tuningderby.pdf">[PDF]</a>. This guide includes a reference to the properties which influence Derby's behavior as well as providing performance tips for certain situations.
</p>
<br/>
<a name="thisDistribution"/><h3>This Distribution</h3>
<p>
Please consult the following documents for details on the contents of
this distribution and how this distribution is licensed.
</p>
<ul>
  <li><a href="RELEASE-NOTES.html">Release Notes</a></li>
  <li><a href="LICENSE">The Apache License</a></li>
  <li><a href="NOTICE">Relevant Copyrights</a></li>
</ul>
<br/>
<a name="resources"/><h3>More Resources</h3>
<p>
If you are looking for more resources on how to use Derby in your application or integrate Derby into a specific environment, please see:
</p>
<ul>
  <li><a href="http://db.apache.org/derby/">The Apache Derby website</a></li>
  <li><a href="http://wiki.apache.org/db-derby/">The Apache Derby wiki</a></li>
  <li><a href="http://db.apache.org/derby/integrate/index.html">The Apache Derby resources page</a></li>
</ul>
<p>
Thank you for your interest in Derby!
</p>
</body>
</html>
