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就行.
    下面是个使用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);
			}
		}
	}


以上就是derby的简单操作.

你可能感兴趣的:(jvm,sql,jdbc,嵌入式,Derby)