JavaDB的一些问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaDB的一些问题相关的知识,希望对你有一定的参考价值。

1、JavaDB有操作界面吗?
2、JavaDB和mysql的区别
3、JavaDB如何使用?

额,急急急..回答满意加分..

javaDB其实就是Derby,它并不是一个新的数据库产品,它是由IBM捐献给Apache的DB项目的一个纯Java数据库,JDK6.0里面带的这个Derby的版本是 10.2.1.7,支持存储过程和触发器;有两种运行模式,一种是作为嵌入式数据库,另一种是作为网络数据库,前者的数据库服务器和客户端都在同一个 JVM里面运行,后者允许数据库服务器端和客户端不在同一个JVM里面,而且允许这两者在不同的物理机器上.值得注意的是JDK6里面的这个Derby支持JDK6的新特性JDBC 4.0规范(JSR 221),现在我们如果要练习JDBC的用法,没有必要单独装一个数据库产品了,直接用Derby就行.

1、本身没有操作界面,可以用第三方工具来管理(也就是你说的操作界面),Aqua Data Studio 具备管理功能的用于 Apache Derby 关系数据库的管理工具和数据库查询工具。直观管理功能让用户能够浏览和修改数据库结构,包括架构对象和数据库存储,以及维护数据库安全。集成查询工具让您能够迅速创建、编辑和执行 SQL 查询与脚本。Aqua Data Studio 进一步提供导入与导出工具,从而轻松地将数据移入和移出不同的数据格式及 Apache Derby 数据库。集成在这些工具内的是库浏览器 (Repository Browser),拥有 CVS 和 Subversion (SVN) 的完整来源控制客户端。

2、两者的区别,简单的说,就是javaDB是一个简化轻量级数据库,适合小型系统的小规模测试用,完全可以跑在内存里的数据库,它只有3M大小,而MySQL则是可以应用部署大型系统的数据库,功能更多更全,也更稳定,是用范围更广。

3、下面是个使用derby的简单例子:
首先导入JAR包:derby.jar,如果你装的是JDK6,在C:\Program Files\Sun\JavaDB\lib目录下就可以找到.
然后就要创建数据库了:

代码
private Connection getConnection() throws SQLException
Connection connection = DriverManager
.getConnection("jdbc:derby:userDB;create=true;user=test;password=test");
connection.setAutoCommit(false);
return connection;


其中userDB是要连接数据库的名字,create=true表示如果该数据库不存在,则创建该数据库,如果数据库存在,则用用户user=test;密码password=test连接数据库.

有了数据库,接下来该建表了:

代码
private void createTable(Connection connection) throws SQLException
Statement statement = connection.createStatement();

String sql = "create table USERS("
+ " ID BIGINT not null generated by default as identity,"
+ " USER_NAME VARCHAR(20) not null,"
+ " PASSWORD VARCHAR(20),"
+ " constraint P_KEY_1 primary key (ID))";
statement.execute(sql);

sql = "create unique index USER_NAME_INDEX on USERS ("
+ " USER_NAME ASC)";
statement.execute(sql);

statement.close();


创建了 USERS表,包括ID,USER_NAME,PASSWORD三个列,其中ID是主键,其中generated by default as identity 的作用类似sequence,identity是定义自动加一的列,
GENERATED BY ALWAYS AS IDENTITY
GENERATED BY DEFAULT AS IDENTITY
By always和by default是说明生成这个IDENTITY的方式。
By always是完全由系统自动生成。
by default是可以由用户来指定一个值。
编写与USERS表对应的javabean(这个就不多说了),:

代码
public class User implements Serializable

/**
*
*/
private static final long serialVersionUID = 1L;

private Long id;

private String userName;

private String password;

public Long getId()
return id;


public void setId(Long id)
this.id = id;


public String getUserName()
return userName;


public void setUserName(String userName)
this.userName = userName;


public String getPassword()
return password;


public void setPassword(String password)
this.password = password;



接下来就可以就数据库进行增删改查的操作了:

插入数据:

代码
private void create(User user)
Connection connection = null;

try
connection = this.getConnection();
PreparedStatement statement = connection
.prepareStatement("insert into users (user_name,password) values(?,?)");

int index = 1;
statement.setString(index++, user.getUserName());
statement.setString(index++, user.getPassword());

statement.execute();

user.setId(this.getId(connection));

connection.commit();
catch (SQLException e)
rollback(connection);
throw new RuntimeException(e);
finally
if (connection != null)
close(connection);




代码
private Long getId(Connection connection) throws SQLException
CallableStatement callableStatement = connection
.prepareCall("values identity_val_local()");

ResultSet resultSet = callableStatement.executeQuery();
resultSet.next();
Long id = resultSet.getLong(1);
resultSet.close();
callableStatement.close();
return id;


getId方法是获得系统默认的id值,是通过 identity_val_local()获得的,而函数IDENTITY_VAL_LOCAL()则可以在INSERT语句执行之后,为我们返回刚才系统为id所产生的值.感觉还是有点想sequence的curr_val.

修改数据:

代码

private void update(User user)
Connection connection = null;

try
connection = this.getConnection();
PreparedStatement statement = connection
.prepareStatement("update users set user_name=?,password=? where id=?");

int index = 1;
statement.setString(index++, user.getUserName());
statement.setString(index++, user.getPassword());
statement.setLong(index++, user.getId());

statement.execute();

connection.commit();
catch (SQLException e)
rollback(connection);
throw new RuntimeException(e);
finally
if (connection != null)
close(connection);




删除数据:

代码

public void delete(Long id)
Connection connection = null;

try
connection = this.getConnection();
PreparedStatement statement = connection
.prepareStatement("delete from users where id=?");
statement.setLong(1, id);
statement.execute();
connection.commit();
catch (SQLException e)
rollback(connection);
throw new RuntimeException(e);
finally
if (connection != null)
close(connection);




查询数据:

代码
public User findById(Long id)
Connection connection = null;

try
connection = this.getConnection();

PreparedStatement statement = connection
.prepareStatement("select user_name,password from users where id=?");
statement.setLong(1, id);
ResultSet resultSet = statement.executeQuery();

User user = null;

if (resultSet.next())
user = new User();
user.setId(id);
user.setUserName(resultSet.getString("user_name"));
user.setPassword(resultSet.getString("password"));


resultSet.close();
statement.close();
connection.commit();
return user;
catch (SQLException e)
throw new RuntimeException(e);
finally
if (connection != null)
close(connection);


参考技术A 1.有,Eclipse插件,参考:
http://db.apache.org/derby/integrate/plugin_howto.html
2.有区别,JavaDB是轻量级DB可以内嵌入Java应用程序不需要单独部署,而MySQL是一个大型关系型数据库处理更大的数据处理要求,需要单独部署。
3.给你个官网的例子:
http://developers.sun.com/javadb/overview/product_tour/index.jsp

从外部浏览嵌入式 JavaDB 部署

【中文标题】从外部浏览嵌入式 JavaDB 部署【英文标题】:Externally browsing an Embedded JavaDB deployment 【发布时间】:2011-05-07 19:26:07 【问题描述】:

我创建并部署了一个 javadb 驱动的可移植 Swing 应用程序。 如果 javadb 数据库文件夹不存在,应用程序会按预期创建它。

现在可能需要像使用 Mysql 查询浏览器或其他工具一样浏览嵌入式数据库文件夹的时候了。我该怎么做?

【问题讨论】:

【参考方案1】:

只要您的应用程序没有运行,任何 JDBC 基本查询工具都应该能够连接到数据库。

Derby wiki 中提供了工具列表:

http://wiki.apache.org/db-derby/UsesOfDerby#GUI_Tools

【讨论】:

以上是关于JavaDB的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

内存中的 Java DB [关闭]

JavaDB - 检查数据库是不是存在

从外部浏览嵌入式 JavaDB 部署

JavaDB 出现端口连接错误。

使用 NetBeans IDE 在 Java DB 中创建自动增量键

如何使用 netbeans 将 javadb 或 hsqldb 嵌入到带有休眠的 java 应用程序中?