在SQL中,描述数据库或其组成部分的数据称为元数据(区别于那些存在数据库中的实际数据)。我们可以获得三类元数据:关于数据库的元数据、关于结果集的元数据以及关于预备语句参数的元数据。第二个元数据类ResultSetMetaData则用于提供结果集的相关信息。每当通过查询得到一个结果集,我们都可以获取该结果集的列数以及每一列的名称、类型和字段宽度。
ConnectionDatabaseMetaData getMetaData()返回一个DatabaseMetaData对象,该对象封装了有关数据库连接的元数据。DatabaseMetaDataResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String types[])返回某个目录( catalog)中的所有表的描述,该目录必须符合给定的模式( schema)、表名字模式以及类型标准。(模式用于描述一组相关的表和访问权限,而目录描述的是一组相关的模式,这些概念对组织大型数据库非常重要。)catalog和schema参数可以为空,用于检索那些没有目录和模式的表。如果不想考虑目录和模式,也可以将上述参数设为null。types数组包含了所需的表类型的名称。通常表类型有TABLE、 VIEW、 SYSTEM TABLE、GLOBAL TEMPORARY、 LOCAL TEMPORARY、ALIAS和SYNONYM。如果types为null,则返回所有类型的表。返回的结果集共有5列,均为String类型。1 TABLE_CAT 表目录(可以为null)2 TABLE_SCHEM 表结构模式(可以为null)3 TABLE_NAME 表名称4 TABLE_TYPE 表类型5 REMARKS 关于表的注释int getJDBCMajorVersion()int getJDBCMinorVersion()返回建立数据库连接的JDBC驱动程序的主版本号和次版本号。例如,一个JDBC 3.0的驱动程序有一个主版本号3和一个次版本号0。int getMaxConnections()返回可同时连接到数据库的最大连接数。int getMaxStatements()返回单个数据库连接允许同时打开的最大语句数。如果对允许打开的语句数目没有限制或者不可知,则返回0。ResultSetResultSetMetaData getMetaData()返回与当前ResultSet对象中的列相关的元数据。ResultMetaDataint getColumnCount()返回当前ResultSet对象中的列数。int getColumnDisplaySize(int column)返回给定列序号的列的最大宽度。参数: column 列序号String getColumnLabel(int column)返回该列所建议的名称。参数: column 列序号String getColumnName(int column)返回指定的列序号所对应的列名。参数: column 列序号事务事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做要么全不做,是一个不可分割的工作单位。
数据库事务的四大特性(简称ACID)是:
原子性:事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
一致性:事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
隔离性:分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。
持久性:持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证。
将一组语句构建成一个事务( transaction)。当所有语句都顺利执行之后,事务可以被提交( commit)。否则,如果其中某个语句遇到错误,那么事务将被回滚,就好像没有任何命令被执行过一样。默认情况下,数据库连接处于自动提交模式( autocommit mode)。每个SQL命令一旦被执行便被提交给数据库。一旦命令被提交,就无法对它进行回滚操作。在使用事务时,需要关闭这个默认值:
con.setAutoCommit(false)执行了所有命令之后,调用commit方法。如果出现错误,请调用rollback()此时,程序将自动撤销自上次提交以来的所有命令。当事务被SQLException异常中断时,通常的办法是发起回滚操作。保存点
在使用某些驱动程序时,使用保存点( Save Point)可以更好地控制回滚操作。创建一个保存点意味着稍后只需返回到这个点,而非事务的开头。
Savepoint sp =con.setSavepoint();......if()con.rollback(sp);当不再需要保存点时,必须释放它con.releaseSavepoint(sp);批量更新
处于同一批中的容器可以是INSERT、 UPDATE和DELETE等操作,也可以是数据库定义命令,如CREATE TABLE和DROP TABLE。但是,在批量处理中添加SELECT命令会抛出异常(从概念上讲,批量处理中的SELECT语句没有意义,因为它会返回结果集,而并不更新数据库)。
statement.addBatch(sql);statement.addBatch(sql);statement.addBatch(sql);statement.addBatch(sql);int[] a = statement.executeBatch();调用executeBatch方法将为所有已提交的命令返回一个记录数的数组。为了在批量模式下正确地处理错误,必须将批量执行的操作视为单个事务。如果批量更新在执行过程中失败,那么必须将它回滚到批量操作开始之前的状态。首先,关闭自动提交模式,然后收集批量操作,执行并提交该操作,最后恢复最初的自动提交模式.。Connectionboolean getAutoCommit()void setAutoCommit(boolean b)获取将该连接中的自动提交模式,或将其设置为b。如果自动更新为true,那么所有语句将在执行结束后立刻被提交。void commit()提交自上次提交以来所有执行过的语句。void rollback()撤销自上次提交以来所有执行过的语句所产生的影响。Savepoint setSavepoint() Savepoint setSavepoint(String name) 设置一个匿名或具名的保存点。void rollback(Savepoint svpt) 回滚到给定保存点。void releaseSavepoint(Savepoint svpt) 释放给定的保存点。Savepointint getSavepointId()获取该匿名保存点的ID号。如果该保存点具有名字,则抛出一个SQLException异常。String getSavepointName()获取该保存点的名称。如果该对象为匿名保存点,则抛出一个SQLException异常。Statementvoid addBatch(String command)添加命令到当前批量命令中。int[] executeBatch()执行当前批量更新中的所有命令。返回一个记录数的数组,其中每一个元素都对应一条命令,代表受该命令影响的记录总数。
新闻热点
疑难解答