enilu 发表于 2013-1-14 23:06:43

derby入门笔记

1,熟悉derby,版本是db-derby-10.3.2.1-bin:
derby是一个用java语言写的开源的数据库,他可以作为一个嵌入式数据库嵌入在应用程序中,
安装:将下载包加压后,配置一下classpath,主要将解压目录下的lib目录配置在主机的classpath中,
然后运行bin目录下的ij.bat即可,
在弹出的dos窗口中可以创建一个数据库并进入到其中:connect 'jdbc:derby:testdb;create=true';
这样就创建一个名为testdb的数据库,进入后通过show tables命令可以看到有19个默认的系统模式的表,
然后可以创建一个表,比如:
create table person(
id   int(8) not null,
name char(26) not null,
primary key(id)
);
insert into person values('1','张三');
要想退出这个数据库可以输入“exit;”然后回车。
第二次进入testdb的时候有两种方式:
1,connect 'jdbc:derby:testdb';
2, connect 'jdbc:derby:testdb;create=false';
表示进入的是一个已经存在的数据库,而不是新建立的数据库。
在主目录的bin目录下可以看到所有已经建立好的数据库的文件夹。
二,使用java代码访问derby数据库:
我建立的是一个web应用:把derby.jar放在lib里面
我的java代码是这么写的:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class HelloWorld {
     public static void main(String[] args) {
         try {          
             Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();//加载驱动
             Connection conn = DriverManager.getConnection("jdbc:derby://localhost:1527:testdb;create=false");//连接数据库
             Statement st = conn.createStatement();
            st.execute("create table USER_INFO (ID INT NOT NULL,NAME VARCHAR(10) NOT NULL)");//建表
             st.executeUpdate("insert into USER_INFO(ID,NAME) values (1,'hermit')");//插入数据
             st.executeUpdate("insert into USER_INFO(ID,NAME) values (2,'test')");//插入数据
            ResultSet rs = st.executeQuery("select * from USER_INFO");//读取刚插入的数据
             while(rs.next()){
                 int id = rs.getInt(1);
                 String name = rs.getString(2);
                 System.out.println("ID="+id);
                 System.out.println("NAME="+name);
             }
         } catch(Exception e){
             e.printStackTrace();
         }
     }
}
报的错误是:
java.sql.SQLException: 数据库“testdb”未找到。
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection30.<init>(Unknown Source)
at org.apache.derby.jdbc.Driver30.getNewEmbedConnection(Unknown Source)
at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
at org.apache.derby.jdbc.AutoloadedDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at HelloWorld.main(HelloWorld.java:11)

derby 在外面可以正常访问,但是用java代码访问的时候报“找不到数据库”错误,前提是这个数据库明明存在着的,
为什么?
找了半天,才知道,derby是用java语言写的,他有自己的一个jvm,而我的java代码是在另一jvm中,两个jvm中想要通信,必须开启derby的网络服务。双击derby安装目录中bin下的startNetworkServer.bat,打开一个dos窗口,不要关闭,然后在运行java代码发现又出现错误:
java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at HelloWorld.main(HelloWorld.java:18)
没有合适的驱动?晕。。。。why?
问了大哥才知道,原来org.apache.derby.jdbc.EmbeddedDriver这个驱动是嵌入式驱动,要换驱动,于是换了一个org.apache.derby.jdbc.ClientDriver
OK大功告成:
最终代码为:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class HelloWorld {
     public static void main(String[] args) {
         try {          
          
        /**
           * 这个是嵌入式驱动
           * org.apache.derby.jdbc.EmbeddedDriver
           * 下面这个在derby开启网络服务模式下连接derby数据库时候用的
           * org.apache.derby.jdbc.ClientDriver
           */
             Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();//加载驱动
             Connection conn = DriverManager.getConnection("jdbc:derby://localhost:1527/testdb;create=false");//连接数据库
             Statement st = conn.createStatement();
          /* st.execute("create table USER_INFO (ID INT NOT NULL,NAME VARCHAR(10) NOT NULL)");//建表
             st.executeUpdate("insert into USER_INFO(ID,NAME) values (1,'hermit')");//插入数据
             st.executeUpdate("insert into USER_INFO(ID,NAME) values (2,'test')");//插入数据
*/            ResultSet rs = st.executeQuery("select * from USER_INFO");//读取刚插入的数据
             while(rs.next()){
                 int id = rs.getInt(1);
                 String name = rs.getString(2);
                 System.out.println("ID="+id);
                 System.out.println("NAME="+name);
             }
         } catch(Exception e){
             e.printStackTrace();
         }
     }

我刚开始学,有些地方可能理解不对,高手请指教啊啊
发现网上关于apache derby的讨论组很少,偶建了球球群,一起学习的请进,群号码:42103876 验证信息请输入“学习apache derby”
 
页: [1]
查看完整版本: derby入门笔记