JDBC常用类和方法
2012-11-25 00:01 youxin 阅读(941) 评论(0) 编辑 收藏 举报JDBC常用类和方法
一、四种驱动程序概念
A、JDBC-ODBC Bridge
桥接器型的驱动程序,这类驱动程序的特色是必须在使用者端的计算机上事先安装好ODBC驱动程序,然后通过JDBC-ODBC的调用方法,进而通过ODBC来存取数据库。
作为JDK1.1后的一部分,是sun.jdbc.odbc包的一部分
Application---JDBC-ODBCBridge----JDBC-ODBCLibrary---ODBCDriver--Database
适用于快速的原型系统,没有提供JDBC驱动的数据库如Access
B、JDBC-Native API Bridge
也是桥接器驱动程序之一,这类驱动程序也必须先在使用者计算机上先安装好特定的驱动程序(类似ODBC),然后通过JDBC-Native API桥接器的转换,把Java API调用转换成特定驱动程序的调用方法,进而存取数据库。
利用开发商提供的本地库来直接与数据库通信。
Application---JDBCDriver----NativeDatabaselibrary----Database
比A类性能略好。
C、JDBC-middleware
这类型的驱动程序最大的好处就是省去了在使用者计算机上安装任何驱动程序的麻烦,只需在服务器端安装好middleware,而middleware会负责所有存取数据库必要的转换。
Application---JdbcDriver-----javamiddleware---JDBCDriver----Database
具有最大的灵活性,通常由那些非数据库厂商提供,是四种类型中最小的。
D、Pure JDBC driver
这类型的驱动程序是最成熟的JDBC驱动程序,不但无需在使用者计算机上安装任何额外的驱动程序,也不需要在服务器端安装任何中介程序(middleware),所有存取数据库的操作,都直接由驱动程序来完成。
Application---Jdbcdriver-----databaseengine---database
最高的性能,通过自己的本地协议直接与数据库引擎通信,具备在Internet装配的能力。
二、常用的JDBC类与方法
1、DriverManager类:
负责管理JDBC驱动程序。使用JDBC驱动程序之前,必须先将驱动程序加载并向DriverManager注册后才可以使用,同时提供方法来建立与数据库的连接。
方法:
A、Class.forName(String driver); 加载注册驱动程序
B、Static Connection getConnection(String url,String user,String password) throws SQLException;
取得对数据库的连接
C、Static Driver getDriver(String url) throws SQLExcetion;
在已经向DriverManager注册的驱动程序中寻找一个能够打开url所指定的数据库的驱动程序
2、Connection类
负责维护JSPJAVA数据库程序和数据库之间的联机。可以建立三个非常有用的类对象。
方法:
A、Statement createStatement() throws SQLException; 建立Statement类对象
Statement createStatement(int resultSetType,int resultSetConcurrency) throws SQLException;
建立Statement类对象
resultSetType值
TYPE_FORWARD_ONLY 结果集不可滚动
TYPE_SCROLL_INSENSITIVE 结果集可滚动,不反映数据库的变化
TYPE_SCROLL_SENSITIVE 结果集可滚动,反映数据库的变化
resultSetConcurrency值
CONCUR_READ_ONLY 不能用结果集更新数据
CONCUR_UPDATABLE 能用结果集更新数据
JDBC2.0中才支持滚动的结果集,而且可以对数据进行更新
B、DatabaseMetaData getMetaData() throws SQLException; 建立DatabaseMetaData类对象
C、PreparedStatement prepareStatement(String sql) throws SQLException;
建立PreparedStatement类对象
D、boolean getAutoCommit() throws SQLException 返回Connection类对象的AutoCommit状态
E、void setAutoCommit(boolean autoCommit) throws SQLException
设定Connection类对象的AutoCommit状态
F、void commit() throws SQLException确定执行对数据库新增、删除或修改记录的操作
G、void rollback() throws SQLException取消执行对数据库新增、删除或修改记录的操作
H、void close() throws SQLException结束Connection对象对数据库的联机
I、boolean isClosed() throws SQLException 测试是否已经关闭Connection类对象对数据库的联机
3、Statement类
通过Statement类所提供的方法,可以利用标准的SQL命令,对数据库直接新增、删除或修改操作
方法:
A、ResultSet executeQuery(String sql) throws SQLException 使用SELECT命令对数据库进行查询
B、int executeUpdate(String sql) throws SQLException
使用INSERTDELETEUPDATE对数据库进行新增、删除和修改操作。
C、void close() throws SQLException 结束Statement类对象对数据库的联机
4、PreparedStatement类
PreparedStatement类和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编好等待使用,当有单一的SQL指令比多次执行时,用PreparedStatement类会比Statement类有效率
方法:
A、ResultSet executeQuery() throws SQLException 使用SELECT命令对数据库进行查询
B、int executeUpdate() throws SQLException
使用INSERTDELETEUPDATE对数据库进行新增、删除和修改操作。
C、ResultSetMetaData getMetaData() throws SQLException
取得ResultSet类对象有关字段的相关信息
D、void setInt(int parameterIndex,int x) throws SQLException
设定整数类型数值给PreparedStatement类对象的IN参数
E、void setFloat(int parameterIndex,float x) throws SQLException
设定浮点数类型数值给PreparedStatement类对象的IN参数
F、void setNull(int parameterIndex,int sqlType) throws SQLException
设定NULL类型数值给PreparedStatement类对象的IN参数
G、void setString(int parameterIndex,String x) throws SQLException
设定字符串类型数值给PreparedStatement类对象的IN参数
H、void setDate(int parameterIndex,Date x) throws SQLException
设定日期类型数值给PreparedStatement类对象的IN参数
I、void setTime(int parameterIndex,Time x) throws SQLException
设定时间类型数值给PreparedStatement类对象的IN参数
5、DatabaseMetaData类
DatabaseMetaData类保存了数据库的所有特性,并且提供许多方法来取得这些信息。
方法:
A、String getDatabaseProductName() throws SQLException 取得数据库名称
B、String getDatabaseProductVersion() throws SQLException 取得数据库版本代号
C、String getDriverName() throws SQLException 取得JDBC驱动程序的名称
D、String getDriverVersion()throws SQLException 取得JDBC驱动程序的版本代号
E、String getURL() throws SQLException 取得连接数据库的JDBC URL
F、String getUserName() throws SQLException 取得登录数据库的使用者帐号
6、ResultSet类
负责存储查询数据库的结果。并提供一系列的方法对数据库进行新增、删除和修改操作。也负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。
方法:
A、boolean absolute(int row) throws SQLException移动记录指针到指定的记录
B、void beforeFirst() throws SQLException移动记录指针到第一笔记录之前
C、void afterLast() throws SQLException移动记录指针到最后一笔记录之后
D、boolean first() throws SQLException移动记录指针到第一笔记录
E、boolean last() throws SQLException移动记录指针到最后一笔记录
F、boolean next() throws SQLException移动记录指针到下一笔记录
G、boolean previous() throws SQLException移动记录指针到上一笔记录
H、void deleteRow() throws SQLException删除记录指针指向的记录
I、void moveToInsertRow() throws SQLException移动记录指针以新增一笔记录
J、void moveToCurrentRow() throws SQLException移动记录指针到被记忆的记录
K、void insertRow() throws SQLException新增一笔记录到数据库中
L、void updateRow() throws SQLException修改数据库中的一笔记录
M、void update类型(int columnIndex,类型 x) throws SQLException修改指定字段的值
N、int get类型(int columnIndex) throws SQLException取得指定字段的值
O、ResultSetMetaData getMetaData() throws SQLException 取得ResultSetMetaData类对象
7、ResultSetMetaData类
ResultSetMetaData类对象保存了所有ResultSet类对象中关于字段的信息,提供许多方法来取得这些信息。
方法:
A、int getColumnCount() throws SQLException 取得ResultSet类对象的字段个数
B、int getColumnDisplaySize() throws SQLException 取得ResultSet类对象的字段长度
C、String getColumnName(int column) throws SQLException 取得ResultSet类对象的字段名称
D、String getColumnTypeName(int column) throws SQLException 取得ResultSet类对象的字段类型名称
E、String getTableName(int column) throws SQLException 取得ResultSet类对象的字段所属数据表的名称
F、boolean isCaseSensitive(int column) throws SQLException 测试ResultSet类对象的字段是否区分大小写
G、boolean isReadOnly(int column) throws SQLException 测试ResultSet类对象的字段是否为只读
JDBC
Java Database Connectivity (JDBC)是一个标准的Java API,它由一组类和接口组成,Java应用程序开发人员使用它来访问数据库和执行SQL语句。WebLogic JDBC是JDBC规范的企业级实现,它为标准的JDBC API提供了大量的扩展
JDBC基础知识
一、采用JDBC访问数据库的基本步骤:
A.载入JDBC驱动程序
B.定义连接URL
C.建立连接
D.创建Statement对象
E.执行查询或更新
F.结果处理
G.关闭连接
二、载入JDBC驱动程序:
1.为了使代码尽可能地灵活,我们要避免对类名的引用进行硬编码(hard-coding),因此我们可以采用从Properties文件中载入驱动程序的方法,也可以使用在服务器中配置数据源(DataSource)的方法来避免在代码中硬编码
2.在开发过程中要保证CLASSPATH设定中包括驱动程序JAR文件所在的路径。在WEB服务
器上部署时要将JAR文件放在Web应用的WEB-INFlib目录下。如果多个Web应用使用相同的数据库驱动程序可以将JAR文件放置在服务器使用的公共目录%CATALINA_HOME%commonlib中
三、定义连接URL:
载入JDBC驱动程序之后,必须指定数据库服务器位置。指向数据库的URL所使用的协议是:
jdbc子协议,并且载入服务器的主机名、端口、数据库名(或引用)。如:Oracle 的连接URL
jdbcoraclethin@192.168.0.711521UMV2
jdbcoracle采用Oracle驱动程序
thin指连接服务器所采用的模式
@192.168.0.71服务器的地址
1521服务器的监听端口
UMV2数据库名
四、建立连接
1.一个数据库连接(Connection)可以通过其自身的getMetaData()来获取它的自身信息
2.默认情况下一个数据库的连接是自动提交模式的(auto-commit),也就是说每当一个SQL语句
被执行后其改变结果都会被自动提交,如果auto-commit模式被关闭,那么方法commit()必须被显式调用以提交改变结果,否则的话所有对数据库操作的结果都不会被保存
五、创建Statement对象
在同一时间下,每个Statement对象只能打开一个ResultSet对象。所以,假如有两个同样结果的结果集在交叉访问,那么这两个结果集必定为两个不同的Statement对象所创建。如果在打开一个新的结果集的时候存在一个已经打开的结果集,则这个已经存在的结果集会被隐式的关闭
六、执行查询或更新:
在Statement对象中可以执行如下的操作:
A.查询操作executeQuery(SQL语句) B.维护操作executeUpdate(SQL语句)
C.批处理操作executeBath()
七、结果处理:
1.ResultSet中行的第一列索引为1,而非0,访问ResultSet中的数据时要使用列名,而非索引
但要注意使用列名作为查询条件是大小写敏感的。
2.JDBC1.0中,我们只能在ResultSet中向前移动;在JDBC2.0中,我们可以在ResultSet中向
下(next)或向上(previous)移动,同样也可以移到特定的行(relative,absolute)
3.默认情况下ResultSet是不可更新的,且只能向前移动。下面的代码显示了如何创建一个可滚动的、对更新敏感的ResultSet
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(SELECT a, b FROM TABLE2);
rs will be scrollable, will not show changes made by others,
and will be updatable
4.ResultSet和ResultSetMetaData没有直接提供方法返回查询所返回的行数。然而,在JDBC
2.0中,可以通过调用last()方法将游标定位到ResultSet的最后一行,然后调用getRow()方
法获取当前的行号。在JDBC1.0中,确定行数的惟一方式是重复调用ResultSet的next()方法,
直到它返回false为至
八、关闭连接:
在关闭数据库连接时应该以ResultSet、Statement、Connection的顺序进行
JDBC-PreparedStatement(预备语句)
一、PreparedStatement(预备语句)的创建:
首先按照标准的格式创建参数化语句,在实际使用之前发送参数到数据库进行编译。用问号表示语句中应该为具体的值所替换的位置。每次使用预备语句时,只需要使用相应的setXxx调用,替换语句中标记出来的参数。然后就可以和常规的语句一样,使用executeQuery或 executeexecuteUpdate修改表中的数据。例如:
Connection connection = DriverManager.getConnection (url,username,password);
创建带问号的参数化语句
String template = UPDATE music SET price= WHERE id= ;
PreparedStatement statement = connection.prepareStatement (template);
float newPrices[] = getNewPrices();
int recordingIDs = getIDs();
for(int i=0; irecordingIDs.length;i++){
用setXxx代替?
statement.setFloat(1,newPrices[i]);
statement.setInt(2,recordingIDs[i]);
执行预备语句
statement.execute();}
二、使用PreparedStatement的好处:
1.依赖于服务器对预编译查询的支持,以及驱动程序处理原始查询的效率,预备语句在性能上的优势可能有很大的不同。
2.安全是预备语句的另外一个特点,我们推荐在通过HTML表单接受用户输入,然后对数据库进行更新时,一定要使用预备语句或存储过程。
3.预备语句还能够正确地处理嵌入在字符串中的引号以及处理非字符数据(比如向数据库发送序列化后的对象)
JDBC-CallableStatement(可调用语句)
一、使用CallableStatement(可调用语句)的优缺点:
1.优点:语法错误可以在编译时找出来,而非在运行期间;数据库存储过程的运行可能比常规的
SQL查询快得多;程序员只需知道输入和输出参数,不需了解表的结构。另外,由于数据库语言能够访问数据库本地的一下儿功能(序列,触发器,多重游标),因此用它来编写存储过程可能要比使用Java编程语言要简易一些。
2.缺点:存储过程的商业逻辑在数据库服务器上运行,而非客户机或Web服务器。而行业的发展趋势是尽可能多地将商业逻辑移出数据库,将它们放在 JavaBean组件(或者在大型的系统中,EnterPrise JavaBean组件)中,在Web构架上采用这种方式的主要动机是:数据库访问和网络IO常常是性能的瓶颈。
二、使用CallableStatement在JAVA中调用数据库存储过程:
1.定义对数据库过程的调用
A.无参数过程{ call procedure_name}
B. 仅有输入参数的过程:{call procedure_name(,...)}
C.有一个输出参数的过程:{ Call procedure_name}
D.既有输入参数又有输出参数的过程{=call procedure_name(,...)}
在过程的4种形式中要注意过程可能返回多个输出参数,并且参数的索引值从输出参数开始。因此前面最后例子中,第一个输入参数的索引值是2而不是1。
2.为过程准备CallableStatement
String procedure = “{ = call procedure_name(,) }”;
CallableStatement statement = connection.prepareCall(procedure);
3.提供输入参数的值
在执行存储过程之前,我们需要调用与所要设置的项以及参数的类型相对应的setXxx,替换标记出来的输入参数
Statement.setString(2,”name”);
4.注册输出参数的类型
我们必须使用registerOutParameter注册每个输出参数的JDBC类型
Statement.registerOutParameter(n,type);
5.执行这个存储过程
Statement.execute();
6.访问返回的输出参数
可以通过调用getXxx访问每个对应的输出参数
例如:
Connection connection = DriverManager.getConnection(url,username,password);
String procedure = “{ = call myProc(,)}”;
CallableStatement statement = connection.prepareCall(procedure);
statement.setString(2,×××);
statement.setFloat(3,×××);
statement.registerOutParameter(1,Types.INTEGER);
statement.execute();
int row = statement.getInt(1);
JDBC-Transation(事务处理)
一、Transation(事务处理)的概念:
在更新数据库时,默认情况下,更改是永久性写入到数据库。然而这种默认行为可以通过编写程序来关闭。在自动交付关闭的情况下,如果在更新时发生问题,则对数据库的每个更改都能够取消(或者说回退到最初的值)。如果更新成功,那么之后可以将这些更改永久性提交给数据库。这种方式也称为事务管理。
我们需要确保,要么所有的操作都发生,要么所有的操作都不发生。这就是事务管理的原则。
二、在JAVA中使用Transation(事务管理)保证数据库的完整性:
我们使用try-catch-finally块来正确地应对事务管理,首先,记录自动提交的当前状态。然后,在try块中,调用 setAutoCommit(false)并执行一系列的查询或更新。如果发生故障,则在catch块中调用rollback;如果事务成功,则在try 块的结尾调用commit。不管哪种方式,都在finally块中重置自动提交的状态。例如:
Connection connection = DriverManager.getConnection(url,username,password);
boolean autoCommit = connection.getAutoCommit();
Statement statement;
try{
connection.setAutoCommit(false); 关闭数据库的自动提交
statement = connection.createStatement();
statement.execute(…);
statement.execute(..);
…
connection.commit(); 如果所有语句执行成功则提交事务
}
catch(SQLException sqle){
connection.rollback(); 如果有异常发生则回滚所有的事务
}
finally{
if(statement!=null){statement.close();}
connection.setAutoCommit(autoCommit); 重置自动提交的状态
}
上面的代码中,从DriverManager获取连接的语句在trycatch块之外。这样除非成功获取连接,否则不会调用rollback。如果把获取连接的语句放在trycatch快之内,一旦在连接成功后发生异常,由于rollback的作用会把已经建立的连接断开。但是 getConnection方法也会抛出SQLException异常这个异常要么被外围的方法重新抛出,要么在单独的trycatch块内捕获。
JDBC的常用API
一、Connection接口:
1.createStatement():创建数据库连接
2.prepareStatement(String sql)创建预处理语句
3.prepareCall(String sql)创建可调用语句
4.getAutoCommit()获取自动提交的模式
5.setAutoCommit()设置自动提交的模式
6.commit()提交所执行的SQL语句
7.rollback()回滚所执行的SQL语句
8.getMetaData()获取一个DatabaseMetaData对象,该对象包含了有关数据库的基本信息
9.close()关闭数据库连接
10.isClose():判断数据库连接是否超时或被显示关闭
二、Statement接口:
1.execute(String sql)执行SQL语句,如果返回值是结果集则为true,否则为false
2.executeQuery(String sql)执行SQL语句,返回值为ResultSet
3.executeUpdate(String sql)执行SQL语句,返回值为所影响的行数
4.addBatch(String sql)向当前Statement对象的命令列表中添加新的批处理SQL语句
5.clearBatch()清空当前Statement对象的命令列表
6.executeBatch():执行当前Statement对象的批处理语句,返回值为每个语句所影响的函数数组
7.getConnection()返回创建了该Statement对象的Connection对象
8.getQueryTimeout()获取等待处理结果的时间
9.setQueryTimeout()设置等待处理结果的时间
三、ResultSet接口:
1.first()beforeFirst()将游标移动到ResultSet中第一条记录(的前面)
2.last()afterLast()将游标移动到ResultSet中最后一条记录(的后面)
3.absolute(int column)将游标移动到相对于第一行的指定行,负数则为相对于最后一条记录
4.relative(int rows)将游标移动到相对于当前行的第几行,正为向下,负为向上
5.next()将游标下移一行
6.previous()将游标上移一行
7.insertRow()向当前ResultSet和数据库中被插入行处插入一条记录
8.deleteRow()将当前ResultSet中的当前行和数据库中对应的记录删除
9.updateRow()用当前ResultSet中已更新的记录更新数据库中对应的记录
10.cancelUpdate()取消当前对ResultSet和数据库中所做的操作
11.findColumn(String columnName)返回当前ResultSet中与指定列名对应的索引
12.getRow()返回ResultSet中的当前行号
13.refreshRow()更新当前ResultSet中的所有记录
14.getMetaData()返回描述ResultSet的ResultSetMetaData对象
15.isAfterLast() 是否到了结尾
16.isBeforeFirst() 是否到了开头
17.isFirst()是否第一条记录
18.isLast() 是否最后一条记录
19.wasNull()检查列值是否为NULL值,如果列的类型为基本类型,且数据库中的值为0,那么
这项检查就很重要。由于数据库NULL也返回0,所以0值和数据库的NULL不能区分。如果列的类型为对象,可以简单地将返回值与null比较
20.close()关闭当前ResultSet
四、ResultSetMetaData接口:
1.getColumnCount()返回ResultSet中列的数目
2.getColumnName()返回列在数据库中的名称
3.getColumnType()返回列的SQL类型
4.isReadOnly()表示该数据项是否为只读值
5.isNullable()表示该列是否可以存储NULL